* [PATCH v8 00/20] vfs: Add support for timestamp limits
@ 2019-08-18 16:57 Deepa Dinamani
2019-08-18 16:58 ` [PATCH v8 06/20] fs: Fill in max and min timestamps in superblock Deepa Dinamani
` (2 more replies)
0 siblings, 3 replies; 5+ 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] 5+ 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
@ 2019-08-18 16:58 ` Deepa Dinamani
2019-08-20 11:28 ` Anders Larsen
2019-08-18 16:58 ` [PATCH v8 09/20] ext4: Initialize timestamps limits Deepa Dinamani
2019-08-20 11:05 ` [PATCH v8 00/20] vfs: Add support for timestamp limits Jeff Layton
2 siblings, 1 reply; 5+ 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] 5+ 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
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-20 11:05 ` [PATCH v8 00/20] vfs: Add support for timestamp limits Jeff Layton
2 siblings, 0 replies; 5+ 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] 5+ 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
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 ` [PATCH v8 09/20] ext4: Initialize timestamps limits Deepa Dinamani
@ 2019-08-20 11:05 ` Jeff Layton
2 siblings, 0 replies; 5+ 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] 5+ 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
0 siblings, 0 replies; 5+ 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] 5+ messages in thread
end of thread, other threads:[~2019-08-20 11:35 UTC | newest]
Thread overview: 5+ 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:58 ` [PATCH v8 06/20] fs: Fill in max and min timestamps in superblock Deepa Dinamani
2019-08-20 11:28 ` Anders Larsen
2019-08-18 16:58 ` [PATCH v8 09/20] ext4: Initialize timestamps limits 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).