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
This commit is contained in:
Deepa Dinamani 2019-07-30 08:22:29 -07:00
parent 42e729b9dd
commit 22b139691f
17 changed files with 42 additions and 0 deletions

View 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_set_blocksize(sb, (ulong) befs_sb->block_size);
sb->s_op = &befs_sops; sb->s_op = &befs_sops;
sb->s_export_op = &befs_export_operations; 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))); root = befs_iget(sb, iaddr2blockno(sb, &(befs_sb->root_dir)));
if (IS_ERR(root)) { if (IS_ERR(root)) {
ret = PTR_ERR(root); ret = PTR_ERR(root);

View File

@ -324,6 +324,8 @@ static int bfs_fill_super(struct super_block *s, void *data, int silent)
return -ENOMEM; return -ENOMEM;
mutex_init(&info->bfs_lock); mutex_init(&info->bfs_lock);
s->s_fs_info = info; s->s_fs_info = info;
s->s_time_min = 0;
s->s_time_max = U32_MAX;
sb_set_blocksize(s, BFS_BSIZE); sb_set_blocksize(s, BFS_BSIZE);

View 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_magic = CODA_SUPER_MAGIC;
sb->s_op = &coda_super_operations; sb->s_op = &coda_super_operations;
sb->s_d_op = &coda_dentry_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); error = super_setup_bdi(sb);
if (error) if (error)

View File

@ -597,6 +597,8 @@ static int cramfs_finalize_super(struct super_block *sb,
/* Set it all up.. */ /* Set it all up.. */
sb->s_flags |= SB_RDONLY; sb->s_flags |= SB_RDONLY;
sb->s_time_min = 0;
sb->s_time_max = 0;
sb->s_op = &cramfs_ops; sb->s_op = &cramfs_ops;
root = get_cramfs_inode(sb, cramfs_root, 0); root = get_cramfs_inode(sb, cramfs_root, 0);
if (IS_ERR(root)) if (IS_ERR(root))

View File

@ -257,6 +257,8 @@ static int efs_fill_super(struct super_block *s, void *d, int silent)
if (!sb) if (!sb)
return -ENOMEM; return -ENOMEM;
s->s_fs_info = sb; s->s_fs_info = sb;
s->s_time_min = 0;
s->s_time_max = U32_MAX;
s->s_magic = EFS_SUPER_MAGIC; s->s_magic = EFS_SUPER_MAGIC;
if (!sb_set_blocksize(s, EFS_BLOCKSIZE)) { if (!sb_set_blocksize(s, EFS_BLOCKSIZE)) {

View 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_maxbytes = ext2_max_size(sb->s_blocksize_bits);
sb->s_max_links = EXT2_LINK_MAX; 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) { if (le32_to_cpu(es->s_rev_level) == EXT2_GOOD_OLD_REV) {
sbi->s_inode_size = EXT2_GOOD_OLD_INODE_SIZE; sbi->s_inode_size = EXT2_GOOD_OLD_INODE_SIZE;

View 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_op = &vxfs_super_ops;
sbp->s_fs_info = infp; sbp->s_fs_info = infp;
sbp->s_time_min = 0;
sbp->s_time_max = U32_MAX;
if (!vxfs_try_sb_magic(sbp, silent, 1, if (!vxfs_try_sb_magic(sbp, silent, 1,
(__force __fs32)cpu_to_le32(VXFS_SUPER_MAGIC))) { (__force __fs32)cpu_to_le32(VXFS_SUPER_MAGIC))) {

View 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 = PAGE_SIZE;
sb->s_blocksize_bits = PAGE_SHIFT; sb->s_blocksize_bits = PAGE_SHIFT;
sb->s_magic = JFFS2_SUPER_MAGIC; sb->s_magic = JFFS2_SUPER_MAGIC;
sb->s_time_min = 0;
sb->s_time_max = U32_MAX;
if (!sb_rdonly(sb)) if (!sb_rdonly(sb))
jffs2_start_garbage_collect_thread(c); jffs2_start_garbage_collect_thread(c);
return 0; return 0;

View 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_fs_info = sbi;
sb->s_max_links = JFS_LINK_MAX; sb->s_max_links = JFS_LINK_MAX;
sb->s_time_min = 0;
sb->s_time_max = U32_MAX;
sbi->sb = sb; sbi->sb = sb;
sbi->uid = INVALID_UID; sbi->uid = INVALID_UID;
sbi->gid = INVALID_GID; sbi->gid = INVALID_GID;

View 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 */ /* set up enough so that it can read an inode */
s->s_op = &minix_sops; s->s_op = &minix_sops;
s->s_time_min = 0;
s->s_time_max = U32_MAX;
root_inode = minix_iget(s, MINIX_ROOT_INO); root_inode = minix_iget(s, MINIX_ROOT_INO);
if (IS_ERR(root_inode)) { if (IS_ERR(root_inode)) {
ret = PTR_ERR(root_inode); ret = PTR_ERR(root_inode);

View 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_op = &qnx4_sops;
s->s_magic = QNX4_SUPER_MAGIC; s->s_magic = QNX4_SUPER_MAGIC;
s->s_flags |= SB_RDONLY; /* Yup, read-only yet */ 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 /* Check the superblock signature. Since the qnx4 code is
dangerous, we should leave as quickly as possible dangerous, we should leave as quickly as possible

View File

@ -429,6 +429,8 @@ mmi_success:
s->s_op = &qnx6_sops; s->s_op = &qnx6_sops;
s->s_magic = QNX6_SUPER_MAGIC; s->s_magic = QNX6_SUPER_MAGIC;
s->s_flags |= SB_RDONLY; /* Yup, read-only yet */ 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 */ /* ease the later tree level calculations */
sbi = QNX6_SB(s); sbi = QNX6_SB(s);

View File

@ -1976,6 +1976,9 @@ static int reiserfs_fill_super(struct super_block *s, void *data, int silent)
goto error_unlocked; goto error_unlocked;
} }
s->s_time_min = 0;
s->s_time_max = U32_MAX;
rs = SB_DISK_SUPER_BLOCK(s); rs = SB_DISK_SUPER_BLOCK(s);
/* /*
* Let's do basic sanity check to verify that underlying device is not * Let's do basic sanity check to verify that underlying device is not

View File

@ -478,6 +478,8 @@ static int romfs_fill_super(struct super_block *sb, void *data, int silent)
sb->s_maxbytes = 0xFFFFFFFF; sb->s_maxbytes = 0xFFFFFFFF;
sb->s_magic = ROMFS_MAGIC; sb->s_magic = ROMFS_MAGIC;
sb->s_flags |= SB_RDONLY | SB_NOATIME; sb->s_flags |= SB_RDONLY | SB_NOATIME;
sb->s_time_min = 0;
sb->s_time_max = 0;
sb->s_op = &romfs_super_ops; sb->s_op = &romfs_super_ops;
#ifdef CONFIG_ROMFS_ON_MTD #ifdef CONFIG_ROMFS_ON_MTD

View 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)); (u64) le64_to_cpu(sblk->id_table_start));
sb->s_maxbytes = MAX_LFS_FILESIZE; sb->s_maxbytes = MAX_LFS_FILESIZE;
sb->s_time_min = 0;
sb->s_time_max = U32_MAX;
sb->s_flags |= SB_RDONLY; sb->s_flags |= SB_RDONLY;
sb->s_op = &squashfs_super_ops; sb->s_op = &squashfs_super_ops;

View 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_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) { switch (sbi->s_mount_opt & UFS_MOUNT_UFSTYPE) {
case UFS_MOUNT_UFSTYPE_44BSD: case UFS_MOUNT_UFSTYPE_44BSD:
UFSD("ufstype=44bsd\n"); 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_fshift = 9;
uspi->s_sbsize = super_block_size = 1536; uspi->s_sbsize = super_block_size = 1536;
uspi->s_sbbase = 0; 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; flags |= UFS_TYPE_UFS2 | UFS_DE_44BSD | UFS_UID_44BSD | UFS_ST_44BSD | UFS_CG_44BSD;
break; break;

View File

@ -1663,6 +1663,8 @@ xfs_fs_fill_super(
sb->s_maxbytes = xfs_max_file_offset(sb->s_blocksize_bits); sb->s_maxbytes = xfs_max_file_offset(sb->s_blocksize_bits);
sb->s_max_links = XFS_MAXLINK; sb->s_max_links = XFS_MAXLINK;
sb->s_time_gran = 1; sb->s_time_gran = 1;
sb->s_time_min = S32_MIN;
sb->s_time_max = S32_MAX;
sb->s_iflags |= SB_I_CGROUPWB; sb->s_iflags |= SB_I_CGROUPWB;
set_posix_acl_flag(sb); set_posix_acl_flag(sb);