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:
parent
42e729b9dd
commit
22b139691f
|
@ -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);
|
||||||
|
|
|
@ -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);
|
||||||
|
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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))
|
||||||
|
|
|
@ -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)) {
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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))) {
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
|
|
Loading…
Reference in New Issue