summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDeepa Dinamani <deepa.kernel@gmail.com>2019-07-30 11:22:29 -0400
committerDeepa Dinamani <deepa.kernel@gmail.com>2019-08-30 10:27:17 -0400
commit22b139691f9eb8b9d0bfd7341fa7436cb7a9491d (patch)
tree88aae8aa596da5e85b5628759d83601277b0cc72
parent42e729b9ddbbc40e5732f062ef2fa0554c652fb5 (diff)
fs: Fill in max and min timestamps in superblock
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
-rw-r--r--fs/befs/linuxvfs.c2
-rw-r--r--fs/bfs/inode.c2
-rw-r--r--fs/coda/inode.c3
-rw-r--r--fs/cramfs/inode.c2
-rw-r--r--fs/efs/super.c2
-rw-r--r--fs/ext2/super.c2
-rw-r--r--fs/freevxfs/vxfs_super.c2
-rw-r--r--fs/jffs2/fs.c3
-rw-r--r--fs/jfs/super.c2
-rw-r--r--fs/minix/inode.c2
-rw-r--r--fs/qnx4/inode.c2
-rw-r--r--fs/qnx6/inode.c2
-rw-r--r--fs/reiserfs/super.c3
-rw-r--r--fs/romfs/super.c2
-rw-r--r--fs/squashfs/super.c2
-rw-r--r--fs/ufs/super.c7
-rw-r--r--fs/xfs/xfs_super.c2
17 files changed, 42 insertions, 0 deletions
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)
893 sb_set_blocksize(sb, (ulong) befs_sb->block_size); 893 sb_set_blocksize(sb, (ulong) befs_sb->block_size);
894 sb->s_op = &befs_sops; 894 sb->s_op = &befs_sops;
895 sb->s_export_op = &befs_export_operations; 895 sb->s_export_op = &befs_export_operations;
896 sb->s_time_min = 0;
897 sb->s_time_max = 0xffffffffffffll;
896 root = befs_iget(sb, iaddr2blockno(sb, &(befs_sb->root_dir))); 898 root = befs_iget(sb, iaddr2blockno(sb, &(befs_sb->root_dir)));
897 if (IS_ERR(root)) { 899 if (IS_ERR(root)) {
898 ret = PTR_ERR(root); 900 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)
324 return -ENOMEM; 324 return -ENOMEM;
325 mutex_init(&info->bfs_lock); 325 mutex_init(&info->bfs_lock);
326 s->s_fs_info = info; 326 s->s_fs_info = info;
327 s->s_time_min = 0;
328 s->s_time_max = U32_MAX;
327 329
328 sb_set_blocksize(s, BFS_BSIZE); 330 sb_set_blocksize(s, BFS_BSIZE);
329 331
diff --git a/fs/coda/inode.c b/fs/coda/inode.c
index 321f56e487cb..b1c70e2b9b1e 100644
--- a/fs/coda/inode.c
+++ b/fs/coda/inode.c
@@ -188,6 +188,9 @@ static int coda_fill_super(struct super_block *sb, void *data, int silent)
188 sb->s_magic = CODA_SUPER_MAGIC; 188 sb->s_magic = CODA_SUPER_MAGIC;
189 sb->s_op = &coda_super_operations; 189 sb->s_op = &coda_super_operations;
190 sb->s_d_op = &coda_dentry_operations; 190 sb->s_d_op = &coda_dentry_operations;
191 sb->s_time_gran = 1;
192 sb->s_time_min = S64_MIN;
193 sb->s_time_max = S64_MAX;
191 194
192 error = super_setup_bdi(sb); 195 error = super_setup_bdi(sb);
193 if (error) 196 if (error)
diff --git a/fs/cramfs/inode.c b/fs/cramfs/inode.c
index 9352487bd0fc..4d1d8b7761ed 100644
--- a/fs/cramfs/inode.c
+++ b/fs/cramfs/inode.c
@@ -597,6 +597,8 @@ static int cramfs_finalize_super(struct super_block *sb,
597 597
598 /* Set it all up.. */ 598 /* Set it all up.. */
599 sb->s_flags |= SB_RDONLY; 599 sb->s_flags |= SB_RDONLY;
600 sb->s_time_min = 0;
601 sb->s_time_max = 0;
600 sb->s_op = &cramfs_ops; 602 sb->s_op = &cramfs_ops;
601 root = get_cramfs_inode(sb, cramfs_root, 0); 603 root = get_cramfs_inode(sb, cramfs_root, 0);
602 if (IS_ERR(root)) 604 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)
257 if (!sb) 257 if (!sb)
258 return -ENOMEM; 258 return -ENOMEM;
259 s->s_fs_info = sb; 259 s->s_fs_info = sb;
260 s->s_time_min = 0;
261 s->s_time_max = U32_MAX;
260 262
261 s->s_magic = EFS_SUPER_MAGIC; 263 s->s_magic = EFS_SUPER_MAGIC;
262 if (!sb_set_blocksize(s, EFS_BLOCKSIZE)) { 264 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)
1002 1002
1003 sb->s_maxbytes = ext2_max_size(sb->s_blocksize_bits); 1003 sb->s_maxbytes = ext2_max_size(sb->s_blocksize_bits);
1004 sb->s_max_links = EXT2_LINK_MAX; 1004 sb->s_max_links = EXT2_LINK_MAX;
1005 sb->s_time_min = S32_MIN;
1006 sb->s_time_max = S32_MAX;
1005 1007
1006 if (le32_to_cpu(es->s_rev_level) == EXT2_GOOD_OLD_REV) { 1008 if (le32_to_cpu(es->s_rev_level) == EXT2_GOOD_OLD_REV) {
1007 sbi->s_inode_size = EXT2_GOOD_OLD_INODE_SIZE; 1009 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)
229 229
230 sbp->s_op = &vxfs_super_ops; 230 sbp->s_op = &vxfs_super_ops;
231 sbp->s_fs_info = infp; 231 sbp->s_fs_info = infp;
232 sbp->s_time_min = 0;
233 sbp->s_time_max = U32_MAX;
232 234
233 if (!vxfs_try_sb_magic(sbp, silent, 1, 235 if (!vxfs_try_sb_magic(sbp, silent, 1,
234 (__force __fs32)cpu_to_le32(VXFS_SUPER_MAGIC))) { 236 (__force __fs32)cpu_to_le32(VXFS_SUPER_MAGIC))) {
diff --git a/fs/jffs2/fs.c b/fs/jffs2/fs.c
index 8a20ddd25f2d..d0b59d03a7a9 100644
--- a/fs/jffs2/fs.c
+++ b/fs/jffs2/fs.c
@@ -590,6 +590,9 @@ int jffs2_do_fill_super(struct super_block *sb, void *data, int silent)
590 sb->s_blocksize = PAGE_SIZE; 590 sb->s_blocksize = PAGE_SIZE;
591 sb->s_blocksize_bits = PAGE_SHIFT; 591 sb->s_blocksize_bits = PAGE_SHIFT;
592 sb->s_magic = JFFS2_SUPER_MAGIC; 592 sb->s_magic = JFFS2_SUPER_MAGIC;
593 sb->s_time_min = 0;
594 sb->s_time_max = U32_MAX;
595
593 if (!sb_rdonly(sb)) 596 if (!sb_rdonly(sb))
594 jffs2_start_garbage_collect_thread(c); 597 jffs2_start_garbage_collect_thread(c);
595 return 0; 598 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)
503 503
504 sb->s_fs_info = sbi; 504 sb->s_fs_info = sbi;
505 sb->s_max_links = JFS_LINK_MAX; 505 sb->s_max_links = JFS_LINK_MAX;
506 sb->s_time_min = 0;
507 sb->s_time_max = U32_MAX;
506 sbi->sb = sb; 508 sbi->sb = sb;
507 sbi->uid = INVALID_UID; 509 sbi->uid = INVALID_UID;
508 sbi->gid = INVALID_GID; 510 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)
277 277
278 /* set up enough so that it can read an inode */ 278 /* set up enough so that it can read an inode */
279 s->s_op = &minix_sops; 279 s->s_op = &minix_sops;
280 s->s_time_min = 0;
281 s->s_time_max = U32_MAX;
280 root_inode = minix_iget(s, MINIX_ROOT_INO); 282 root_inode = minix_iget(s, MINIX_ROOT_INO);
281 if (IS_ERR(root_inode)) { 283 if (IS_ERR(root_inode)) {
282 ret = PTR_ERR(root_inode); 284 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)
201 s->s_op = &qnx4_sops; 201 s->s_op = &qnx4_sops;
202 s->s_magic = QNX4_SUPER_MAGIC; 202 s->s_magic = QNX4_SUPER_MAGIC;
203 s->s_flags |= SB_RDONLY; /* Yup, read-only yet */ 203 s->s_flags |= SB_RDONLY; /* Yup, read-only yet */
204 s->s_time_min = 0;
205 s->s_time_max = U32_MAX;
204 206
205 /* Check the superblock signature. Since the qnx4 code is 207 /* Check the superblock signature. Since the qnx4 code is
206 dangerous, we should leave as quickly as possible 208 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 @@ mmi_success:
429 s->s_op = &qnx6_sops; 429 s->s_op = &qnx6_sops;
430 s->s_magic = QNX6_SUPER_MAGIC; 430 s->s_magic = QNX6_SUPER_MAGIC;
431 s->s_flags |= SB_RDONLY; /* Yup, read-only yet */ 431 s->s_flags |= SB_RDONLY; /* Yup, read-only yet */
432 s->s_time_min = 0;
433 s->s_time_max = U32_MAX;
432 434
433 /* ease the later tree level calculations */ 435 /* ease the later tree level calculations */
434 sbi = QNX6_SB(s); 436 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)
1976 goto error_unlocked; 1976 goto error_unlocked;
1977 } 1977 }
1978 1978
1979 s->s_time_min = 0;
1980 s->s_time_max = U32_MAX;
1981
1979 rs = SB_DISK_SUPER_BLOCK(s); 1982 rs = SB_DISK_SUPER_BLOCK(s);
1980 /* 1983 /*
1981 * Let's do basic sanity check to verify that underlying device is not 1984 * 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 7d580f7c3f1d..a42c0e3079dc 100644
--- a/fs/romfs/super.c
+++ b/fs/romfs/super.c
@@ -478,6 +478,8 @@ static int romfs_fill_super(struct super_block *sb, void *data, int silent)
478 sb->s_maxbytes = 0xFFFFFFFF; 478 sb->s_maxbytes = 0xFFFFFFFF;
479 sb->s_magic = ROMFS_MAGIC; 479 sb->s_magic = ROMFS_MAGIC;
480 sb->s_flags |= SB_RDONLY | SB_NOATIME; 480 sb->s_flags |= SB_RDONLY | SB_NOATIME;
481 sb->s_time_min = 0;
482 sb->s_time_max = 0;
481 sb->s_op = &romfs_super_ops; 483 sb->s_op = &romfs_super_ops;
482 484
483#ifdef CONFIG_ROMFS_ON_MTD 485#ifdef CONFIG_ROMFS_ON_MTD
diff --git a/fs/squashfs/super.c b/fs/squashfs/super.c
index effa638d6d85..a9e9837617a9 100644
--- a/fs/squashfs/super.c
+++ b/fs/squashfs/super.c
@@ -183,6 +183,8 @@ static int squashfs_fill_super(struct super_block *sb, void *data, int silent)
183 (u64) le64_to_cpu(sblk->id_table_start)); 183 (u64) le64_to_cpu(sblk->id_table_start));
184 184
185 sb->s_maxbytes = MAX_LFS_FILESIZE; 185 sb->s_maxbytes = MAX_LFS_FILESIZE;
186 sb->s_time_min = 0;
187 sb->s_time_max = U32_MAX;
186 sb->s_flags |= SB_RDONLY; 188 sb->s_flags |= SB_RDONLY;
187 sb->s_op = &squashfs_super_ops; 189 sb->s_op = &squashfs_super_ops;
188 190
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)
843 843
844 sb->s_maxbytes = MAX_LFS_FILESIZE; 844 sb->s_maxbytes = MAX_LFS_FILESIZE;
845 845
846 sb->s_time_gran = NSEC_PER_SEC;
847 sb->s_time_min = S32_MIN;
848 sb->s_time_max = S32_MAX;
849
846 switch (sbi->s_mount_opt & UFS_MOUNT_UFSTYPE) { 850 switch (sbi->s_mount_opt & UFS_MOUNT_UFSTYPE) {
847 case UFS_MOUNT_UFSTYPE_44BSD: 851 case UFS_MOUNT_UFSTYPE_44BSD:
848 UFSD("ufstype=44bsd\n"); 852 UFSD("ufstype=44bsd\n");
@@ -861,6 +865,9 @@ static int ufs_fill_super(struct super_block *sb, void *data, int silent)
861 uspi->s_fshift = 9; 865 uspi->s_fshift = 9;
862 uspi->s_sbsize = super_block_size = 1536; 866 uspi->s_sbsize = super_block_size = 1536;
863 uspi->s_sbbase = 0; 867 uspi->s_sbbase = 0;
868 sb->s_time_gran = 1;
869 sb->s_time_min = S64_MIN;
870 sb->s_time_max = S64_MAX;
864 flags |= UFS_TYPE_UFS2 | UFS_DE_44BSD | UFS_UID_44BSD | UFS_ST_44BSD | UFS_CG_44BSD; 871 flags |= UFS_TYPE_UFS2 | UFS_DE_44BSD | UFS_UID_44BSD | UFS_ST_44BSD | UFS_CG_44BSD;
865 break; 872 break;
866 873
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(
1663 sb->s_maxbytes = xfs_max_file_offset(sb->s_blocksize_bits); 1663 sb->s_maxbytes = xfs_max_file_offset(sb->s_blocksize_bits);
1664 sb->s_max_links = XFS_MAXLINK; 1664 sb->s_max_links = XFS_MAXLINK;
1665 sb->s_time_gran = 1; 1665 sb->s_time_gran = 1;
1666 sb->s_time_min = S32_MIN;
1667 sb->s_time_max = S32_MAX;
1666 sb->s_iflags |= SB_I_CGROUPWB; 1668 sb->s_iflags |= SB_I_CGROUPWB;
1667 1669
1668 set_posix_acl_flag(sb); 1670 set_posix_acl_flag(sb);