* [PATCH v8 00/20] vfs: Add support for timestamp limits
@ 2019-08-18 16:57 Deepa Dinamani
2019-08-18 16:57 ` [PATCH v8 01/20] vfs: Add file timestamp range support Deepa Dinamani
` (20 more replies)
0 siblings, 21 replies; 29+ messages in thread
From: Deepa Dinamani @ 2019-08-18 16:57 UTC (permalink / raw)
To: viro, linux-kernel
Cc: linux-fsdevel, y2038, arnd, adilger.kernel, adrian.hunter,
aivazian.tigran, al, anna.schumaker, anton, asmadeus, ccross,
ceph-devel, coda, codalist, darrick.wong, dedekind1, devel,
dsterba, dushistov, dwmw2, ericvh, gregkh, hch, hch, hirofumi,
hubcap, idryomov, jack, jaegeuk, jaharkes, jfs-discussion, jlbec,
keescook, linux-cifs, linux-ext4, linux-f2fs-devel,
linux-karma-devel, linux-mtd, linux-nfs, linux-ntfs-dev,
linux-xfs, lucho, luisbg, martin, me, mikulas, nico, phillip,
reiserfs-devel, richard, sage, salah.triki, sfrench, shaggy, tj,
tony.luck, trond.myklebust, tytso, v9fs-developer, yuchao0, zyan
The series is an update and a more complete version of the
previously posted series at
https://lore.kernel.org/linux-fsdevel/20180122020426.2988-1-deepa.kernel@gmail.com/
Thanks to Arnd Bergmann for doing a few preliminary reviews.
They helped me fix a few issues I had overlooked.
The limits (sometimes granularity also) for the filesystems updated here are according to the
following table:
File system Time type Start year Expiration year Granularity
cramfs fixed 0 0
romfs fixed 0 0
pstore ascii seconds (27 digit ascii) S64_MIN S64_MAX 1
coda INT64 S64_MIN S64_MAX 1
omfs 64-bit milliseconds 0 U64_MAX/ 1000 NSEC_PER_MSEC
befs unsigned 48-bit seconds 0 0xffffffffffff alloc_super
bfs unsigned 32-bit seconds 0 U32_MAX alloc_super
efs unsigned 32-bit seconds 0 U32_MAX alloc_super
ext2 signed 32-bit seconds S32_MIN S32_MAX alloc_super
ext3 signed 32-bit seconds S32_MIN S32_MAX alloc_super
ext4 (old) signed 32-bit seconds S32_MIN S32_MAX alloc_super
ext4 (extra) 34-bit seconds, 30-bit ns S32_MIN 0x37fffffff 1
freevxfs u32 secs/usecs 0 U32_MAX alloc_super
jffs2 unsigned 32-bit seconds 0 U32_MAX alloc_super
jfs unsigned 32-bit seconds/ns 0 U32_MAX 1
minix unsigned 32-bit seconds 0 U32_MAX alloc_super
orangefs u64 seconds 0 U64_MAX alloc_super
qnx4 unsigned 32-bit seconds 0 U32_MAX alloc_super
qnx6 unsigned 32-bit seconds 0 U32_MAX alloc_super
reiserfs unsigned 32-bit seconds 0 U32_MAX alloc_super
squashfs unsigned 32-bit seconds 0 U32_MAX alloc_super
ufs1 signed 32-bit seconds S32_MIN S32_MAX NSEC_PER_SEC
ufs2 signed 64-bit seconds/u32 ns S64_MIN S64_MAX 1
xfs signed 32-bit seconds/ns S32_MIN S32_MAX 1
ceph unsigned 32-bit second/ns 0 U32_MAX 1000
sysv unsigned 32-bit seconds 0 U32_MAX alloc_super
affs u32 day, min, ticks 1978 u32_max days NSEC_PER_SEC
nfsv2 unsigned 32-bit seconds/ns 0 U32_MAX 1
nfsv3 unsigned 32-bit seconds/ns 0 U32_MAX 1000
nfsv4 u64 seconds/u32 ns S64_MIN S64_MAX 1000
isofs u8 year since 1900 (fixable) 1900 2155 alloc_super
hpfs unsigned 32-bit seconds 1970 2106 alloc_super
fat 7-bit years, 2s resolution 1980 2107
cifs (smb) 7-bit years 1980 2107
cifs (modern) 64-bit 100ns since 1601 1601 30828
adfs 40-bit cs since 1900 1900 2248
9p (9P2000) unsigned 32-bit seconds 1970 2106
9p (9P2000.L) signed 64-bit seconds, ns 1970 S64_MAX
Granularity column filled in by the alloc_super() in the above table indicates that
the granularity is NSEC_PER_SEC.
Note that anything not mentioned above still has the default limits
S64_MIN..S64_MAX.
The patches in the series are as structured below:
1. Add vfs support to maintain the limits per filesystem.
2. Add a new timestamp_truncate() api for clamping timestamps
according to the filesystem limits.
3. Add a warning for mount syscall to indicate the impending
expiry of timestamps.
4. Modify utimes to clamp the timestamps.
5. Fill in limits for filesystems.
A test for checking file system timestamp limits has been posted
at https://www.spinics.net/lists/fstests/msg12262.html
Changes since v7:
* Dropped fat modifications from timespec_truncate patch
* Leverage timestamp_truncate function in utimes
* Added a fix for pstore ramoops timestamps
* Added ext4 warning for inodes without room for extended timestamps.
* Made mount warning more human readable
Changes since v6:
* No change in mount behavior because of expiry of timestamps.
* Included limits for more filesystems.
Changes since v5:
* Dropped y2038-specific changes
Changes since v4:
* Added documentation for boot param
Changes since v3:
* Remove redundant initializations in libfs.c
* Change early_param to __setup similar to other root mount options.
* Fix documentation warning
Changes since v2:
* Introduce early boot param override for checks.
* Drop afs patch for timestamp limits.
Changes since v1:
* return EROFS on mount errors
* fix mtime copy/paste error in utimes
Deepa Dinamani (20):
vfs: Add file timestamp range support
vfs: Add timestamp_truncate() api
timestamp_truncate: Replace users of timespec64_trunc
mount: Add mount warning for impending timestamp expiry
utimes: Clamp the timestamps before update
fs: Fill in max and min timestamps in superblock
9p: Fill min and max timestamps in sb
adfs: Fill in max and min timestamps in sb
ext4: Initialize timestamps limits
fs: nfs: Initialize filesystem timestamp ranges
fs: cifs: Initialize filesystem timestamp ranges
fs: fat: Initialize filesystem timestamp ranges
fs: affs: Initialize filesystem timestamp ranges
fs: sysv: Initialize filesystem timestamp ranges
fs: ceph: Initialize filesystem timestamp ranges
fs: orangefs: Initialize filesystem timestamp ranges
fs: hpfs: Initialize filesystem timestamp ranges
fs: omfs: Initialize filesystem timestamp ranges
pstore: fs superblock limits
isofs: Initialize filesystem timestamp ranges
fs/9p/vfs_super.c | 6 +++++-
fs/adfs/adfs.h | 13 +++++++++++++
fs/adfs/inode.c | 8 ++------
fs/adfs/super.c | 2 ++
fs/affs/amigaffs.c | 2 +-
fs/affs/amigaffs.h | 3 +++
fs/affs/inode.c | 4 ++--
fs/affs/super.c | 4 ++++
fs/attr.c | 21 ++++++++++++---------
fs/befs/linuxvfs.c | 2 ++
fs/bfs/inode.c | 2 ++
fs/ceph/super.c | 2 ++
fs/cifs/cifsfs.c | 22 ++++++++++++++++++++++
fs/cifs/netmisc.c | 14 +++++++-------
fs/coda/inode.c | 3 +++
fs/configfs/inode.c | 12 ++++++------
fs/cramfs/inode.c | 2 ++
fs/efs/super.c | 2 ++
fs/ext2/super.c | 2 ++
fs/ext4/ext4.h | 10 +++++++++-
fs/ext4/super.c | 17 +++++++++++++++--
fs/f2fs/file.c | 21 ++++++++++++---------
fs/fat/inode.c | 12 ++++++++++++
fs/freevxfs/vxfs_super.c | 2 ++
fs/hpfs/hpfs_fn.h | 6 ++----
fs/hpfs/super.c | 2 ++
fs/inode.c | 33 ++++++++++++++++++++++++++++++++-
fs/isofs/inode.c | 7 +++++++
fs/jffs2/fs.c | 3 +++
fs/jfs/super.c | 2 ++
fs/kernfs/inode.c | 7 +++----
fs/minix/inode.c | 2 ++
fs/namespace.c | 33 ++++++++++++++++++++++++++++++++-
fs/nfs/super.c | 20 +++++++++++++++++++-
fs/ntfs/inode.c | 21 ++++++++++++---------
fs/omfs/inode.c | 4 ++++
fs/orangefs/super.c | 2 ++
fs/pstore/ram.c | 2 ++
fs/qnx4/inode.c | 2 ++
fs/qnx6/inode.c | 2 ++
fs/reiserfs/super.c | 3 +++
fs/romfs/super.c | 2 ++
fs/squashfs/super.c | 2 ++
fs/super.c | 2 ++
fs/sysv/super.c | 5 ++++-
fs/ubifs/file.c | 21 ++++++++++++---------
fs/ufs/super.c | 7 +++++++
fs/utimes.c | 6 ++----
fs/xfs/xfs_super.c | 2 ++
include/linux/fs.h | 5 +++++
include/linux/time64.h | 2 ++
51 files changed, 315 insertions(+), 78 deletions(-)
--
2.17.1
Cc: adilger.kernel@dilger.ca
Cc: adrian.hunter@intel.com
Cc: aivazian.tigran@gmail.com
Cc: al@alarsen.net
Cc: anna.schumaker@netapp.com
Cc: anton@enomsg.org
Cc: asmadeus@codewreck.org
Cc: ccross@android.com
Cc: ceph-devel@vger.kernel.org
Cc: coda@cs.cmu.edu
Cc: codalist@coda.cs.cmu.edu
Cc: darrick.wong@oracle.com
Cc: dedekind1@gmail.com
Cc: devel@lists.orangefs.org
Cc: dsterba@suse.com
Cc: dushistov@mail.ru
Cc: dwmw2@infradead.org
Cc: ericvh@gmail.com
Cc: gregkh@linuxfoundation.org
Cc: hch@infradead.org
Cc: hch@lst.de
Cc: hirofumi@mail.parknet.co.jp
Cc: hubcap@omnibond.com
Cc: idryomov@gmail.com
Cc: jack@suse.com
Cc: jaegeuk@kernel.org
Cc: jaharkes@cs.cmu.edu
Cc: jfs-discussion@lists.sourceforge.net
Cc: jlbec@evilplan.org
Cc: keescook@chromium.org
Cc: linux-cifs@vger.kernel.org
Cc: linux-ext4@vger.kernel.org
Cc: linux-f2fs-devel@lists.sourceforge.net
Cc: linux-karma-devel@lists.sourceforge.net
Cc: linux-mtd@lists.infradead.org
Cc: linux-nfs@vger.kernel.org
Cc: linux-ntfs-dev@lists.sourceforge.net
Cc: linux-xfs@vger.kernel.org
Cc: lucho@ionkov.net
Cc: luisbg@kernel.org
Cc: martin@omnibond.com
Cc: me@bobcopeland.com
Cc: mikulas@artax.karlin.mff.cuni.cz
Cc: nico@fluxnic.net
Cc: phillip@squashfs.org.uk
Cc: reiserfs-devel@vger.kernel.org
Cc: richard@nod.at
Cc: sage@redhat.com
Cc: salah.triki@gmail.com
Cc: sfrench@samba.org
Cc: shaggy@kernel.org
Cc: tj@kernel.org
Cc: tony.luck@intel.com
Cc: trond.myklebust@hammerspace.com
Cc: tytso@mit.edu
Cc: v9fs-developer@lists.sourceforge.net
Cc: yuchao0@huawei.com
Cc: zyan@redhat.com
^ permalink raw reply [flat|nested] 29+ messages in thread
* [PATCH v8 01/20] vfs: Add file timestamp range support
2019-08-18 16:57 [PATCH v8 00/20] vfs: Add support for timestamp limits Deepa Dinamani
@ 2019-08-18 16:57 ` Deepa Dinamani
2019-08-18 16:57 ` [PATCH v8 02/20] vfs: Add timestamp_truncate() api Deepa Dinamani
` (19 subsequent siblings)
20 siblings, 0 replies; 29+ messages in thread
From: Deepa Dinamani @ 2019-08-18 16:57 UTC (permalink / raw)
To: viro, linux-kernel; +Cc: linux-fsdevel, y2038, arnd
Add fields to the superblock to track the min and max
timestamps supported by filesystems.
Initially, when a superblock is allocated, initialize
it to the max and min values the fields can hold.
Individual filesystems override these to match their
actual limits.
Pseudo filesystems are assumed to always support the
min and max allowable values for the fields.
Signed-off-by: Deepa Dinamani <deepa.kernel@gmail.com>
---
fs/super.c | 2 ++
include/linux/fs.h | 3 +++
include/linux/time64.h | 2 ++
3 files changed, 7 insertions(+)
diff --git a/fs/super.c b/fs/super.c
index 36cb5aaf6f08..620c1911bb36 100644
--- a/fs/super.c
+++ b/fs/super.c
@@ -258,6 +258,8 @@ static struct super_block *alloc_super(struct file_system_type *type, int flags,
s->s_maxbytes = MAX_NON_LFS;
s->s_op = &default_op;
s->s_time_gran = 1000000000;
+ s->s_time_min = TIME64_MIN;
+ s->s_time_max = TIME64_MAX;
s->cleancache_poolid = CLEANCACHE_NO_POOL;
s->s_shrink.seeks = DEFAULT_SEEKS;
diff --git a/include/linux/fs.h b/include/linux/fs.h
index d97d74f35eb3..93c440d22547 100644
--- a/include/linux/fs.h
+++ b/include/linux/fs.h
@@ -1463,6 +1463,9 @@ struct super_block {
/* Granularity of c/m/atime in ns (cannot be worse than a second) */
u32 s_time_gran;
+ /* Time limits for c/m/atime in seconds */
+ time64_t s_time_min;
+ time64_t s_time_max;
#ifdef CONFIG_FSNOTIFY
__u32 s_fsnotify_mask;
struct fsnotify_mark_connector __rcu *s_fsnotify_marks;
diff --git a/include/linux/time64.h b/include/linux/time64.h
index a620ee610b9f..19125489ae94 100644
--- a/include/linux/time64.h
+++ b/include/linux/time64.h
@@ -30,6 +30,8 @@ struct itimerspec64 {
/* Located here for timespec[64]_valid_strict */
#define TIME64_MAX ((s64)~((u64)1 << 63))
+#define TIME64_MIN (-TIME64_MAX - 1)
+
#define KTIME_MAX ((s64)~((u64)1 << 63))
#define KTIME_SEC_MAX (KTIME_MAX / NSEC_PER_SEC)
--
2.17.1
^ permalink raw reply related [flat|nested] 29+ messages in thread
* [PATCH v8 02/20] vfs: Add timestamp_truncate() api
2019-08-18 16:57 [PATCH v8 00/20] vfs: Add support for timestamp limits Deepa Dinamani
2019-08-18 16:57 ` [PATCH v8 01/20] vfs: Add file timestamp range support Deepa Dinamani
@ 2019-08-18 16:57 ` Deepa Dinamani
2019-08-18 16:58 ` [PATCH v8 03/20] timestamp_truncate: Replace users of timespec64_trunc Deepa Dinamani
` (18 subsequent siblings)
20 siblings, 0 replies; 29+ messages in thread
From: Deepa Dinamani @ 2019-08-18 16:57 UTC (permalink / raw)
To: viro, linux-kernel; +Cc: linux-fsdevel, y2038, arnd
timespec_trunc() function is used to truncate a
filesystem timestamp to the right granularity.
But, the function does not clamp tv_sec part of the
timestamps according to the filesystem timestamp limits.
The replacement api: timestamp_truncate() also alters the
signature of the function to accommodate filesystem
timestamp clamping according to flesystem limits.
Note that the tv_nsec part is set to 0 if tv_sec is not within
the range supported for the filesystem.
Signed-off-by: Deepa Dinamani <deepa.kernel@gmail.com>
---
fs/inode.c | 33 ++++++++++++++++++++++++++++++++-
include/linux/fs.h | 2 ++
2 files changed, 34 insertions(+), 1 deletion(-)
diff --git a/fs/inode.c b/fs/inode.c
index ef33fdf0105f..fef457a42882 100644
--- a/fs/inode.c
+++ b/fs/inode.c
@@ -2169,6 +2169,37 @@ struct timespec64 timespec64_trunc(struct timespec64 t, unsigned gran)
}
EXPORT_SYMBOL(timespec64_trunc);
+/**
+ * timestamp_truncate - Truncate timespec to a granularity
+ * @t: Timespec
+ * @inode: inode being updated
+ *
+ * Truncate a timespec to the granularity supported by the fs
+ * containing the inode. Always rounds down. gran must
+ * not be 0 nor greater than a second (NSEC_PER_SEC, or 10^9 ns).
+ */
+struct timespec64 timestamp_truncate(struct timespec64 t, struct inode *inode)
+{
+ struct super_block *sb = inode->i_sb;
+ unsigned int gran = sb->s_time_gran;
+
+ t.tv_sec = clamp(t.tv_sec, sb->s_time_min, sb->s_time_max);
+ if (unlikely(t.tv_sec == sb->s_time_max || t.tv_sec == sb->s_time_min))
+ t.tv_nsec = 0;
+
+ /* Avoid division in the common cases 1 ns and 1 s. */
+ if (gran == 1)
+ ; /* nothing */
+ else if (gran == NSEC_PER_SEC)
+ t.tv_nsec = 0;
+ else if (gran > 1 && gran < NSEC_PER_SEC)
+ t.tv_nsec -= t.tv_nsec % gran;
+ else
+ WARN(1, "invalid file time granularity: %u", gran);
+ return t;
+}
+EXPORT_SYMBOL(timestamp_truncate);
+
/**
* current_time - Return FS time
* @inode: inode.
@@ -2190,7 +2221,7 @@ struct timespec64 current_time(struct inode *inode)
return now;
}
- return timespec64_trunc(now, inode->i_sb->s_time_gran);
+ return timestamp_truncate(now, inode);
}
EXPORT_SYMBOL(current_time);
diff --git a/include/linux/fs.h b/include/linux/fs.h
index 93c440d22547..1170d8260aa2 100644
--- a/include/linux/fs.h
+++ b/include/linux/fs.h
@@ -737,6 +737,8 @@ struct inode {
void *i_private; /* fs or device private pointer */
} __randomize_layout;
+struct timespec64 timestamp_truncate(struct timespec64 t, struct inode *inode);
+
static inline unsigned int i_blocksize(const struct inode *node)
{
return (1 << node->i_blkbits);
--
2.17.1
^ permalink raw reply related [flat|nested] 29+ messages in thread
* [PATCH v8 03/20] timestamp_truncate: Replace users of timespec64_trunc
2019-08-18 16:57 [PATCH v8 00/20] vfs: Add support for timestamp limits Deepa Dinamani
2019-08-18 16:57 ` [PATCH v8 01/20] vfs: Add file timestamp range support Deepa Dinamani
2019-08-18 16:57 ` [PATCH v8 02/20] vfs: Add timestamp_truncate() api Deepa Dinamani
@ 2019-08-18 16:58 ` Deepa Dinamani
2019-08-18 18:34 ` Greg KH
2019-08-18 16:58 ` [PATCH v8 04/20] mount: Add mount warning for impending timestamp expiry Deepa Dinamani
` (17 subsequent siblings)
20 siblings, 1 reply; 29+ messages in thread
From: Deepa Dinamani @ 2019-08-18 16:58 UTC (permalink / raw)
To: viro, linux-kernel
Cc: linux-fsdevel, y2038, arnd, adrian.hunter, dedekind1, gregkh,
hch, jaegeuk, jlbec, richard, tj, yuchao0, linux-f2fs-devel,
linux-ntfs-dev, linux-mtd
Update the inode timestamp updates to use timestamp_truncate()
instead of timespec64_trunc().
The change was mostly generated by the following coccinelle
script.
virtual context
virtual patch
@r1 depends on patch forall@
struct inode *inode;
identifier i_xtime =~ "^i_[acm]time$";
expression e;
@@
inode->i_xtime =
- timespec64_trunc(
+ timestamp_truncate(
...,
- e);
+ inode);
Signed-off-by: Deepa Dinamani <deepa.kernel@gmail.com>
Cc: adrian.hunter@intel.com
Cc: dedekind1@gmail.com
Cc: gregkh@linuxfoundation.org
Cc: hch@lst.de
Cc: jaegeuk@kernel.org
Cc: jlbec@evilplan.org
Cc: richard@nod.at
Cc: tj@kernel.org
Cc: yuchao0@huawei.com
Cc: linux-f2fs-devel@lists.sourceforge.net
Cc: linux-ntfs-dev@lists.sourceforge.net
Cc: linux-mtd@lists.infradead.org
---
fs/attr.c | 21 ++++++++++++---------
fs/configfs/inode.c | 12 ++++++------
fs/f2fs/file.c | 21 ++++++++++++---------
fs/kernfs/inode.c | 7 +++----
fs/ntfs/inode.c | 21 ++++++++++++---------
fs/ubifs/file.c | 21 ++++++++++++---------
6 files changed, 57 insertions(+), 46 deletions(-)
diff --git a/fs/attr.c b/fs/attr.c
index 1fcfdcc5b367..97b60ad7f419 100644
--- a/fs/attr.c
+++ b/fs/attr.c
@@ -183,15 +183,18 @@ void setattr_copy(struct inode *inode, const struct iattr *attr)
inode->i_uid = attr->ia_uid;
if (ia_valid & ATTR_GID)
inode->i_gid = attr->ia_gid;
- if (ia_valid & ATTR_ATIME)
- inode->i_atime = timespec64_trunc(attr->ia_atime,
- inode->i_sb->s_time_gran);
- if (ia_valid & ATTR_MTIME)
- inode->i_mtime = timespec64_trunc(attr->ia_mtime,
- inode->i_sb->s_time_gran);
- if (ia_valid & ATTR_CTIME)
- inode->i_ctime = timespec64_trunc(attr->ia_ctime,
- inode->i_sb->s_time_gran);
+ if (ia_valid & ATTR_ATIME) {
+ inode->i_atime = timestamp_truncate(attr->ia_atime,
+ inode);
+ }
+ if (ia_valid & ATTR_MTIME) {
+ inode->i_mtime = timestamp_truncate(attr->ia_mtime,
+ inode);
+ }
+ if (ia_valid & ATTR_CTIME) {
+ inode->i_ctime = timestamp_truncate(attr->ia_ctime,
+ inode);
+ }
if (ia_valid & ATTR_MODE) {
umode_t mode = attr->ia_mode;
diff --git a/fs/configfs/inode.c b/fs/configfs/inode.c
index ab0284321912..884dcf06cfbe 100644
--- a/fs/configfs/inode.c
+++ b/fs/configfs/inode.c
@@ -76,14 +76,14 @@ int configfs_setattr(struct dentry * dentry, struct iattr * iattr)
if (ia_valid & ATTR_GID)
sd_iattr->ia_gid = iattr->ia_gid;
if (ia_valid & ATTR_ATIME)
- sd_iattr->ia_atime = timespec64_trunc(iattr->ia_atime,
- inode->i_sb->s_time_gran);
+ sd_iattr->ia_atime = timestamp_truncate(iattr->ia_atime,
+ inode);
if (ia_valid & ATTR_MTIME)
- sd_iattr->ia_mtime = timespec64_trunc(iattr->ia_mtime,
- inode->i_sb->s_time_gran);
+ sd_iattr->ia_mtime = timestamp_truncate(iattr->ia_mtime,
+ inode);
if (ia_valid & ATTR_CTIME)
- sd_iattr->ia_ctime = timespec64_trunc(iattr->ia_ctime,
- inode->i_sb->s_time_gran);
+ sd_iattr->ia_ctime = timestamp_truncate(iattr->ia_ctime,
+ inode);
if (ia_valid & ATTR_MODE) {
umode_t mode = iattr->ia_mode;
diff --git a/fs/f2fs/file.c b/fs/f2fs/file.c
index 89a9ee22296d..af8cdd345f3d 100644
--- a/fs/f2fs/file.c
+++ b/fs/f2fs/file.c
@@ -749,15 +749,18 @@ static void __setattr_copy(struct inode *inode, const struct iattr *attr)
inode->i_uid = attr->ia_uid;
if (ia_valid & ATTR_GID)
inode->i_gid = attr->ia_gid;
- if (ia_valid & ATTR_ATIME)
- inode->i_atime = timespec64_trunc(attr->ia_atime,
- inode->i_sb->s_time_gran);
- if (ia_valid & ATTR_MTIME)
- inode->i_mtime = timespec64_trunc(attr->ia_mtime,
- inode->i_sb->s_time_gran);
- if (ia_valid & ATTR_CTIME)
- inode->i_ctime = timespec64_trunc(attr->ia_ctime,
- inode->i_sb->s_time_gran);
+ if (ia_valid & ATTR_ATIME) {
+ inode->i_atime = timestamp_truncate(attr->ia_atime,
+ inode);
+ }
+ if (ia_valid & ATTR_MTIME) {
+ inode->i_mtime = timestamp_truncate(attr->ia_mtime,
+ inode);
+ }
+ if (ia_valid & ATTR_CTIME) {
+ inode->i_ctime = timestamp_truncate(attr->ia_ctime,
+ inode);
+ }
if (ia_valid & ATTR_MODE) {
umode_t mode = attr->ia_mode;
diff --git a/fs/kernfs/inode.c b/fs/kernfs/inode.c
index f3f3984cce80..f3eaa8869f42 100644
--- a/fs/kernfs/inode.c
+++ b/fs/kernfs/inode.c
@@ -158,12 +158,11 @@ static inline void set_default_inode_attr(struct inode *inode, umode_t mode)
static inline void set_inode_attr(struct inode *inode,
struct kernfs_iattrs *attrs)
{
- struct super_block *sb = inode->i_sb;
inode->i_uid = attrs->ia_uid;
inode->i_gid = attrs->ia_gid;
- inode->i_atime = timespec64_trunc(attrs->ia_atime, sb->s_time_gran);
- inode->i_mtime = timespec64_trunc(attrs->ia_mtime, sb->s_time_gran);
- inode->i_ctime = timespec64_trunc(attrs->ia_ctime, sb->s_time_gran);
+ inode->i_atime = timestamp_truncate(attrs->ia_atime, inode);
+ inode->i_mtime = timestamp_truncate(attrs->ia_mtime, inode);
+ inode->i_ctime = timestamp_truncate(attrs->ia_ctime, inode);
}
static void kernfs_refresh_inode(struct kernfs_node *kn, struct inode *inode)
diff --git a/fs/ntfs/inode.c b/fs/ntfs/inode.c
index 8baa34baf548..6c7388430ad3 100644
--- a/fs/ntfs/inode.c
+++ b/fs/ntfs/inode.c
@@ -2899,15 +2899,18 @@ int ntfs_setattr(struct dentry *dentry, struct iattr *attr)
ia_valid |= ATTR_MTIME | ATTR_CTIME;
}
}
- if (ia_valid & ATTR_ATIME)
- vi->i_atime = timespec64_trunc(attr->ia_atime,
- vi->i_sb->s_time_gran);
- if (ia_valid & ATTR_MTIME)
- vi->i_mtime = timespec64_trunc(attr->ia_mtime,
- vi->i_sb->s_time_gran);
- if (ia_valid & ATTR_CTIME)
- vi->i_ctime = timespec64_trunc(attr->ia_ctime,
- vi->i_sb->s_time_gran);
+ if (ia_valid & ATTR_ATIME) {
+ vi->i_atime = timestamp_truncate(attr->ia_atime,
+ vi);
+ }
+ if (ia_valid & ATTR_MTIME) {
+ vi->i_mtime = timestamp_truncate(attr->ia_mtime,
+ vi);
+ }
+ if (ia_valid & ATTR_CTIME) {
+ vi->i_ctime = timestamp_truncate(attr->ia_ctime,
+ vi);
+ }
mark_inode_dirty(vi);
out:
return err;
diff --git a/fs/ubifs/file.c b/fs/ubifs/file.c
index 400970d740bb..cd52585c8f4f 100644
--- a/fs/ubifs/file.c
+++ b/fs/ubifs/file.c
@@ -1078,15 +1078,18 @@ static void do_attr_changes(struct inode *inode, const struct iattr *attr)
inode->i_uid = attr->ia_uid;
if (attr->ia_valid & ATTR_GID)
inode->i_gid = attr->ia_gid;
- if (attr->ia_valid & ATTR_ATIME)
- inode->i_atime = timespec64_trunc(attr->ia_atime,
- inode->i_sb->s_time_gran);
- if (attr->ia_valid & ATTR_MTIME)
- inode->i_mtime = timespec64_trunc(attr->ia_mtime,
- inode->i_sb->s_time_gran);
- if (attr->ia_valid & ATTR_CTIME)
- inode->i_ctime = timespec64_trunc(attr->ia_ctime,
- inode->i_sb->s_time_gran);
+ if (attr->ia_valid & ATTR_ATIME) {
+ inode->i_atime = timestamp_truncate(attr->ia_atime,
+ inode);
+ }
+ if (attr->ia_valid & ATTR_MTIME) {
+ inode->i_mtime = timestamp_truncate(attr->ia_mtime,
+ inode);
+ }
+ if (attr->ia_valid & ATTR_CTIME) {
+ inode->i_ctime = timestamp_truncate(attr->ia_ctime,
+ inode);
+ }
if (attr->ia_valid & ATTR_MODE) {
umode_t mode = attr->ia_mode;
--
2.17.1
^ permalink raw reply related [flat|nested] 29+ messages in thread
* [PATCH v8 04/20] mount: Add mount warning for impending timestamp expiry
2019-08-18 16:57 [PATCH v8 00/20] vfs: Add support for timestamp limits Deepa Dinamani
` (2 preceding siblings ...)
2019-08-18 16:58 ` [PATCH v8 03/20] timestamp_truncate: Replace users of timespec64_trunc Deepa Dinamani
@ 2019-08-18 16:58 ` Deepa Dinamani
2019-08-18 16:58 ` [PATCH v8 05/20] utimes: Clamp the timestamps before update Deepa Dinamani
` (16 subsequent siblings)
20 siblings, 0 replies; 29+ messages in thread
From: Deepa Dinamani @ 2019-08-18 16:58 UTC (permalink / raw)
To: viro, linux-kernel; +Cc: linux-fsdevel, y2038, arnd
The warning reuses the uptime max of 30 years used by
settimeofday().
Note that the warning is only emitted for writable filesystem mounts
through the mount syscall. Automounts do not have the same warning.
Print out the warning in human readable format using the struct tm.
After discussion with Arnd Bergmann, we chose to print only the year number.
The raw s_time_max is also displayed, and the user can easily decode
it e.g. "date -u -d @$((0x7fffffff))". We did not want to consolidate
struct rtc_tm and struct tm just to print the date using a format specifier
as part of this series.
Given that the rtc_tm is not compiled on all architectures, this is not a
trivial patch. This can be added in the future.
Signed-off-by: Deepa Dinamani <deepa.kernel@gmail.com>
---
fs/namespace.c | 33 ++++++++++++++++++++++++++++++++-
1 file changed, 32 insertions(+), 1 deletion(-)
diff --git a/fs/namespace.c b/fs/namespace.c
index bfcb4e341257..7fcf289593c5 100644
--- a/fs/namespace.c
+++ b/fs/namespace.c
@@ -2468,6 +2468,26 @@ static void set_mount_attributes(struct mount *mnt, unsigned int mnt_flags)
unlock_mount_hash();
}
+static void mnt_warn_timestamp_expiry(struct path *mountpoint, struct vfsmount *mnt)
+{
+ struct super_block *sb = mnt->mnt_sb;
+
+ if (!__mnt_is_readonly(mnt) &&
+ (ktime_get_real_seconds() + TIME_UPTIME_SEC_MAX > sb->s_time_max)) {
+ char *buf = (char *)__get_free_page(GFP_KERNEL);
+ char *mntpath = buf ? d_path(mountpoint, buf, PAGE_SIZE) : ERR_PTR(-ENOMEM);
+ struct tm tm;
+
+ time64_to_tm(sb->s_time_max, 0, &tm);
+
+ pr_warn("Mounted %s file system at %s supports timestamps until %04ld (0x%llx)\n",
+ sb->s_type->name, mntpath,
+ tm.tm_year+1900, (unsigned long long)sb->s_time_max);
+
+ free_page((unsigned long)buf);
+ }
+}
+
/*
* Handle reconfiguration of the mountpoint only without alteration of the
* superblock it refers to. This is triggered by specifying MS_REMOUNT|MS_BIND
@@ -2493,6 +2513,9 @@ static int do_reconfigure_mnt(struct path *path, unsigned int mnt_flags)
if (ret == 0)
set_mount_attributes(mnt, mnt_flags);
up_write(&sb->s_umount);
+
+ mnt_warn_timestamp_expiry(path, &mnt->mnt);
+
return ret;
}
@@ -2533,6 +2556,9 @@ static int do_remount(struct path *path, int ms_flags, int sb_flags,
}
up_write(&sb->s_umount);
}
+
+ mnt_warn_timestamp_expiry(path, &mnt->mnt);
+
put_fs_context(fc);
return err;
}
@@ -2741,8 +2767,13 @@ static int do_new_mount_fc(struct fs_context *fc, struct path *mountpoint,
return PTR_ERR(mnt);
error = do_add_mount(real_mount(mnt), mountpoint, mnt_flags);
- if (error < 0)
+ if (error < 0) {
mntput(mnt);
+ return error;
+ }
+
+ mnt_warn_timestamp_expiry(mountpoint, mnt);
+
return error;
}
--
2.17.1
^ permalink raw reply related [flat|nested] 29+ messages in thread
* [PATCH v8 05/20] utimes: Clamp the timestamps before update
2019-08-18 16:57 [PATCH v8 00/20] vfs: Add support for timestamp limits Deepa Dinamani
` (3 preceding siblings ...)
2019-08-18 16:58 ` [PATCH v8 04/20] mount: Add mount warning for impending timestamp expiry Deepa Dinamani
@ 2019-08-18 16:58 ` Deepa Dinamani
2019-08-18 16:58 ` [PATCH v8 06/20] fs: Fill in max and min timestamps in superblock Deepa Dinamani
` (15 subsequent siblings)
20 siblings, 0 replies; 29+ messages in thread
From: Deepa Dinamani @ 2019-08-18 16:58 UTC (permalink / raw)
To: viro, linux-kernel; +Cc: linux-fsdevel, y2038, arnd
POSIX is ambiguous on the behavior of timestamps for
futimens, utimensat and utimes. Whether to return an
error or silently clamp a timestamp beyond the range
supported by the underlying filesystems is not clear.
POSIX.1 section for futimens, utimensat and utimes says:
(http://pubs.opengroup.org/onlinepubs/9699919799/functions/futimens.html)
The file's relevant timestamp shall be set to the greatest
value supported by the file system that is not greater
than the specified time.
If the tv_nsec field of a timespec structure has the special
value UTIME_NOW, the file's relevant timestamp shall be set
to the greatest value supported by the file system that is
not greater than the current time.
[EINVAL]
A new file timestamp would be a value whose tv_sec
component is not a value supported by the file system.
The patch chooses to clamp the timestamps according to the
filesystem timestamp ranges and does not return an error.
This is in line with the behavior of utime syscall also
since the POSIX page(http://pubs.opengroup.org/onlinepubs/009695399/functions/utime.html)
for utime does not mention returning an error or clamping like above.
Same for utimes http://pubs.opengroup.org/onlinepubs/009695399/functions/utimes.html
Signed-off-by: Deepa Dinamani <deepa.kernel@gmail.com>
---
fs/utimes.c | 6 ++----
1 file changed, 2 insertions(+), 4 deletions(-)
diff --git a/fs/utimes.c b/fs/utimes.c
index 350c9c16ace1..1ba3f7883870 100644
--- a/fs/utimes.c
+++ b/fs/utimes.c
@@ -36,16 +36,14 @@ static int utimes_common(const struct path *path, struct timespec64 *times)
if (times[0].tv_nsec == UTIME_OMIT)
newattrs.ia_valid &= ~ATTR_ATIME;
else if (times[0].tv_nsec != UTIME_NOW) {
- newattrs.ia_atime.tv_sec = times[0].tv_sec;
- newattrs.ia_atime.tv_nsec = times[0].tv_nsec;
+ newattrs.ia_atime = timestamp_truncate(times[0], inode);
newattrs.ia_valid |= ATTR_ATIME_SET;
}
if (times[1].tv_nsec == UTIME_OMIT)
newattrs.ia_valid &= ~ATTR_MTIME;
else if (times[1].tv_nsec != UTIME_NOW) {
- newattrs.ia_mtime.tv_sec = times[1].tv_sec;
- newattrs.ia_mtime.tv_nsec = times[1].tv_nsec;
+ newattrs.ia_mtime = timestamp_truncate(times[1], inode);
newattrs.ia_valid |= ATTR_MTIME_SET;
}
/*
--
2.17.1
^ permalink raw reply related [flat|nested] 29+ messages in thread
* [PATCH v8 06/20] fs: Fill in max and min timestamps in superblock
2019-08-18 16:57 [PATCH v8 00/20] vfs: Add support for timestamp limits Deepa Dinamani
` (4 preceding siblings ...)
2019-08-18 16:58 ` [PATCH v8 05/20] utimes: Clamp the timestamps before update Deepa Dinamani
@ 2019-08-18 16:58 ` Deepa Dinamani
2019-08-20 11:28 ` Anders Larsen
[not found] ` <CAK+_RLmK0Vy79giAZnUCmmivvRT+GLZXyiMqBoFB0_Ed1W8BkA@mail.gmail.com>
2019-08-18 16:58 ` [PATCH v8 07/20] 9p: Fill min and max timestamps in sb Deepa Dinamani
` (14 subsequent siblings)
20 siblings, 2 replies; 29+ messages in thread
From: Deepa Dinamani @ 2019-08-18 16:58 UTC (permalink / raw)
To: viro, linux-kernel
Cc: linux-fsdevel, y2038, arnd, aivazian.tigran, al, coda,
darrick.wong, dushistov, dwmw2, hch, jack, jaharkes, luisbg,
nico, phillip, richard, salah.triki, shaggy, linux-xfs, codalist,
linux-ext4, linux-mtd, jfs-discussion, reiserfs-devel
Fill in the appropriate limits to avoid inconsistencies
in the vfs cached inode times when timestamps are
outside the permitted range.
Even though some filesystems are read-only, fill in the
timestamps to reflect the on-disk representation.
Signed-off-by: Deepa Dinamani <deepa.kernel@gmail.com>
Reviewed-by: Darrick J. Wong <darrick.wong@oracle.com>
Cc: aivazian.tigran@gmail.com
Cc: al@alarsen.net
Cc: coda@cs.cmu.edu
Cc: darrick.wong@oracle.com
Cc: dushistov@mail.ru
Cc: dwmw2@infradead.org
Cc: hch@infradead.org
Cc: jack@suse.com
Cc: jaharkes@cs.cmu.edu
Cc: luisbg@kernel.org
Cc: nico@fluxnic.net
Cc: phillip@squashfs.org.uk
Cc: richard@nod.at
Cc: salah.triki@gmail.com
Cc: shaggy@kernel.org
Cc: linux-xfs@vger.kernel.org
Cc: codalist@coda.cs.cmu.edu
Cc: linux-ext4@vger.kernel.org
Cc: linux-mtd@lists.infradead.org
Cc: jfs-discussion@lists.sourceforge.net
Cc: reiserfs-devel@vger.kernel.org
---
fs/befs/linuxvfs.c | 2 ++
fs/bfs/inode.c | 2 ++
fs/coda/inode.c | 3 +++
fs/cramfs/inode.c | 2 ++
fs/efs/super.c | 2 ++
fs/ext2/super.c | 2 ++
fs/freevxfs/vxfs_super.c | 2 ++
fs/jffs2/fs.c | 3 +++
fs/jfs/super.c | 2 ++
fs/minix/inode.c | 2 ++
fs/qnx4/inode.c | 2 ++
fs/qnx6/inode.c | 2 ++
fs/reiserfs/super.c | 3 +++
fs/romfs/super.c | 2 ++
fs/squashfs/super.c | 2 ++
fs/ufs/super.c | 7 +++++++
fs/xfs/xfs_super.c | 2 ++
17 files changed, 42 insertions(+)
diff --git a/fs/befs/linuxvfs.c b/fs/befs/linuxvfs.c
index 462d096ff3e9..64cdf4d8e424 100644
--- a/fs/befs/linuxvfs.c
+++ b/fs/befs/linuxvfs.c
@@ -893,6 +893,8 @@ befs_fill_super(struct super_block *sb, void *data, int silent)
sb_set_blocksize(sb, (ulong) befs_sb->block_size);
sb->s_op = &befs_sops;
sb->s_export_op = &befs_export_operations;
+ sb->s_time_min = 0;
+ sb->s_time_max = 0xffffffffffffll;
root = befs_iget(sb, iaddr2blockno(sb, &(befs_sb->root_dir)));
if (IS_ERR(root)) {
ret = PTR_ERR(root);
diff --git a/fs/bfs/inode.c b/fs/bfs/inode.c
index 5e97bed073d7..f8ce1368218b 100644
--- a/fs/bfs/inode.c
+++ b/fs/bfs/inode.c
@@ -324,6 +324,8 @@ static int bfs_fill_super(struct super_block *s, void *data, int silent)
return -ENOMEM;
mutex_init(&info->bfs_lock);
s->s_fs_info = info;
+ s->s_time_min = 0;
+ s->s_time_max = U32_MAX;
sb_set_blocksize(s, BFS_BSIZE);
diff --git a/fs/coda/inode.c b/fs/coda/inode.c
index 59a9a29ade0a..e07b5f2ceccc 100644
--- a/fs/coda/inode.c
+++ b/fs/coda/inode.c
@@ -223,6 +223,9 @@ static int coda_fill_super(struct super_block *sb, struct fs_context *fc)
sb->s_magic = CODA_SUPER_MAGIC;
sb->s_op = &coda_super_operations;
sb->s_d_op = &coda_dentry_operations;
+ sb->s_time_gran = 1;
+ sb->s_time_min = S64_MIN;
+ sb->s_time_max = S64_MAX;
error = super_setup_bdi(sb);
if (error)
diff --git a/fs/cramfs/inode.c b/fs/cramfs/inode.c
index 2ee89a353d64..c304ae8357ef 100644
--- a/fs/cramfs/inode.c
+++ b/fs/cramfs/inode.c
@@ -599,6 +599,8 @@ static int cramfs_finalize_super(struct super_block *sb,
/* Set it all up.. */
sb->s_flags |= SB_RDONLY;
+ sb->s_time_min = 0;
+ sb->s_time_max = 0;
sb->s_op = &cramfs_ops;
root = get_cramfs_inode(sb, cramfs_root, 0);
if (IS_ERR(root))
diff --git a/fs/efs/super.c b/fs/efs/super.c
index 867fc24dee20..4a6ebff2af76 100644
--- a/fs/efs/super.c
+++ b/fs/efs/super.c
@@ -257,6 +257,8 @@ static int efs_fill_super(struct super_block *s, void *d, int silent)
if (!sb)
return -ENOMEM;
s->s_fs_info = sb;
+ s->s_time_min = 0;
+ s->s_time_max = U32_MAX;
s->s_magic = EFS_SUPER_MAGIC;
if (!sb_set_blocksize(s, EFS_BLOCKSIZE)) {
diff --git a/fs/ext2/super.c b/fs/ext2/super.c
index 44eb6e7eb492..baa36c6fb71e 100644
--- a/fs/ext2/super.c
+++ b/fs/ext2/super.c
@@ -1002,6 +1002,8 @@ static int ext2_fill_super(struct super_block *sb, void *data, int silent)
sb->s_maxbytes = ext2_max_size(sb->s_blocksize_bits);
sb->s_max_links = EXT2_LINK_MAX;
+ sb->s_time_min = S32_MIN;
+ sb->s_time_max = S32_MAX;
if (le32_to_cpu(es->s_rev_level) == EXT2_GOOD_OLD_REV) {
sbi->s_inode_size = EXT2_GOOD_OLD_INODE_SIZE;
diff --git a/fs/freevxfs/vxfs_super.c b/fs/freevxfs/vxfs_super.c
index a89f68c3cbed..578a5062706e 100644
--- a/fs/freevxfs/vxfs_super.c
+++ b/fs/freevxfs/vxfs_super.c
@@ -229,6 +229,8 @@ static int vxfs_fill_super(struct super_block *sbp, void *dp, int silent)
sbp->s_op = &vxfs_super_ops;
sbp->s_fs_info = infp;
+ sbp->s_time_min = 0;
+ sbp->s_time_max = U32_MAX;
if (!vxfs_try_sb_magic(sbp, silent, 1,
(__force __fs32)cpu_to_le32(VXFS_SUPER_MAGIC))) {
diff --git a/fs/jffs2/fs.c b/fs/jffs2/fs.c
index 25736676a456..05fe6cf5f1ac 100644
--- a/fs/jffs2/fs.c
+++ b/fs/jffs2/fs.c
@@ -591,6 +591,9 @@ int jffs2_do_fill_super(struct super_block *sb, struct fs_context *fc)
sb->s_blocksize = PAGE_SIZE;
sb->s_blocksize_bits = PAGE_SHIFT;
sb->s_magic = JFFS2_SUPER_MAGIC;
+ sb->s_time_min = 0;
+ sb->s_time_max = U32_MAX;
+
if (!sb_rdonly(sb))
jffs2_start_garbage_collect_thread(c);
return 0;
diff --git a/fs/jfs/super.c b/fs/jfs/super.c
index f4e10cb9f734..b2dc4d1f9dcc 100644
--- a/fs/jfs/super.c
+++ b/fs/jfs/super.c
@@ -503,6 +503,8 @@ static int jfs_fill_super(struct super_block *sb, void *data, int silent)
sb->s_fs_info = sbi;
sb->s_max_links = JFS_LINK_MAX;
+ sb->s_time_min = 0;
+ sb->s_time_max = U32_MAX;
sbi->sb = sb;
sbi->uid = INVALID_UID;
sbi->gid = INVALID_GID;
diff --git a/fs/minix/inode.c b/fs/minix/inode.c
index f96073f25432..7cb5fd38eb14 100644
--- a/fs/minix/inode.c
+++ b/fs/minix/inode.c
@@ -277,6 +277,8 @@ static int minix_fill_super(struct super_block *s, void *data, int silent)
/* set up enough so that it can read an inode */
s->s_op = &minix_sops;
+ s->s_time_min = 0;
+ s->s_time_max = U32_MAX;
root_inode = minix_iget(s, MINIX_ROOT_INO);
if (IS_ERR(root_inode)) {
ret = PTR_ERR(root_inode);
diff --git a/fs/qnx4/inode.c b/fs/qnx4/inode.c
index 922d083bbc7c..e8da1cde87b9 100644
--- a/fs/qnx4/inode.c
+++ b/fs/qnx4/inode.c
@@ -201,6 +201,8 @@ static int qnx4_fill_super(struct super_block *s, void *data, int silent)
s->s_op = &qnx4_sops;
s->s_magic = QNX4_SUPER_MAGIC;
s->s_flags |= SB_RDONLY; /* Yup, read-only yet */
+ s->s_time_min = 0;
+ s->s_time_max = U32_MAX;
/* Check the superblock signature. Since the qnx4 code is
dangerous, we should leave as quickly as possible
diff --git a/fs/qnx6/inode.c b/fs/qnx6/inode.c
index 0f8b0ff1ba43..345db56c98fd 100644
--- a/fs/qnx6/inode.c
+++ b/fs/qnx6/inode.c
@@ -429,6 +429,8 @@ static int qnx6_fill_super(struct super_block *s, void *data, int silent)
s->s_op = &qnx6_sops;
s->s_magic = QNX6_SUPER_MAGIC;
s->s_flags |= SB_RDONLY; /* Yup, read-only yet */
+ s->s_time_min = 0;
+ s->s_time_max = U32_MAX;
/* ease the later tree level calculations */
sbi = QNX6_SB(s);
diff --git a/fs/reiserfs/super.c b/fs/reiserfs/super.c
index ab028ea0e561..d69b4ac0ae2f 100644
--- a/fs/reiserfs/super.c
+++ b/fs/reiserfs/super.c
@@ -1976,6 +1976,9 @@ static int reiserfs_fill_super(struct super_block *s, void *data, int silent)
goto error_unlocked;
}
+ s->s_time_min = 0;
+ s->s_time_max = U32_MAX;
+
rs = SB_DISK_SUPER_BLOCK(s);
/*
* Let's do basic sanity check to verify that underlying device is not
diff --git a/fs/romfs/super.c b/fs/romfs/super.c
index 4636f867b9e8..338ac8521e65 100644
--- a/fs/romfs/super.c
+++ b/fs/romfs/super.c
@@ -477,6 +477,8 @@ static int romfs_fill_super(struct super_block *sb, struct fs_context *fc)
sb->s_maxbytes = 0xFFFFFFFF;
sb->s_magic = ROMFS_MAGIC;
sb->s_flags |= SB_RDONLY | SB_NOATIME;
+ sb->s_time_min = 0;
+ sb->s_time_max = 0;
sb->s_op = &romfs_super_ops;
#ifdef CONFIG_ROMFS_ON_MTD
diff --git a/fs/squashfs/super.c b/fs/squashfs/super.c
index 0311171af72d..e2d6566371ec 100644
--- a/fs/squashfs/super.c
+++ b/fs/squashfs/super.c
@@ -186,6 +186,8 @@ static int squashfs_fill_super(struct super_block *sb, struct fs_context *fc)
(u64) le64_to_cpu(sblk->id_table_start));
sb->s_maxbytes = MAX_LFS_FILESIZE;
+ sb->s_time_min = 0;
+ sb->s_time_max = U32_MAX;
sb->s_flags |= SB_RDONLY;
sb->s_op = &squashfs_super_ops;
diff --git a/fs/ufs/super.c b/fs/ufs/super.c
index 4ed0dca52ec8..1da0be667409 100644
--- a/fs/ufs/super.c
+++ b/fs/ufs/super.c
@@ -843,6 +843,10 @@ static int ufs_fill_super(struct super_block *sb, void *data, int silent)
sb->s_maxbytes = MAX_LFS_FILESIZE;
+ sb->s_time_gran = NSEC_PER_SEC;
+ sb->s_time_min = S32_MIN;
+ sb->s_time_max = S32_MAX;
+
switch (sbi->s_mount_opt & UFS_MOUNT_UFSTYPE) {
case UFS_MOUNT_UFSTYPE_44BSD:
UFSD("ufstype=44bsd\n");
@@ -861,6 +865,9 @@ static int ufs_fill_super(struct super_block *sb, void *data, int silent)
uspi->s_fshift = 9;
uspi->s_sbsize = super_block_size = 1536;
uspi->s_sbbase = 0;
+ sb->s_time_gran = 1;
+ sb->s_time_min = S64_MIN;
+ sb->s_time_max = S64_MAX;
flags |= UFS_TYPE_UFS2 | UFS_DE_44BSD | UFS_UID_44BSD | UFS_ST_44BSD | UFS_CG_44BSD;
break;
diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c
index f9450235533c..d3b10900fc24 100644
--- a/fs/xfs/xfs_super.c
+++ b/fs/xfs/xfs_super.c
@@ -1663,6 +1663,8 @@ xfs_fs_fill_super(
sb->s_maxbytes = xfs_max_file_offset(sb->s_blocksize_bits);
sb->s_max_links = XFS_MAXLINK;
sb->s_time_gran = 1;
+ sb->s_time_min = S32_MIN;
+ sb->s_time_max = S32_MAX;
sb->s_iflags |= SB_I_CGROUPWB;
set_posix_acl_flag(sb);
--
2.17.1
^ permalink raw reply related [flat|nested] 29+ messages in thread
* [PATCH v8 07/20] 9p: Fill min and max timestamps in sb
2019-08-18 16:57 [PATCH v8 00/20] vfs: Add support for timestamp limits Deepa Dinamani
` (5 preceding siblings ...)
2019-08-18 16:58 ` [PATCH v8 06/20] fs: Fill in max and min timestamps in superblock Deepa Dinamani
@ 2019-08-18 16:58 ` Deepa Dinamani
2019-08-18 16:58 ` [PATCH v8 08/20] adfs: Fill in max and min " Deepa Dinamani
` (13 subsequent siblings)
20 siblings, 0 replies; 29+ messages in thread
From: Deepa Dinamani @ 2019-08-18 16:58 UTC (permalink / raw)
To: viro, linux-kernel
Cc: linux-fsdevel, y2038, arnd, ericvh, lucho, asmadeus, v9fs-developer
struct p9_wstat and struct p9_stat_dotl indicate that the
wire transport uses u32 and u64 fields for timestamps.
Fill in the appropriate limits to avoid inconsistencies in
the vfs cached inode times when timestamps are outside the
permitted range.
Note that the upper bound for V9FS_PROTO_2000L is retained as S64_MAX.
This is because that is the upper bound supported by vfs.
Signed-off-by: Deepa Dinamani <deepa.kernel@gmail.com>
Cc: ericvh@gmail.com
Cc: lucho@ionkov.net
Cc: asmadeus@codewreck.org
Cc: v9fs-developer@lists.sourceforge.net
---
fs/9p/vfs_super.c | 6 +++++-
1 file changed, 5 insertions(+), 1 deletion(-)
diff --git a/fs/9p/vfs_super.c b/fs/9p/vfs_super.c
index 08112fbcaece..ca243e658d71 100644
--- a/fs/9p/vfs_super.c
+++ b/fs/9p/vfs_super.c
@@ -69,8 +69,12 @@ v9fs_fill_super(struct super_block *sb, struct v9fs_session_info *v9ses,
if (v9fs_proto_dotl(v9ses)) {
sb->s_op = &v9fs_super_ops_dotl;
sb->s_xattr = v9fs_xattr_handlers;
- } else
+ } else {
sb->s_op = &v9fs_super_ops;
+ sb->s_time_max = U32_MAX;
+ }
+
+ sb->s_time_min = 0;
ret = super_setup_bdi(sb);
if (ret)
--
2.17.1
^ permalink raw reply related [flat|nested] 29+ messages in thread
* [PATCH v8 08/20] adfs: Fill in max and min timestamps in sb
2019-08-18 16:57 [PATCH v8 00/20] vfs: Add support for timestamp limits Deepa Dinamani
` (6 preceding siblings ...)
2019-08-18 16:58 ` [PATCH v8 07/20] 9p: Fill min and max timestamps in sb Deepa Dinamani
@ 2019-08-18 16:58 ` Deepa Dinamani
2019-08-20 16:28 ` Matthew Wilcox
2019-08-18 16:58 ` [PATCH v8 09/20] ext4: Initialize timestamps limits Deepa Dinamani
` (12 subsequent siblings)
20 siblings, 1 reply; 29+ messages in thread
From: Deepa Dinamani @ 2019-08-18 16:58 UTC (permalink / raw)
To: viro, linux-kernel; +Cc: linux-fsdevel, y2038, arnd
Fill in the appropriate limits to avoid inconsistencies
in the vfs cached inode times when timestamps are
outside the permitted range.
Note that the min timestamp is assumed to be
01 Jan 1970 00:00:00 (Unix epoch). This is consistent
with the way we convert timestamps in adfs_adfs2unix_time().
Signed-off-by: Deepa Dinamani <deepa.kernel@gmail.com>
---
fs/adfs/adfs.h | 13 +++++++++++++
fs/adfs/inode.c | 8 ++------
fs/adfs/super.c | 2 ++
3 files changed, 17 insertions(+), 6 deletions(-)
diff --git a/fs/adfs/adfs.h b/fs/adfs/adfs.h
index b7e844d2f321..dca8b23aa43f 100644
--- a/fs/adfs/adfs.h
+++ b/fs/adfs/adfs.h
@@ -3,6 +3,19 @@
#include <linux/fs.h>
#include <linux/adfs_fs.h>
+/*
+ * 01 Jan 1970 00:00:00 (Unix epoch) as seconds since
+ * 01 Jan 1900 00:00:00 (RISC OS epoch)
+ */
+#define RISC_OS_EPOCH_DELTA 2208988800LL
+
+/*
+ * Convert 40 bit centi seconds to seconds
+ * since 01 Jan 1900 00:00:00 (RISC OS epoch)
+ * The result is 2248-06-03 06:57:57 GMT
+ */
+#define ADFS_MAX_TIMESTAMP ((0xFFFFFFFFFFLL / 100) - RISC_OS_EPOCH_DELTA)
+
/* Internal data structures for ADFS */
#define ADFS_FREE_FRAG 0
diff --git a/fs/adfs/inode.c b/fs/adfs/inode.c
index 124de75413a5..41eca1c451dc 100644
--- a/fs/adfs/inode.c
+++ b/fs/adfs/inode.c
@@ -167,11 +167,7 @@ static void
adfs_adfs2unix_time(struct timespec64 *tv, struct inode *inode)
{
unsigned int high, low;
- /* 01 Jan 1970 00:00:00 (Unix epoch) as nanoseconds since
- * 01 Jan 1900 00:00:00 (RISC OS epoch)
- */
- static const s64 nsec_unix_epoch_diff_risc_os_epoch =
- 2208988800000000000LL;
+ static const s64 nsec_unix_epoch_diff_risc_os_epoch = RISC_OS_EPOCH_DELTA * NSEC_PER_SEC;
s64 nsec;
if (!adfs_inode_is_stamped(inode))
@@ -216,7 +212,7 @@ adfs_unix2adfs_time(struct inode *inode, unsigned int secs)
if (adfs_inode_is_stamped(inode)) {
/* convert 32-bit seconds to 40-bit centi-seconds */
low = (secs & 255) * 100;
- high = (secs / 256) * 100 + (low >> 8) + 0x336e996a;
+ high = (secs / 256) * 100 + (low >> 8) + (RISC_OS_EPOCH_DELTA*100/256);
ADFS_I(inode)->loadaddr = (high >> 24) |
(ADFS_I(inode)->loadaddr & ~0xff);
diff --git a/fs/adfs/super.c b/fs/adfs/super.c
index 65b04ebb51c3..f074fe7d7158 100644
--- a/fs/adfs/super.c
+++ b/fs/adfs/super.c
@@ -463,6 +463,8 @@ static int adfs_fill_super(struct super_block *sb, void *data, int silent)
asb->s_map_size = dr->nzones | (dr->nzones_high << 8);
asb->s_map2blk = dr->log2bpmb - dr->log2secsize;
asb->s_log2sharesize = dr->log2sharesize;
+ sb->s_time_min = 0;
+ sb->s_time_max = ADFS_MAX_TIMESTAMP;
asb->s_map = adfs_read_map(sb, dr);
if (IS_ERR(asb->s_map)) {
--
2.17.1
^ permalink raw reply related [flat|nested] 29+ messages in thread
* [PATCH v8 09/20] ext4: Initialize timestamps limits
2019-08-18 16:57 [PATCH v8 00/20] vfs: Add support for timestamp limits Deepa Dinamani
` (7 preceding siblings ...)
2019-08-18 16:58 ` [PATCH v8 08/20] adfs: Fill in max and min " Deepa Dinamani
@ 2019-08-18 16:58 ` Deepa Dinamani
2019-08-18 16:58 ` [PATCH v8 10/20] fs: nfs: Initialize filesystem timestamp ranges Deepa Dinamani
` (11 subsequent siblings)
20 siblings, 0 replies; 29+ messages in thread
From: Deepa Dinamani @ 2019-08-18 16:58 UTC (permalink / raw)
To: viro, linux-kernel
Cc: linux-fsdevel, y2038, arnd, tytso, adilger.kernel, linux-ext4
ext4 has different overflow limits for max filesystem
timestamps based on the extra bytes available.
The timestamp limits are calculated according to the
encoding table in
a4dad1ae24f85i(ext4: Fix handling of extended tv_sec):
* extra msb of adjust for signed
* epoch 32-bit 32-bit tv_sec to
* bits time decoded 64-bit tv_sec 64-bit tv_sec valid time range
* 0 0 1 -0x80000000..-0x00000001 0x000000000 1901-12-13..1969-12-31
* 0 0 0 0x000000000..0x07fffffff 0x000000000 1970-01-01..2038-01-19
* 0 1 1 0x080000000..0x0ffffffff 0x100000000 2038-01-19..2106-02-07
* 0 1 0 0x100000000..0x17fffffff 0x100000000 2106-02-07..2174-02-25
* 1 0 1 0x180000000..0x1ffffffff 0x200000000 2174-02-25..2242-03-16
* 1 0 0 0x200000000..0x27fffffff 0x200000000 2242-03-16..2310-04-04
* 1 1 1 0x280000000..0x2ffffffff 0x300000000 2310-04-04..2378-04-22
* 1 1 0 0x300000000..0x37fffffff 0x300000000 2378-04-22..2446-05-10
Note that the time limits are not correct for deletion times.
Added a warn when an inode cannot be extended to incorporate an
extended timestamp.
Signed-off-by: Deepa Dinamani <deepa.kernel@gmail.com>
Reviewed-by: Andreas Dilger <adilger@dilger.ca>
Cc: tytso@mit.edu
Cc: adilger.kernel@dilger.ca
Cc: linux-ext4@vger.kernel.org
---
fs/ext4/ext4.h | 10 +++++++++-
fs/ext4/super.c | 17 +++++++++++++++--
2 files changed, 24 insertions(+), 3 deletions(-)
diff --git a/fs/ext4/ext4.h b/fs/ext4/ext4.h
index 9c7f4036021b..ae5d0c86aba2 100644
--- a/fs/ext4/ext4.h
+++ b/fs/ext4/ext4.h
@@ -832,11 +832,15 @@ static inline void ext4_decode_extra_time(struct timespec64 *time,
#define EXT4_INODE_SET_XTIME(xtime, inode, raw_inode) \
do { \
- (raw_inode)->xtime = cpu_to_le32((inode)->xtime.tv_sec); \
if (EXT4_FITS_IN_INODE(raw_inode, EXT4_I(inode), xtime ## _extra)) {\
+ (raw_inode)->xtime = cpu_to_le32((inode)->xtime.tv_sec); \
(raw_inode)->xtime ## _extra = \
ext4_encode_extra_time(&(inode)->xtime); \
} \
+ else {\
+ (raw_inode)->xtime = cpu_to_le32(clamp_t(int32_t, (inode)->xtime.tv_sec, S32_MIN, S32_MAX)); \
+ ext4_warning_inode(inode, "inode does not support timestamps beyond 2038"); \
+ } \
} while (0)
#define EXT4_EINODE_SET_XTIME(xtime, einode, raw_inode) \
@@ -1643,6 +1647,10 @@ static inline bool ext4_verity_in_progress(struct inode *inode)
#define EXT4_GOOD_OLD_INODE_SIZE 128
+#define EXT4_EXTRA_TIMESTAMP_MAX (((s64)1 << 34) - 1 + S32_MIN)
+#define EXT4_NON_EXTRA_TIMESTAMP_MAX S32_MAX
+#define EXT4_TIMESTAMP_MIN S32_MIN
+
/*
* Feature set definitions
*/
diff --git a/fs/ext4/super.c b/fs/ext4/super.c
index 27cd622676e7..3db5f17228b7 100644
--- a/fs/ext4/super.c
+++ b/fs/ext4/super.c
@@ -4039,8 +4039,21 @@ static int ext4_fill_super(struct super_block *sb, void *data, int silent)
sbi->s_inode_size);
goto failed_mount;
}
- if (sbi->s_inode_size > EXT4_GOOD_OLD_INODE_SIZE)
- sb->s_time_gran = 1 << (EXT4_EPOCH_BITS - 2);
+ /*
+ * i_atime_extra is the last extra field available for [acm]times in
+ * struct ext4_inode. Checking for that field should suffice to ensure
+ * we have extra space for all three.
+ */
+ if (sbi->s_inode_size >= offsetof(struct ext4_inode, i_atime_extra) +
+ sizeof(((struct ext4_inode *)0)->i_atime_extra)) {
+ sb->s_time_gran = 1;
+ sb->s_time_max = EXT4_EXTRA_TIMESTAMP_MAX;
+ } else {
+ sb->s_time_gran = NSEC_PER_SEC;
+ sb->s_time_max = EXT4_NON_EXTRA_TIMESTAMP_MAX;
+ }
+
+ sb->s_time_min = EXT4_TIMESTAMP_MIN;
}
sbi->s_desc_size = le16_to_cpu(es->s_desc_size);
--
2.17.1
^ permalink raw reply related [flat|nested] 29+ messages in thread
* [PATCH v8 10/20] fs: nfs: Initialize filesystem timestamp ranges
2019-08-18 16:57 [PATCH v8 00/20] vfs: Add support for timestamp limits Deepa Dinamani
` (8 preceding siblings ...)
2019-08-18 16:58 ` [PATCH v8 09/20] ext4: Initialize timestamps limits Deepa Dinamani
@ 2019-08-18 16:58 ` Deepa Dinamani
2019-08-18 16:58 ` [PATCH v8 11/20] fs: cifs: " Deepa Dinamani
` (10 subsequent siblings)
20 siblings, 0 replies; 29+ messages in thread
From: Deepa Dinamani @ 2019-08-18 16:58 UTC (permalink / raw)
To: viro, linux-kernel
Cc: linux-fsdevel, y2038, arnd, trond.myklebust, anna.schumaker, linux-nfs
Fill in the appropriate limits to avoid inconsistencies
in the vfs cached inode times when timestamps are
outside the permitted range.
The time formats for various verious is detailed in the
RFCs as below:
https://tools.ietf.org/html/rfc7862(time metadata)
https://tools.ietf.org/html/rfc7530:
nfstime4
struct nfstime4 {
int64_t seconds;
uint32_t nseconds;
};
https://tools.ietf.org/html/rfc1094
struct timeval {
unsigned int seconds;
unsigned int useconds;
};
https://tools.ietf.org/html/rfc1813
struct nfstime3 {
uint32 seconds;
uint32 nseconds;
};
Use the limits as per the RFC.
Signed-off-by: Deepa Dinamani <deepa.kernel@gmail.com>
Cc: trond.myklebust@hammerspace.com
Cc: anna.schumaker@netapp.com
Cc: linux-nfs@vger.kernel.org
---
fs/nfs/super.c | 20 +++++++++++++++++++-
1 file changed, 19 insertions(+), 1 deletion(-)
diff --git a/fs/nfs/super.c b/fs/nfs/super.c
index 703f595dce90..19a76cfa8b1f 100644
--- a/fs/nfs/super.c
+++ b/fs/nfs/super.c
@@ -2382,6 +2382,15 @@ void nfs_fill_super(struct super_block *sb, struct nfs_mount_info *mount_info)
sb->s_flags |= SB_POSIXACL;
sb->s_time_gran = 1;
sb->s_export_op = &nfs_export_ops;
+ } else
+ sb->s_time_gran = 1000;
+
+ if (server->nfs_client->rpc_ops->version != 4) {
+ sb->s_time_min = 0;
+ sb->s_time_max = U32_MAX;
+ } else {
+ sb->s_time_min = S64_MIN;
+ sb->s_time_max = S64_MAX;
}
nfs_initialise_sb(sb);
@@ -2402,7 +2411,6 @@ static void nfs_clone_super(struct super_block *sb,
sb->s_maxbytes = old_sb->s_maxbytes;
sb->s_xattr = old_sb->s_xattr;
sb->s_op = old_sb->s_op;
- sb->s_time_gran = 1;
sb->s_export_op = old_sb->s_export_op;
if (server->nfs_client->rpc_ops->version != 2) {
@@ -2410,6 +2418,16 @@ static void nfs_clone_super(struct super_block *sb,
* so ourselves when necessary.
*/
sb->s_flags |= SB_POSIXACL;
+ sb->s_time_gran = 1;
+ } else
+ sb->s_time_gran = 1000;
+
+ if (server->nfs_client->rpc_ops->version != 4) {
+ sb->s_time_min = 0;
+ sb->s_time_max = U32_MAX;
+ } else {
+ sb->s_time_min = S64_MIN;
+ sb->s_time_max = S64_MAX;
}
nfs_initialise_sb(sb);
--
2.17.1
^ permalink raw reply related [flat|nested] 29+ messages in thread
* [PATCH v8 11/20] fs: cifs: Initialize filesystem timestamp ranges
2019-08-18 16:57 [PATCH v8 00/20] vfs: Add support for timestamp limits Deepa Dinamani
` (9 preceding siblings ...)
2019-08-18 16:58 ` [PATCH v8 10/20] fs: nfs: Initialize filesystem timestamp ranges Deepa Dinamani
@ 2019-08-18 16:58 ` Deepa Dinamani
2019-08-18 16:58 ` [PATCH v8 12/20] fs: fat: " Deepa Dinamani
` (9 subsequent siblings)
20 siblings, 0 replies; 29+ messages in thread
From: Deepa Dinamani @ 2019-08-18 16:58 UTC (permalink / raw)
To: viro, linux-kernel; +Cc: linux-fsdevel, y2038, arnd, sfrench, linux-cifs
Fill in the appropriate limits to avoid inconsistencies
in the vfs cached inode times when timestamps are
outside the permitted range.
Also fixed cnvrtDosUnixTm calculations to avoid int overflow
while computing maximum date.
References:
http://cifs.com/
https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-cifs/d416ff7c-c536-406e-a951-4f04b2fd1d2b
Signed-off-by: Deepa Dinamani <deepa.kernel@gmail.com>
Cc: sfrench@samba.org
Cc: linux-cifs@vger.kernel.org
---
fs/cifs/cifsfs.c | 22 ++++++++++++++++++++++
fs/cifs/netmisc.c | 14 +++++++-------
2 files changed, 29 insertions(+), 7 deletions(-)
diff --git a/fs/cifs/cifsfs.c b/fs/cifs/cifsfs.c
index 3289b566463f..7a75726442ad 100644
--- a/fs/cifs/cifsfs.c
+++ b/fs/cifs/cifsfs.c
@@ -56,6 +56,15 @@
#include "dfs_cache.h"
#endif
+/*
+ * DOS dates from 1980/1/1 through 2107/12/31
+ * Protocol specifications indicate the range should be to 119, which
+ * limits maximum year to 2099. But this range has not been checked.
+ */
+#define SMB_DATE_MAX (127<<9 | 12<<5 | 31)
+#define SMB_DATE_MIN (0<<9 | 1<<5 | 1)
+#define SMB_TIME_MAX (23<<11 | 59<<5 | 29)
+
int cifsFYI = 0;
bool traceSMB;
bool enable_oplocks = true;
@@ -142,6 +151,7 @@ cifs_read_super(struct super_block *sb)
struct inode *inode;
struct cifs_sb_info *cifs_sb;
struct cifs_tcon *tcon;
+ struct timespec64 ts;
int rc = 0;
cifs_sb = CIFS_SB(sb);
@@ -161,6 +171,18 @@ cifs_read_super(struct super_block *sb)
/* BB FIXME fix time_gran to be larger for LANMAN sessions */
sb->s_time_gran = 100;
+ if (tcon->unix_ext) {
+ ts = cifs_NTtimeToUnix(0);
+ sb->s_time_min = ts.tv_sec;
+ ts = cifs_NTtimeToUnix(cpu_to_le64(S64_MAX));
+ sb->s_time_max = ts.tv_sec;
+ } else {
+ ts = cnvrtDosUnixTm(cpu_to_le16(SMB_DATE_MIN), 0, 0);
+ sb->s_time_min = ts.tv_sec;
+ ts = cnvrtDosUnixTm(cpu_to_le16(SMB_DATE_MAX), cpu_to_le16(SMB_TIME_MAX), 0);
+ sb->s_time_max = ts.tv_sec;
+ }
+
sb->s_magic = CIFS_MAGIC_NUMBER;
sb->s_op = &cifs_super_ops;
sb->s_xattr = cifs_xattr_handlers;
diff --git a/fs/cifs/netmisc.c b/fs/cifs/netmisc.c
index ed92958e842d..49c17ee18254 100644
--- a/fs/cifs/netmisc.c
+++ b/fs/cifs/netmisc.c
@@ -949,8 +949,8 @@ static const int total_days_of_prev_months[] = {
struct timespec64 cnvrtDosUnixTm(__le16 le_date, __le16 le_time, int offset)
{
struct timespec64 ts;
- time64_t sec;
- int min, days, month, year;
+ time64_t sec, days;
+ int min, day, month, year;
u16 date = le16_to_cpu(le_date);
u16 time = le16_to_cpu(le_time);
SMB_TIME *st = (SMB_TIME *)&time;
@@ -966,15 +966,15 @@ struct timespec64 cnvrtDosUnixTm(__le16 le_date, __le16 le_time, int offset)
sec += 60 * 60 * st->Hours;
if (st->Hours > 24)
cifs_dbg(VFS, "illegal hours %d\n", st->Hours);
- days = sd->Day;
+ day = sd->Day;
month = sd->Month;
- if (days < 1 || days > 31 || month < 1 || month > 12) {
- cifs_dbg(VFS, "illegal date, month %d day: %d\n", month, days);
- days = clamp(days, 1, 31);
+ if (day < 1 || day > 31 || month < 1 || month > 12) {
+ cifs_dbg(VFS, "illegal date, month %d day: %d\n", month, day);
+ day = clamp(day, 1, 31);
month = clamp(month, 1, 12);
}
month -= 1;
- days += total_days_of_prev_months[month];
+ days = day + total_days_of_prev_months[month];
days += 3652; /* account for difference in days between 1980 and 1970 */
year = sd->Year;
days += year * 365;
--
2.17.1
^ permalink raw reply related [flat|nested] 29+ messages in thread
* [PATCH v8 12/20] fs: fat: Initialize filesystem timestamp ranges
2019-08-18 16:57 [PATCH v8 00/20] vfs: Add support for timestamp limits Deepa Dinamani
` (10 preceding siblings ...)
2019-08-18 16:58 ` [PATCH v8 11/20] fs: cifs: " Deepa Dinamani
@ 2019-08-18 16:58 ` Deepa Dinamani
2019-08-18 16:58 ` [PATCH v8 13/20] fs: affs: " Deepa Dinamani
` (8 subsequent siblings)
20 siblings, 0 replies; 29+ messages in thread
From: Deepa Dinamani @ 2019-08-18 16:58 UTC (permalink / raw)
To: viro, linux-kernel; +Cc: linux-fsdevel, y2038, arnd, hirofumi
Fill in the appropriate limits to avoid inconsistencies
in the vfs cached inode times when timestamps are
outside the permitted range.
Some FAT variants indicate that the years after 2099 are not supported.
Since commit 7decd1cb0305 ("fat: Fix and cleanup timestamp conversion")
we support the full range of years that can be represented, up to 2107.
Signed-off-by: Deepa Dinamani <deepa.kernel@gmail.com>
Cc: hirofumi@mail.parknet.co.jp
---
fs/fat/inode.c | 12 ++++++++++++
1 file changed, 12 insertions(+)
diff --git a/fs/fat/inode.c b/fs/fat/inode.c
index 0bc2abc5d453..f27f84e2103f 100644
--- a/fs/fat/inode.c
+++ b/fs/fat/inode.c
@@ -31,6 +31,11 @@
#define KB_IN_SECTORS 2
+/* DOS dates from 1980/1/1 through 2107/12/31 */
+#define FAT_DATE_MIN (0<<9 | 1<<5 | 1)
+#define FAT_DATE_MAX (127<<9 | 12<<5 | 31)
+#define FAT_TIME_MAX (23<<11 | 59<<5 | 29)
+
/*
* A deserialized copy of the on-disk structure laid out in struct
* fat_boot_sector.
@@ -1617,6 +1622,7 @@ int fat_fill_super(struct super_block *sb, void *data, int silent, int isvfat,
int debug;
long error;
char buf[50];
+ struct timespec64 ts;
/*
* GFP_KERNEL is ok here, because while we do hold the
@@ -1710,6 +1716,12 @@ int fat_fill_super(struct super_block *sb, void *data, int silent, int isvfat,
sbi->free_clus_valid = 0;
sbi->prev_free = FAT_START_ENT;
sb->s_maxbytes = 0xffffffff;
+ fat_time_fat2unix(sbi, &ts, 0, cpu_to_le16(FAT_DATE_MIN), 0);
+ sb->s_time_min = ts.tv_sec;
+
+ fat_time_fat2unix(sbi, &ts, cpu_to_le16(FAT_TIME_MAX),
+ cpu_to_le16(FAT_DATE_MAX), 0);
+ sb->s_time_max = ts.tv_sec;
if (!sbi->fat_length && bpb.fat32_length) {
struct fat_boot_fsinfo *fsinfo;
--
2.17.1
^ permalink raw reply related [flat|nested] 29+ messages in thread
* [PATCH v8 13/20] fs: affs: Initialize filesystem timestamp ranges
2019-08-18 16:57 [PATCH v8 00/20] vfs: Add support for timestamp limits Deepa Dinamani
` (11 preceding siblings ...)
2019-08-18 16:58 ` [PATCH v8 12/20] fs: fat: " Deepa Dinamani
@ 2019-08-18 16:58 ` Deepa Dinamani
2019-08-18 16:58 ` [PATCH v8 14/20] fs: sysv: " Deepa Dinamani
` (7 subsequent siblings)
20 siblings, 0 replies; 29+ messages in thread
From: Deepa Dinamani @ 2019-08-18 16:58 UTC (permalink / raw)
To: viro, linux-kernel; +Cc: linux-fsdevel, y2038, arnd, dsterba
Fill in the appropriate limits to avoid inconsistencies
in the vfs cached inode times when timestamps are
outside the permitted range.
Also fix timestamp calculation to avoid overflow
while converting from days to seconds.
Signed-off-by: Deepa Dinamani <deepa.kernel@gmail.com>
Acked-by: David Sterba <dsterba@suse.com>
Cc: dsterba@suse.com
---
fs/affs/amigaffs.c | 2 +-
fs/affs/amigaffs.h | 3 +++
fs/affs/inode.c | 4 ++--
fs/affs/super.c | 4 ++++
4 files changed, 10 insertions(+), 3 deletions(-)
diff --git a/fs/affs/amigaffs.c b/fs/affs/amigaffs.c
index 14a6c1b90c9f..f708c45d5f66 100644
--- a/fs/affs/amigaffs.c
+++ b/fs/affs/amigaffs.c
@@ -375,7 +375,7 @@ affs_secs_to_datestamp(time64_t secs, struct affs_date *ds)
u32 minute;
s32 rem;
- secs -= sys_tz.tz_minuteswest * 60 + ((8 * 365 + 2) * 24 * 60 * 60);
+ secs -= sys_tz.tz_minuteswest * 60 + AFFS_EPOCH_DELTA;
if (secs < 0)
secs = 0;
days = div_s64_rem(secs, 86400, &rem);
diff --git a/fs/affs/amigaffs.h b/fs/affs/amigaffs.h
index f9bef9056659..81fb396d4dfa 100644
--- a/fs/affs/amigaffs.h
+++ b/fs/affs/amigaffs.h
@@ -32,6 +32,9 @@
#define AFFS_ROOT_BMAPS 25
+/* Seconds since Amiga epoch of 1978/01/01 to UNIX */
+#define AFFS_EPOCH_DELTA ((8 * 365 + 2) * 86400LL)
+
struct affs_date {
__be32 days;
__be32 mins;
diff --git a/fs/affs/inode.c b/fs/affs/inode.c
index 73598bff8506..a346cf7659f1 100644
--- a/fs/affs/inode.c
+++ b/fs/affs/inode.c
@@ -150,10 +150,10 @@ struct inode *affs_iget(struct super_block *sb, unsigned long ino)
}
inode->i_mtime.tv_sec = inode->i_atime.tv_sec = inode->i_ctime.tv_sec
- = (be32_to_cpu(tail->change.days) * (24 * 60 * 60) +
+ = (be32_to_cpu(tail->change.days) * 86400LL +
be32_to_cpu(tail->change.mins) * 60 +
be32_to_cpu(tail->change.ticks) / 50 +
- ((8 * 365 + 2) * 24 * 60 * 60)) +
+ AFFS_EPOCH_DELTA) +
sys_tz.tz_minuteswest * 60;
inode->i_mtime.tv_nsec = inode->i_ctime.tv_nsec = inode->i_atime.tv_nsec = 0;
affs_brelse(bh);
diff --git a/fs/affs/super.c b/fs/affs/super.c
index e7d036efbaa1..cc463ae47c12 100644
--- a/fs/affs/super.c
+++ b/fs/affs/super.c
@@ -355,6 +355,10 @@ static int affs_fill_super(struct super_block *sb, void *data, int silent)
sb->s_op = &affs_sops;
sb->s_flags |= SB_NODIRATIME;
+ sb->s_time_gran = NSEC_PER_SEC;
+ sb->s_time_min = sys_tz.tz_minuteswest * 60 + AFFS_EPOCH_DELTA;
+ sb->s_time_max = 86400LL * U32_MAX + 86400 + sb->s_time_min;
+
sbi = kzalloc(sizeof(struct affs_sb_info), GFP_KERNEL);
if (!sbi)
return -ENOMEM;
--
2.17.1
^ permalink raw reply related [flat|nested] 29+ messages in thread
* [PATCH v8 14/20] fs: sysv: Initialize filesystem timestamp ranges
2019-08-18 16:57 [PATCH v8 00/20] vfs: Add support for timestamp limits Deepa Dinamani
` (12 preceding siblings ...)
2019-08-18 16:58 ` [PATCH v8 13/20] fs: affs: " Deepa Dinamani
@ 2019-08-18 16:58 ` Deepa Dinamani
2019-08-18 16:58 ` [PATCH v8 15/20] fs: ceph: " Deepa Dinamani
` (6 subsequent siblings)
20 siblings, 0 replies; 29+ messages in thread
From: Deepa Dinamani @ 2019-08-18 16:58 UTC (permalink / raw)
To: viro, linux-kernel; +Cc: linux-fsdevel, y2038, arnd, hch
Fill in the appropriate limits to avoid inconsistencies
in the vfs cached inode times when timestamps are
outside the permitted range.
Signed-off-by: Deepa Dinamani <deepa.kernel@gmail.com>
Cc: hch@infradead.org
---
fs/sysv/super.c | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/fs/sysv/super.c b/fs/sysv/super.c
index d788b1daa7eb..cc8e2ed155c8 100644
--- a/fs/sysv/super.c
+++ b/fs/sysv/super.c
@@ -368,7 +368,8 @@ static int sysv_fill_super(struct super_block *sb, void *data, int silent)
sbi->s_block_base = 0;
mutex_init(&sbi->s_lock);
sb->s_fs_info = sbi;
-
+ sb->s_time_min = 0;
+ sb->s_time_max = U32_MAX;
sb_set_blocksize(sb, BLOCK_SIZE);
for (i = 0; i < ARRAY_SIZE(flavours) && !size; i++) {
@@ -487,6 +488,8 @@ static int v7_fill_super(struct super_block *sb, void *data, int silent)
sbi->s_type = FSTYPE_V7;
mutex_init(&sbi->s_lock);
sb->s_fs_info = sbi;
+ sb->s_time_min = 0;
+ sb->s_time_max = U32_MAX;
sb_set_blocksize(sb, 512);
--
2.17.1
^ permalink raw reply related [flat|nested] 29+ messages in thread
* [PATCH v8 15/20] fs: ceph: Initialize filesystem timestamp ranges
2019-08-18 16:57 [PATCH v8 00/20] vfs: Add support for timestamp limits Deepa Dinamani
` (13 preceding siblings ...)
2019-08-18 16:58 ` [PATCH v8 14/20] fs: sysv: " Deepa Dinamani
@ 2019-08-18 16:58 ` Deepa Dinamani
2019-08-18 16:58 ` [PATCH v8 16/20] fs: orangefs: " Deepa Dinamani
` (5 subsequent siblings)
20 siblings, 0 replies; 29+ messages in thread
From: Deepa Dinamani @ 2019-08-18 16:58 UTC (permalink / raw)
To: viro, linux-kernel
Cc: linux-fsdevel, y2038, arnd, zyan, sage, idryomov, ceph-devel
Fill in the appropriate limits to avoid inconsistencies
in the vfs cached inode times when timestamps are
outside the permitted range.
According to the disscussion in
https://patchwork.kernel.org/patch/8308691/ we agreed to use
unsigned 32 bit timestamps on ceph.
Update the limits accordingly.
Signed-off-by: Deepa Dinamani <deepa.kernel@gmail.com>
Cc: zyan@redhat.com
Cc: sage@redhat.com
Cc: idryomov@gmail.com
Cc: ceph-devel@vger.kernel.org
---
fs/ceph/super.c | 2 ++
1 file changed, 2 insertions(+)
diff --git a/fs/ceph/super.c b/fs/ceph/super.c
index 4406ec7018bb..2aa052b7bda7 100644
--- a/fs/ceph/super.c
+++ b/fs/ceph/super.c
@@ -907,6 +907,8 @@ static int ceph_set_super(struct super_block *s, struct fs_context *fc)
s->s_export_op = &ceph_export_ops;
s->s_time_gran = 1;
+ s->s_time_min = 0;
+ s->s_time_max = U32_MAX;
ret = set_anon_super_fc(s, fc);
if (ret != 0)
--
2.17.1
^ permalink raw reply related [flat|nested] 29+ messages in thread
* [PATCH v8 16/20] fs: orangefs: Initialize filesystem timestamp ranges
2019-08-18 16:57 [PATCH v8 00/20] vfs: Add support for timestamp limits Deepa Dinamani
` (14 preceding siblings ...)
2019-08-18 16:58 ` [PATCH v8 15/20] fs: ceph: " Deepa Dinamani
@ 2019-08-18 16:58 ` Deepa Dinamani
2019-08-18 16:58 ` [PATCH v8 17/20] fs: hpfs: " Deepa Dinamani
` (4 subsequent siblings)
20 siblings, 0 replies; 29+ messages in thread
From: Deepa Dinamani @ 2019-08-18 16:58 UTC (permalink / raw)
To: viro, linux-kernel; +Cc: linux-fsdevel, y2038, arnd, hubcap, martin, devel
Fill in the appropriate limits to avoid inconsistencies
in the vfs cached inode times when timestamps are
outside the permitted range.
Assume the limits as unsigned according to the below
commit 98e8eef557a9 ("changed PVFS_time from int64_t to uint64_t")
in https://github.com/waltligon/orangefs
Author: Neill Miller <neillm@mcs.anl.gov>
Date: Thu Sep 2 15:00:38 2004 +0000
Signed-off-by: Deepa Dinamani <deepa.kernel@gmail.com>
Cc: hubcap@omnibond.com
Cc: martin@omnibond.com
Cc: devel@lists.orangefs.org
---
fs/orangefs/super.c | 2 ++
1 file changed, 2 insertions(+)
diff --git a/fs/orangefs/super.c b/fs/orangefs/super.c
index 2811586fafc2..1ec08fe459cf 100644
--- a/fs/orangefs/super.c
+++ b/fs/orangefs/super.c
@@ -425,6 +425,8 @@ static int orangefs_fill_sb(struct super_block *sb,
sb->s_blocksize = PAGE_SIZE;
sb->s_blocksize_bits = PAGE_SHIFT;
sb->s_maxbytes = MAX_LFS_FILESIZE;
+ sb->s_time_min = 0;
+ sb->s_time_max = S64_MAX;
ret = super_setup_bdi(sb);
if (ret)
--
2.17.1
^ permalink raw reply related [flat|nested] 29+ messages in thread
* [PATCH v8 17/20] fs: hpfs: Initialize filesystem timestamp ranges
2019-08-18 16:57 [PATCH v8 00/20] vfs: Add support for timestamp limits Deepa Dinamani
` (15 preceding siblings ...)
2019-08-18 16:58 ` [PATCH v8 16/20] fs: orangefs: " Deepa Dinamani
@ 2019-08-18 16:58 ` Deepa Dinamani
2019-08-18 16:58 ` [PATCH v8 18/20] fs: omfs: " Deepa Dinamani
` (3 subsequent siblings)
20 siblings, 0 replies; 29+ messages in thread
From: Deepa Dinamani @ 2019-08-18 16:58 UTC (permalink / raw)
To: viro, linux-kernel; +Cc: linux-fsdevel, y2038, arnd, mikulas
Fill in the appropriate limits to avoid inconsistencies
in the vfs cached inode times when timestamps are
outside the permitted range.
Also change the local_to_gmt() to use time64_t instead
of time32_t.
Signed-off-by: Deepa Dinamani <deepa.kernel@gmail.com>
Cc: mikulas@artax.karlin.mff.cuni.cz
---
fs/hpfs/hpfs_fn.h | 6 ++----
fs/hpfs/super.c | 2 ++
2 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/fs/hpfs/hpfs_fn.h b/fs/hpfs/hpfs_fn.h
index ab2e7cc2ff33..1cca83218fb5 100644
--- a/fs/hpfs/hpfs_fn.h
+++ b/fs/hpfs/hpfs_fn.h
@@ -334,7 +334,7 @@ long hpfs_ioctl(struct file *file, unsigned cmd, unsigned long arg);
* local time (HPFS) to GMT (Unix)
*/
-static inline time64_t local_to_gmt(struct super_block *s, time32_t t)
+static inline time64_t local_to_gmt(struct super_block *s, time64_t t)
{
extern struct timezone sys_tz;
return t + sys_tz.tz_minuteswest * 60 + hpfs_sb(s)->sb_timeshift;
@@ -343,9 +343,7 @@ static inline time64_t local_to_gmt(struct super_block *s, time32_t t)
static inline time32_t gmt_to_local(struct super_block *s, time64_t t)
{
extern struct timezone sys_tz;
- t = t - sys_tz.tz_minuteswest * 60 - hpfs_sb(s)->sb_timeshift;
-
- return clamp_t(time64_t, t, 0, U32_MAX);
+ return t - sys_tz.tz_minuteswest * 60 - hpfs_sb(s)->sb_timeshift;
}
static inline time32_t local_get_seconds(struct super_block *s)
diff --git a/fs/hpfs/super.c b/fs/hpfs/super.c
index 9db6d84f0d62..0a677a9aaf34 100644
--- a/fs/hpfs/super.c
+++ b/fs/hpfs/super.c
@@ -614,6 +614,8 @@ static int hpfs_fill_super(struct super_block *s, void *options, int silent)
s->s_magic = HPFS_SUPER_MAGIC;
s->s_op = &hpfs_sops;
s->s_d_op = &hpfs_dentry_operations;
+ s->s_time_min = local_to_gmt(s, 0);
+ s->s_time_max = local_to_gmt(s, U32_MAX);
sbi->sb_root = le32_to_cpu(superblock->root);
sbi->sb_fs_size = le32_to_cpu(superblock->n_sectors);
--
2.17.1
^ permalink raw reply related [flat|nested] 29+ messages in thread
* [PATCH v8 18/20] fs: omfs: Initialize filesystem timestamp ranges
2019-08-18 16:57 [PATCH v8 00/20] vfs: Add support for timestamp limits Deepa Dinamani
` (16 preceding siblings ...)
2019-08-18 16:58 ` [PATCH v8 17/20] fs: hpfs: " Deepa Dinamani
@ 2019-08-18 16:58 ` Deepa Dinamani
2019-08-18 16:58 ` [PATCH v8 19/20] pstore: fs superblock limits Deepa Dinamani
` (2 subsequent siblings)
20 siblings, 0 replies; 29+ messages in thread
From: Deepa Dinamani @ 2019-08-18 16:58 UTC (permalink / raw)
To: viro, linux-kernel; +Cc: linux-fsdevel, y2038, arnd, me, linux-karma-devel
Fill in the appropriate limits to avoid inconsistencies
in the vfs cached inode times when timestamps are
outside the permitted range.
Signed-off-by: Deepa Dinamani <deepa.kernel@gmail.com>
Acked-by: Bob Copeland <me@bobcopeland.com>
Cc: me@bobcopeland.com
Cc: linux-karma-devel@lists.sourceforge.net
---
fs/omfs/inode.c | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/fs/omfs/inode.c b/fs/omfs/inode.c
index 08226a835ec3..b76ec6b88ded 100644
--- a/fs/omfs/inode.c
+++ b/fs/omfs/inode.c
@@ -478,6 +478,10 @@ static int omfs_fill_super(struct super_block *sb, void *data, int silent)
sb->s_maxbytes = 0xffffffff;
+ sb->s_time_gran = NSEC_PER_MSEC;
+ sb->s_time_min = 0;
+ sb->s_time_max = U64_MAX / MSEC_PER_SEC;
+
sb_set_blocksize(sb, 0x200);
bh = sb_bread(sb, 0);
--
2.17.1
^ permalink raw reply related [flat|nested] 29+ messages in thread
* [PATCH v8 19/20] pstore: fs superblock limits
2019-08-18 16:57 [PATCH v8 00/20] vfs: Add support for timestamp limits Deepa Dinamani
` (17 preceding siblings ...)
2019-08-18 16:58 ` [PATCH v8 18/20] fs: omfs: " Deepa Dinamani
@ 2019-08-18 16:58 ` Deepa Dinamani
2019-08-20 7:20 ` Kees Cook
2019-08-18 16:58 ` [PATCH v8 20/20] isofs: Initialize filesystem timestamp ranges Deepa Dinamani
2019-08-20 11:05 ` [PATCH v8 00/20] vfs: Add support for timestamp limits Jeff Layton
20 siblings, 1 reply; 29+ messages in thread
From: Deepa Dinamani @ 2019-08-18 16:58 UTC (permalink / raw)
To: viro, linux-kernel
Cc: linux-fsdevel, y2038, arnd, anton, ccross, keescook, tony.luck
Leaving granularity at 1ns because it is dependent on the specific
attached backing pstore module. ramoops has microsecond resolution.
Fix the readback of ramoops fractional timestamp microseconds,
which has incorrectly been reporting the value as nanoseconds since
3f8f80f0 ("pstore/ram: Read and write to the 'compressed' flag of pstore").
Signed-off-by: Deepa Dinamani <deepa.kernel@gmail.com>
Acked-by: Kees Cook <keescook@chromium.org>
Cc: anton@enomsg.org
Cc: ccross@android.com
Cc: keescook@chromium.org
Cc: tony.luck@intel.com
---
fs/pstore/ram.c | 2 ++
1 file changed, 2 insertions(+)
diff --git a/fs/pstore/ram.c b/fs/pstore/ram.c
index 2bb3468fc93a..8caff834f002 100644
--- a/fs/pstore/ram.c
+++ b/fs/pstore/ram.c
@@ -144,6 +144,7 @@ static int ramoops_read_kmsg_hdr(char *buffer, struct timespec64 *time,
if (sscanf(buffer, RAMOOPS_KERNMSG_HDR "%lld.%lu-%c\n%n",
(time64_t *)&time->tv_sec, &time->tv_nsec, &data_type,
&header_length) == 3) {
+ time->tv_nsec *= 1000;
if (data_type == 'C')
*compressed = true;
else
@@ -151,6 +152,7 @@ static int ramoops_read_kmsg_hdr(char *buffer, struct timespec64 *time,
} else if (sscanf(buffer, RAMOOPS_KERNMSG_HDR "%lld.%lu\n%n",
(time64_t *)&time->tv_sec, &time->tv_nsec,
&header_length) == 2) {
+ time->tv_nsec *= 1000;
*compressed = false;
} else {
time->tv_sec = 0;
--
2.17.1
^ permalink raw reply related [flat|nested] 29+ messages in thread
* [PATCH v8 20/20] isofs: Initialize filesystem timestamp ranges
2019-08-18 16:57 [PATCH v8 00/20] vfs: Add support for timestamp limits Deepa Dinamani
` (18 preceding siblings ...)
2019-08-18 16:58 ` [PATCH v8 19/20] pstore: fs superblock limits Deepa Dinamani
@ 2019-08-18 16:58 ` Deepa Dinamani
2019-08-20 11:05 ` [PATCH v8 00/20] vfs: Add support for timestamp limits Jeff Layton
20 siblings, 0 replies; 29+ messages in thread
From: Deepa Dinamani @ 2019-08-18 16:58 UTC (permalink / raw)
To: viro, linux-kernel; +Cc: linux-fsdevel, y2038, arnd
Fill in the appropriate limits to avoid inconsistencies
in the vfs cached inode times when timestamps are
outside the permitted range.
Reference: http://www.ecma-international.org/publications/standards/Ecma-119.htm
Signed-off-by: Deepa Dinamani <deepa.kernel@gmail.com>
---
fs/isofs/inode.c | 7 +++++++
1 file changed, 7 insertions(+)
diff --git a/fs/isofs/inode.c b/fs/isofs/inode.c
index 9e30d8703735..62c0462dc89f 100644
--- a/fs/isofs/inode.c
+++ b/fs/isofs/inode.c
@@ -30,6 +30,9 @@
#include "isofs.h"
#include "zisofs.h"
+/* max tz offset is 13 hours */
+#define MAX_TZ_OFFSET (52*15*60)
+
#define BEQUIET
static int isofs_hashi(const struct dentry *parent, struct qstr *qstr);
@@ -801,6 +804,10 @@ static int isofs_fill_super(struct super_block *s, void *data, int silent)
*/
s->s_maxbytes = 0x80000000000LL;
+ /* ECMA-119 timestamp from 1900/1/1 with tz offset */
+ s->s_time_min = mktime64(1900, 1, 1, 0, 0, 0) - MAX_TZ_OFFSET;
+ s->s_time_max = mktime64(U8_MAX+1900, 12, 31, 23, 59, 59) + MAX_TZ_OFFSET;
+
/* Set this for reference. Its not currently used except on write
which we don't have .. */
--
2.17.1
^ permalink raw reply related [flat|nested] 29+ messages in thread
* Re: [PATCH v8 03/20] timestamp_truncate: Replace users of timespec64_trunc
2019-08-18 16:58 ` [PATCH v8 03/20] timestamp_truncate: Replace users of timespec64_trunc Deepa Dinamani
@ 2019-08-18 18:34 ` Greg KH
0 siblings, 0 replies; 29+ messages in thread
From: Greg KH @ 2019-08-18 18:34 UTC (permalink / raw)
To: Deepa Dinamani
Cc: viro, linux-kernel, linux-fsdevel, y2038, arnd, adrian.hunter,
dedekind1, hch, jaegeuk, jlbec, richard, tj, yuchao0,
linux-f2fs-devel, linux-ntfs-dev, linux-mtd
On Sun, Aug 18, 2019 at 09:58:00AM -0700, Deepa Dinamani wrote:
> Update the inode timestamp updates to use timestamp_truncate()
> instead of timespec64_trunc().
>
> The change was mostly generated by the following coccinelle
> script.
>
> virtual context
> virtual patch
>
> @r1 depends on patch forall@
> struct inode *inode;
> identifier i_xtime =~ "^i_[acm]time$";
> expression e;
> @@
>
> inode->i_xtime =
> - timespec64_trunc(
> + timestamp_truncate(
> ...,
> - e);
> + inode);
>
> Signed-off-by: Deepa Dinamani <deepa.kernel@gmail.com>
> Cc: adrian.hunter@intel.com
> Cc: dedekind1@gmail.com
> Cc: gregkh@linuxfoundation.org
> Cc: hch@lst.de
> Cc: jaegeuk@kernel.org
> Cc: jlbec@evilplan.org
> Cc: richard@nod.at
> Cc: tj@kernel.org
> Cc: yuchao0@huawei.com
> Cc: linux-f2fs-devel@lists.sourceforge.net
> Cc: linux-ntfs-dev@lists.sourceforge.net
> Cc: linux-mtd@lists.infradead.org
> ---
> fs/attr.c | 21 ++++++++++++---------
> fs/configfs/inode.c | 12 ++++++------
> fs/f2fs/file.c | 21 ++++++++++++---------
> fs/kernfs/inode.c | 7 +++----
> fs/ntfs/inode.c | 21 ++++++++++++---------
> fs/ubifs/file.c | 21 ++++++++++++---------
> 6 files changed, 57 insertions(+), 46 deletions(-)
For kernfs:
Acked-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
^ permalink raw reply [flat|nested] 29+ messages in thread
* Re: [PATCH v8 19/20] pstore: fs superblock limits
2019-08-18 16:58 ` [PATCH v8 19/20] pstore: fs superblock limits Deepa Dinamani
@ 2019-08-20 7:20 ` Kees Cook
2019-08-21 0:03 ` Deepa Dinamani
0 siblings, 1 reply; 29+ messages in thread
From: Kees Cook @ 2019-08-20 7:20 UTC (permalink / raw)
To: Deepa Dinamani
Cc: viro, linux-kernel, linux-fsdevel, y2038, arnd, anton, ccross, tony.luck
On Sun, Aug 18, 2019 at 09:58:16AM -0700, Deepa Dinamani wrote:
> Leaving granularity at 1ns because it is dependent on the specific
> attached backing pstore module. ramoops has microsecond resolution.
>
> Fix the readback of ramoops fractional timestamp microseconds,
> which has incorrectly been reporting the value as nanoseconds since
> 3f8f80f0 ("pstore/ram: Read and write to the 'compressed' flag of pstore").
As such, this should also have:
Fixes: 3f8f80f0cfeb ("pstore/ram: Read and write to the 'compressed' flag of pstore")
> Signed-off-by: Deepa Dinamani <deepa.kernel@gmail.com>
> Acked-by: Kees Cook <keescook@chromium.org>
Also: this is going via some other tree, yes? (Or should I pick this up
for the pstore tree?)
Thanks!
-Kees
> Cc: anton@enomsg.org
> Cc: ccross@android.com
> Cc: keescook@chromium.org
> Cc: tony.luck@intel.com
> ---
> fs/pstore/ram.c | 2 ++
> 1 file changed, 2 insertions(+)
>
> diff --git a/fs/pstore/ram.c b/fs/pstore/ram.c
> index 2bb3468fc93a..8caff834f002 100644
> --- a/fs/pstore/ram.c
> +++ b/fs/pstore/ram.c
> @@ -144,6 +144,7 @@ static int ramoops_read_kmsg_hdr(char *buffer, struct timespec64 *time,
> if (sscanf(buffer, RAMOOPS_KERNMSG_HDR "%lld.%lu-%c\n%n",
> (time64_t *)&time->tv_sec, &time->tv_nsec, &data_type,
> &header_length) == 3) {
> + time->tv_nsec *= 1000;
> if (data_type == 'C')
> *compressed = true;
> else
> @@ -151,6 +152,7 @@ static int ramoops_read_kmsg_hdr(char *buffer, struct timespec64 *time,
> } else if (sscanf(buffer, RAMOOPS_KERNMSG_HDR "%lld.%lu\n%n",
> (time64_t *)&time->tv_sec, &time->tv_nsec,
> &header_length) == 2) {
> + time->tv_nsec *= 1000;
> *compressed = false;
> } else {
> time->tv_sec = 0;
> --
> 2.17.1
>
--
Kees Cook
^ permalink raw reply [flat|nested] 29+ messages in thread
* Re: [PATCH v8 00/20] vfs: Add support for timestamp limits
2019-08-18 16:57 [PATCH v8 00/20] vfs: Add support for timestamp limits Deepa Dinamani
` (19 preceding siblings ...)
2019-08-18 16:58 ` [PATCH v8 20/20] isofs: Initialize filesystem timestamp ranges Deepa Dinamani
@ 2019-08-20 11:05 ` Jeff Layton
20 siblings, 0 replies; 29+ messages in thread
From: Jeff Layton @ 2019-08-20 11:05 UTC (permalink / raw)
To: Deepa Dinamani, viro, linux-kernel
Cc: linux-fsdevel, y2038, arnd, adilger.kernel, adrian.hunter,
aivazian.tigran, al, anna.schumaker, anton, asmadeus, ccross,
ceph-devel, coda, codalist, darrick.wong, dedekind1, devel,
dsterba, dushistov, dwmw2, ericvh, gregkh, hch, hch, hirofumi,
hubcap, idryomov, jack, jaegeuk, jaharkes, jfs-discussion, jlbec,
keescook, linux-cifs, linux-ext4, linux-f2fs-devel,
linux-karma-devel, linux-mtd, linux-nfs, linux-ntfs-dev,
linux-xfs, lucho, luisbg, martin, me, mikulas, nico, phillip,
reiserfs-devel, richard, sage, salah.triki, sfrench, shaggy, tj,
tony.luck, trond.myklebust, tytso, v9fs-developer, yuchao0, zyan
On Sun, 2019-08-18 at 09:57 -0700, Deepa Dinamani wrote:
> The series is an update and a more complete version of the
> previously posted series at
> https://lore.kernel.org/linux-fsdevel/20180122020426.2988-1-deepa.kernel@gmail.com/
>
> Thanks to Arnd Bergmann for doing a few preliminary reviews.
> They helped me fix a few issues I had overlooked.
>
> The limits (sometimes granularity also) for the filesystems updated here are according to the
> following table:
>
> File system Time type Start year Expiration year Granularity
> cramfs fixed 0 0
> romfs fixed 0 0
> pstore ascii seconds (27 digit ascii) S64_MIN S64_MAX 1
> coda INT64 S64_MIN S64_MAX 1
> omfs 64-bit milliseconds 0 U64_MAX/ 1000 NSEC_PER_MSEC
> befs unsigned 48-bit seconds 0 0xffffffffffff alloc_super
> bfs unsigned 32-bit seconds 0 U32_MAX alloc_super
> efs unsigned 32-bit seconds 0 U32_MAX alloc_super
> ext2 signed 32-bit seconds S32_MIN S32_MAX alloc_super
> ext3 signed 32-bit seconds S32_MIN S32_MAX alloc_super
> ext4 (old) signed 32-bit seconds S32_MIN S32_MAX alloc_super
> ext4 (extra) 34-bit seconds, 30-bit ns S32_MIN 0x37fffffff 1
> freevxfs u32 secs/usecs 0 U32_MAX alloc_super
> jffs2 unsigned 32-bit seconds 0 U32_MAX alloc_super
> jfs unsigned 32-bit seconds/ns 0 U32_MAX 1
> minix unsigned 32-bit seconds 0 U32_MAX alloc_super
> orangefs u64 seconds 0 U64_MAX alloc_super
> qnx4 unsigned 32-bit seconds 0 U32_MAX alloc_super
> qnx6 unsigned 32-bit seconds 0 U32_MAX alloc_super
> reiserfs unsigned 32-bit seconds 0 U32_MAX alloc_super
> squashfs unsigned 32-bit seconds 0 U32_MAX alloc_super
> ufs1 signed 32-bit seconds S32_MIN S32_MAX NSEC_PER_SEC
> ufs2 signed 64-bit seconds/u32 ns S64_MIN S64_MAX 1
> xfs signed 32-bit seconds/ns S32_MIN S32_MAX 1
> ceph unsigned 32-bit second/ns 0 U32_MAX 1000
Looks reasonable, overall.
Note that the granularity changed recently for cephfs. See commit
0f7cf80ae96c2a (ceph: initialize superblock s_time_gran to 1).
In any case, you can add my Acked-by
--
Jeff Layton <jlayton@kernel.org>
^ permalink raw reply [flat|nested] 29+ messages in thread
* Re: [PATCH v8 06/20] fs: Fill in max and min timestamps in superblock
2019-08-18 16:58 ` [PATCH v8 06/20] fs: Fill in max and min timestamps in superblock Deepa Dinamani
@ 2019-08-20 11:28 ` Anders Larsen
[not found] ` <CAK+_RLmK0Vy79giAZnUCmmivvRT+GLZXyiMqBoFB0_Ed1W8BkA@mail.gmail.com>
1 sibling, 0 replies; 29+ messages in thread
From: Anders Larsen @ 2019-08-20 11:28 UTC (permalink / raw)
To: Deepa Dinamani
Cc: viro, linux-kernel, linux-fsdevel, y2038, arnd, aivazian.tigran,
coda, darrick.wong, dushistov, dwmw2, hch, jack, jaharkes,
luisbg, nico, phillip, richard, salah.triki, shaggy, linux-xfs,
codalist, linux-ext4, linux-mtd, jfs-discussion, reiserfs-devel
On Sunday, 2019-08-18 18:58 Deepa Dinamani wrote:
> Fill in the appropriate limits to avoid inconsistencies
> in the vfs cached inode times when timestamps are
> outside the permitted range.
>
> Even though some filesystems are read-only, fill in the
> timestamps to reflect the on-disk representation.
>
> Signed-off-by: Deepa Dinamani <deepa.kernel@gmail.com>
> Reviewed-by: Darrick J. Wong <darrick.wong@oracle.com>
> Cc: aivazian.tigran@gmail.com
> Cc: al@alarsen.net
> Cc: coda@cs.cmu.edu
> Cc: darrick.wong@oracle.com
> Cc: dushistov@mail.ru
> Cc: dwmw2@infradead.org
> Cc: hch@infradead.org
> Cc: jack@suse.com
> Cc: jaharkes@cs.cmu.edu
> Cc: luisbg@kernel.org
> Cc: nico@fluxnic.net
> Cc: phillip@squashfs.org.uk
> Cc: richard@nod.at
> Cc: salah.triki@gmail.com
> Cc: shaggy@kernel.org
> Cc: linux-xfs@vger.kernel.org
> Cc: codalist@coda.cs.cmu.edu
> Cc: linux-ext4@vger.kernel.org
> Cc: linux-mtd@lists.infradead.org
> Cc: jfs-discussion@lists.sourceforge.net
> Cc: reiserfs-devel@vger.kernel.org
> ---
> fs/befs/linuxvfs.c | 2 ++
> fs/bfs/inode.c | 2 ++
> fs/coda/inode.c | 3 +++
> fs/cramfs/inode.c | 2 ++
> fs/efs/super.c | 2 ++
> fs/ext2/super.c | 2 ++
> fs/freevxfs/vxfs_super.c | 2 ++
> fs/jffs2/fs.c | 3 +++
> fs/jfs/super.c | 2 ++
> fs/minix/inode.c | 2 ++
> fs/qnx4/inode.c | 2 ++
wrt qnx4, feel free to add
Acked-by: Anders Larsen <al@alarsen.net>
^ permalink raw reply [flat|nested] 29+ messages in thread
* Re: [PATCH v8 06/20] fs: Fill in max and min timestamps in superblock
[not found] ` <CAK+_RLmK0Vy79giAZnUCmmivvRT+GLZXyiMqBoFB0_Ed1W8BkA@mail.gmail.com>
@ 2019-08-20 12:28 ` Tigran Aivazian
0 siblings, 0 replies; 29+ messages in thread
From: Tigran Aivazian @ 2019-08-20 12:28 UTC (permalink / raw)
To: Deepa Dinamani; +Cc: LKML, linux-fsdevel, linux-xfs, linux-mtd, reiserfs-devel
I see no problems for BFS.
Acked-By: Tigran Aivazian <aivazian.tigran@gmail.com>
^ permalink raw reply [flat|nested] 29+ messages in thread
* Re: [PATCH v8 08/20] adfs: Fill in max and min timestamps in sb
2019-08-18 16:58 ` [PATCH v8 08/20] adfs: Fill in max and min " Deepa Dinamani
@ 2019-08-20 16:28 ` Matthew Wilcox
2019-08-20 23:55 ` Deepa Dinamani
0 siblings, 1 reply; 29+ messages in thread
From: Matthew Wilcox @ 2019-08-20 16:28 UTC (permalink / raw)
To: Deepa Dinamani; +Cc: viro, linux-kernel, linux-fsdevel, y2038, arnd
On Sun, Aug 18, 2019 at 09:58:05AM -0700, Deepa Dinamani wrote:
> Note that the min timestamp is assumed to be
> 01 Jan 1970 00:00:00 (Unix epoch). This is consistent
> with the way we convert timestamps in adfs_adfs2unix_time().
That's not actually correct. RISC OS timestamps are centiseconds since
1900 stored in 5 bytes.
> Signed-off-by: Deepa Dinamani <deepa.kernel@gmail.com>
> ---
> fs/adfs/adfs.h | 13 +++++++++++++
> fs/adfs/inode.c | 8 ++------
> fs/adfs/super.c | 2 ++
> 3 files changed, 17 insertions(+), 6 deletions(-)
>
> diff --git a/fs/adfs/adfs.h b/fs/adfs/adfs.h
> index b7e844d2f321..dca8b23aa43f 100644
> --- a/fs/adfs/adfs.h
> +++ b/fs/adfs/adfs.h
> @@ -3,6 +3,19 @@
> #include <linux/fs.h>
> #include <linux/adfs_fs.h>
>
> +/*
> + * 01 Jan 1970 00:00:00 (Unix epoch) as seconds since
> + * 01 Jan 1900 00:00:00 (RISC OS epoch)
> + */
> +#define RISC_OS_EPOCH_DELTA 2208988800LL
> +
> +/*
> + * Convert 40 bit centi seconds to seconds
> + * since 01 Jan 1900 00:00:00 (RISC OS epoch)
> + * The result is 2248-06-03 06:57:57 GMT
> + */
> +#define ADFS_MAX_TIMESTAMP ((0xFFFFFFFFFFLL / 100) - RISC_OS_EPOCH_DELTA)
> +
> /* Internal data structures for ADFS */
>
> #define ADFS_FREE_FRAG 0
> diff --git a/fs/adfs/inode.c b/fs/adfs/inode.c
> index 124de75413a5..41eca1c451dc 100644
> --- a/fs/adfs/inode.c
> +++ b/fs/adfs/inode.c
> @@ -167,11 +167,7 @@ static void
> adfs_adfs2unix_time(struct timespec64 *tv, struct inode *inode)
> {
> unsigned int high, low;
> - /* 01 Jan 1970 00:00:00 (Unix epoch) as nanoseconds since
> - * 01 Jan 1900 00:00:00 (RISC OS epoch)
> - */
> - static const s64 nsec_unix_epoch_diff_risc_os_epoch =
> - 2208988800000000000LL;
> + static const s64 nsec_unix_epoch_diff_risc_os_epoch = RISC_OS_EPOCH_DELTA * NSEC_PER_SEC;
> s64 nsec;
>
> if (!adfs_inode_is_stamped(inode))
> @@ -216,7 +212,7 @@ adfs_unix2adfs_time(struct inode *inode, unsigned int secs)
> if (adfs_inode_is_stamped(inode)) {
> /* convert 32-bit seconds to 40-bit centi-seconds */
> low = (secs & 255) * 100;
> - high = (secs / 256) * 100 + (low >> 8) + 0x336e996a;
> + high = (secs / 256) * 100 + (low >> 8) + (RISC_OS_EPOCH_DELTA*100/256);
>
> ADFS_I(inode)->loadaddr = (high >> 24) |
> (ADFS_I(inode)->loadaddr & ~0xff);
> diff --git a/fs/adfs/super.c b/fs/adfs/super.c
> index 65b04ebb51c3..f074fe7d7158 100644
> --- a/fs/adfs/super.c
> +++ b/fs/adfs/super.c
> @@ -463,6 +463,8 @@ static int adfs_fill_super(struct super_block *sb, void *data, int silent)
> asb->s_map_size = dr->nzones | (dr->nzones_high << 8);
> asb->s_map2blk = dr->log2bpmb - dr->log2secsize;
> asb->s_log2sharesize = dr->log2sharesize;
> + sb->s_time_min = 0;
> + sb->s_time_max = ADFS_MAX_TIMESTAMP;
>
> asb->s_map = adfs_read_map(sb, dr);
> if (IS_ERR(asb->s_map)) {
> --
> 2.17.1
>
^ permalink raw reply [flat|nested] 29+ messages in thread
* Re: [PATCH v8 08/20] adfs: Fill in max and min timestamps in sb
2019-08-20 16:28 ` Matthew Wilcox
@ 2019-08-20 23:55 ` Deepa Dinamani
0 siblings, 0 replies; 29+ messages in thread
From: Deepa Dinamani @ 2019-08-20 23:55 UTC (permalink / raw)
To: Matthew Wilcox
Cc: Alexander Viro, Linux Kernel Mailing List,
Linux FS-devel Mailing List, y2038 Mailman List, Arnd Bergmann
On Tue, Aug 20, 2019 at 9:28 AM Matthew Wilcox <willy@infradead.org> wrote:
>
> On Sun, Aug 18, 2019 at 09:58:05AM -0700, Deepa Dinamani wrote:
> > Note that the min timestamp is assumed to be
> > 01 Jan 1970 00:00:00 (Unix epoch). This is consistent
> > with the way we convert timestamps in adfs_adfs2unix_time().
>
> That's not actually correct. RISC OS timestamps are centiseconds since
> 1900 stored in 5 bytes.
The timestamp can hold earlier values but the fs implementation
explicitly rejects those in adfs_adfs2unix_time() too_early check.
We could fix the implementation to not throw away times before 1970.
Are you suggesting we want to do this?
I could post a separate patch to fix this or we could do it as part of
the series.
static void
adfs_adfs2unix_time(struct timespec64 *tv, struct inode *inode)
{
unsigned int high, low;
static const s64 nsec_unix_epoch_diff_risc_os_epoch =
RISC_OS_EPOCH_DELTA * NSEC_PER_SEC;
s64 nsec;
if (!adfs_inode_is_stamped(inode))
goto cur_time;
high = ADFS_I(inode)->loadaddr & 0xFF; /* top 8 bits of timestamp */
low = ADFS_I(inode)->execaddr; /* bottom 32 bits of timestamp */
/* convert 40-bit centi-seconds to 32-bit seconds
* going via nanoseconds to retain precision
*/
nsec = (((s64) high << 32) | (s64) low) * 10000000; /* cs to ns */
/* Files dated pre 01 Jan 1970 00:00:00. */
if (nsec < nsec_unix_epoch_diff_risc_os_epoch)
goto too_early;
/* convert from RISC OS to Unix epoch */
nsec -= nsec_unix_epoch_diff_risc_os_epoch;
*tv = ns_to_timespec64(nsec);
return;
cur_time:
*tv = current_time(inode);
return;
too_early:
tv->tv_sec = tv->tv_nsec = 0;
return;
}
-Deepa
^ permalink raw reply [flat|nested] 29+ messages in thread
* Re: [PATCH v8 19/20] pstore: fs superblock limits
2019-08-20 7:20 ` Kees Cook
@ 2019-08-21 0:03 ` Deepa Dinamani
0 siblings, 0 replies; 29+ messages in thread
From: Deepa Dinamani @ 2019-08-21 0:03 UTC (permalink / raw)
To: Kees Cook
Cc: Alexander Viro, Linux Kernel Mailing List,
Linux FS-devel Mailing List, y2038 Mailman List, Arnd Bergmann,
Anton Vorontsov, Colin Cross, Tony Luck
On Tue, Aug 20, 2019 at 12:20 AM Kees Cook <keescook@chromium.org> wrote:
>
> On Sun, Aug 18, 2019 at 09:58:16AM -0700, Deepa Dinamani wrote:
> > Leaving granularity at 1ns because it is dependent on the specific
> > attached backing pstore module. ramoops has microsecond resolution.
> >
> > Fix the readback of ramoops fractional timestamp microseconds,
> > which has incorrectly been reporting the value as nanoseconds since
> > 3f8f80f0 ("pstore/ram: Read and write to the 'compressed' flag of pstore").
>
> As such, this should also have:
>
> Fixes: 3f8f80f0cfeb ("pstore/ram: Read and write to the 'compressed' flag of pstore")
Will add that in. Thanks.
> > Signed-off-by: Deepa Dinamani <deepa.kernel@gmail.com>
> > Acked-by: Kees Cook <keescook@chromium.org>
>
> Also: this is going via some other tree, yes? (Or should I pick this up
> for the pstore tree?)
I am hoping Al can take the series as a whole.
-Deepa
^ permalink raw reply [flat|nested] 29+ messages in thread
end of thread, other threads:[~2019-08-21 0:03 UTC | newest]
Thread overview: 29+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-08-18 16:57 [PATCH v8 00/20] vfs: Add support for timestamp limits Deepa Dinamani
2019-08-18 16:57 ` [PATCH v8 01/20] vfs: Add file timestamp range support Deepa Dinamani
2019-08-18 16:57 ` [PATCH v8 02/20] vfs: Add timestamp_truncate() api Deepa Dinamani
2019-08-18 16:58 ` [PATCH v8 03/20] timestamp_truncate: Replace users of timespec64_trunc Deepa Dinamani
2019-08-18 18:34 ` Greg KH
2019-08-18 16:58 ` [PATCH v8 04/20] mount: Add mount warning for impending timestamp expiry Deepa Dinamani
2019-08-18 16:58 ` [PATCH v8 05/20] utimes: Clamp the timestamps before update Deepa Dinamani
2019-08-18 16:58 ` [PATCH v8 06/20] fs: Fill in max and min timestamps in superblock Deepa Dinamani
2019-08-20 11:28 ` Anders Larsen
[not found] ` <CAK+_RLmK0Vy79giAZnUCmmivvRT+GLZXyiMqBoFB0_Ed1W8BkA@mail.gmail.com>
2019-08-20 12:28 ` Tigran Aivazian
2019-08-18 16:58 ` [PATCH v8 07/20] 9p: Fill min and max timestamps in sb Deepa Dinamani
2019-08-18 16:58 ` [PATCH v8 08/20] adfs: Fill in max and min " Deepa Dinamani
2019-08-20 16:28 ` Matthew Wilcox
2019-08-20 23:55 ` Deepa Dinamani
2019-08-18 16:58 ` [PATCH v8 09/20] ext4: Initialize timestamps limits Deepa Dinamani
2019-08-18 16:58 ` [PATCH v8 10/20] fs: nfs: Initialize filesystem timestamp ranges Deepa Dinamani
2019-08-18 16:58 ` [PATCH v8 11/20] fs: cifs: " Deepa Dinamani
2019-08-18 16:58 ` [PATCH v8 12/20] fs: fat: " Deepa Dinamani
2019-08-18 16:58 ` [PATCH v8 13/20] fs: affs: " Deepa Dinamani
2019-08-18 16:58 ` [PATCH v8 14/20] fs: sysv: " Deepa Dinamani
2019-08-18 16:58 ` [PATCH v8 15/20] fs: ceph: " Deepa Dinamani
2019-08-18 16:58 ` [PATCH v8 16/20] fs: orangefs: " Deepa Dinamani
2019-08-18 16:58 ` [PATCH v8 17/20] fs: hpfs: " Deepa Dinamani
2019-08-18 16:58 ` [PATCH v8 18/20] fs: omfs: " Deepa Dinamani
2019-08-18 16:58 ` [PATCH v8 19/20] pstore: fs superblock limits Deepa Dinamani
2019-08-20 7:20 ` Kees Cook
2019-08-21 0:03 ` Deepa Dinamani
2019-08-18 16:58 ` [PATCH v8 20/20] isofs: Initialize filesystem timestamp ranges Deepa Dinamani
2019-08-20 11:05 ` [PATCH v8 00/20] vfs: Add support for timestamp limits Jeff Layton
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).