* [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 2019-08-20 11:05 ` [PATCH v8 00/20] vfs: Add support for timestamp limits Jeff Layton 0 siblings, 2 replies; 6+ 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 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] 6+ 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-20 12:22 ` Tigran Aivazian 2019-08-20 11:05 ` [PATCH v8 00/20] vfs: Add support for timestamp limits Jeff Layton 1 sibling, 2 replies; 6+ 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] 6+ 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 2019-08-20 12:22 ` Tigran Aivazian 1 sibling, 0 replies; 6+ messages in thread From: Anders Larsen @ 2019-08-20 11:28 UTC (permalink / raw) To: Deepa Dinamani Cc: shaggy, jfs-discussion, linux-mtd, darrick.wong, y2038, richard, codalist, hch, coda, linux-ext4, salah.triki, dushistov, arnd, reiserfs-devel, viro, aivazian.tigran, jaharkes, luisbg, nico, linux-kernel, linux-xfs, jack, linux-fsdevel, phillip, dwmw2 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> _______________________________________________ Y2038 mailing list Y2038@lists.linaro.org https://lists.linaro.org/mailman/listinfo/y2038 ^ permalink raw reply [flat|nested] 6+ 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 @ 2019-08-20 12:22 ` Tigran Aivazian 2019-08-20 12:28 ` Tigran Aivazian 1 sibling, 1 reply; 6+ messages in thread From: Tigran Aivazian @ 2019-08-20 12:22 UTC (permalink / raw) To: Deepa Dinamani Cc: shaggy, jfs-discussion, al, linux-mtd, darrick.wong, y2038, richard, codalist, hch, coda, linux-ext4, salah.triki, dushistov, arnd, reiserfs-devel, Al Viro, jaharkes, luisbg, nico, LKML, linux-xfs, jack, linux-fsdevel, phillip, dwmw2 I see no problems for BFS. Acked-By: Tigran Aivazian <aivazian.tigran@gmail.com> On Sun, 18 Aug 2019 at 17:59, Deepa Dinamani <deepa.kernel@gmail.com> 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 ++ > 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 > > _______________________________________________ Y2038 mailing list Y2038@lists.linaro.org https://lists.linaro.org/mailman/listinfo/y2038 ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH v8 06/20] fs: Fill in max and min timestamps in superblock 2019-08-20 12:22 ` Tigran Aivazian @ 2019-08-20 12:28 ` Tigran Aivazian 0 siblings, 0 replies; 6+ 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] 6+ 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-20 11:05 ` Jeff Layton 1 sibling, 0 replies; 6+ 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 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] 6+ messages in thread
end of thread, other threads:[~2019-08-20 12:28 UTC | newest] Thread overview: 6+ 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-20 12:22 ` Tigran Aivazian 2019-08-20 12:28 ` Tigran Aivazian 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).