fs: Fill in max and min timestamps in superblock
authorDeepa Dinamani <deepa.kernel@gmail.com>
Tue, 30 Jul 2019 15:22:29 +0000 (08:22 -0700)
committerDeepa Dinamani <deepa.kernel@gmail.com>
Fri, 30 Aug 2019 14:27:17 +0000 (07:27 -0700)
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>
Acked-By: Tigran Aivazian <aivazian.tigran@gmail.com>
Acked-by: Jeff Layton <jlayton@kernel.org>
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
17 files changed:
fs/befs/linuxvfs.c
fs/bfs/inode.c
fs/coda/inode.c
fs/cramfs/inode.c
fs/efs/super.c
fs/ext2/super.c
fs/freevxfs/vxfs_super.c
fs/jffs2/fs.c
fs/jfs/super.c
fs/minix/inode.c
fs/qnx4/inode.c
fs/qnx6/inode.c
fs/reiserfs/super.c
fs/romfs/super.c
fs/squashfs/super.c
fs/ufs/super.c
fs/xfs/xfs_super.c

index 462d096ff3e976c2dfaa9c6846fc72189c98a197..64cdf4d8e424513607a7401672b3b0d92d0813c0 100644 (file)
@@ -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);
index 5e97bed073d7f00f506e6c39c355dfc86982a913..f8ce1368218b2333106f460d6a021b2d5eb61ae6 100644 (file)
@@ -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);
 
index 321f56e487cbe575904ded73ba1780fed6804804..b1c70e2b9b1e6e7bdebd993708931e4ec22ace74 100644 (file)
@@ -188,6 +188,9 @@ static int coda_fill_super(struct super_block *sb, void *data, int silent)
        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)
index 9352487bd0fc660f99f67407e323724cf2ff4b76..4d1d8b7761ed0f06622981bbe2dd66e5f37ce079 100644 (file)
@@ -597,6 +597,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))
index 867fc24dee207e0ec0a4c8eecd5c80132962565f..4a6ebff2af76f37678e0d1bae5bff8cf9787d6c4 100644 (file)
@@ -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)) {
index 44eb6e7eb492f2fc302cbe0652fd83269e7d2950..baa36c6fb71e44405f8ac23edc39918c65eb75f7 100644 (file)
@@ -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;
index a89f68c3cbed7b279702fa58876c5200cabc2d72..578a5062706ee9db9aaa43005276ccefd0680cbc 100644 (file)
@@ -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))) {
index 8a20ddd25f2da4b2b2cf6ad229097682dad006f0..d0b59d03a7a992f6370e598ec69671fbaa1a43bb 100644 (file)
@@ -590,6 +590,9 @@ int jffs2_do_fill_super(struct super_block *sb, void *data, int silent)
        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;
index f4e10cb9f734a3f1de1bd47a08340247bd273ad1..b2dc4d1f9dcc559117e0a5bcdd38676e873d3e53 100644 (file)
@@ -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;
index f96073f2543297ed94883eacdd2835f869d14480..7cb5fd38eb149ffebd76aa68e61990cbf52820c8 100644 (file)
@@ -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);
index 922d083bbc7c236e39be5991d88c04753e85dd64..e8da1cde87b9be255025cc138ab45853b0209867 100644 (file)
@@ -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
index 0f8b0ff1ba4327b3bbd2cc8792b5a71a1500ff91..345db56c98fd7dbf31e3be56bc96c1ac66d8e849 100644 (file)
@@ -429,6 +429,8 @@ mmi_success:
        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);
index ab028ea0e5616a9de27a7fe9cfb1744d9dc98d1e..d69b4ac0ae2f3e3ce3d3a61a09cd3041ba72c9b9 100644 (file)
@@ -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
index 7d580f7c3f1d01e6e149c6d56576ef32f20cdeee..a42c0e3079dc0705c7ac49de4fbc88ab74313417 100644 (file)
@@ -478,6 +478,8 @@ static int romfs_fill_super(struct super_block *sb, void *data, int silent)
        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
index effa638d6d85b8fe1331f85605cc2fe753ad3517..a9e9837617a9fd7399e5e21d9c1dca9d77c8b005 100644 (file)
@@ -183,6 +183,8 @@ static int squashfs_fill_super(struct super_block *sb, void *data, int silent)
                (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;
 
index 4ed0dca52ec861893f637fd5f529b03474a78da0..1da0be667409b2cdc302e2cb2b9291bad2842ba6 100644 (file)
@@ -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;
                
index f9450235533cc4fcbeab7c3f5aba5f6a38cf1e99..d3b10900fc247d5eaa27d250b2cfc171851155d6 100644 (file)
@@ -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);