aboutsummaryrefslogtreecommitdiffstats
path: root/fs
diff options
context:
space:
mode:
authorTheodore Ts'o <tytso@mit.edu>2016-11-18 13:28:30 -0500
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2017-01-06 04:40:13 -0500
commit01772f4683a9f92a06b3d2467c0084df2a512f35 (patch)
treeceb73ea764ba642bc47638d8ff42d291dfd4b51d /fs
parentb493c715cdce57c803413e635e19f34f96041430 (diff)
ext4: use more strict checks for inodes_per_block on mount
commit cd6bb35bf7f6d7d922509bf50265383a0ceabe96 upstream. Centralize the checks for inodes_per_block and be more strict to make sure the inodes_per_block_group can't end up being zero. Signed-off-by: Theodore Ts'o <tytso@mit.edu> Reviewed-by: Andreas Dilger <adilger@dilger.ca> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'fs')
-rw-r--r--fs/ext4/super.c15
1 files changed, 6 insertions, 9 deletions
diff --git a/fs/ext4/super.c b/fs/ext4/super.c
index 5a60eecf4deb..2113aad08c89 100644
--- a/fs/ext4/super.c
+++ b/fs/ext4/super.c
@@ -3660,12 +3660,16 @@ static int ext4_fill_super(struct super_block *sb, void *data, int silent)
3660 3660
3661 sbi->s_blocks_per_group = le32_to_cpu(es->s_blocks_per_group); 3661 sbi->s_blocks_per_group = le32_to_cpu(es->s_blocks_per_group);
3662 sbi->s_inodes_per_group = le32_to_cpu(es->s_inodes_per_group); 3662 sbi->s_inodes_per_group = le32_to_cpu(es->s_inodes_per_group);
3663 if (EXT4_INODE_SIZE(sb) == 0 || EXT4_INODES_PER_GROUP(sb) == 0)
3664 goto cantfind_ext4;
3665 3663
3666 sbi->s_inodes_per_block = blocksize / EXT4_INODE_SIZE(sb); 3664 sbi->s_inodes_per_block = blocksize / EXT4_INODE_SIZE(sb);
3667 if (sbi->s_inodes_per_block == 0) 3665 if (sbi->s_inodes_per_block == 0)
3668 goto cantfind_ext4; 3666 goto cantfind_ext4;
3667 if (sbi->s_inodes_per_group < sbi->s_inodes_per_block ||
3668 sbi->s_inodes_per_group > blocksize * 8) {
3669 ext4_msg(sb, KERN_ERR, "invalid inodes per group: %lu\n",
3670 sbi->s_blocks_per_group);
3671 goto failed_mount;
3672 }
3669 sbi->s_itb_per_group = sbi->s_inodes_per_group / 3673 sbi->s_itb_per_group = sbi->s_inodes_per_group /
3670 sbi->s_inodes_per_block; 3674 sbi->s_inodes_per_block;
3671 sbi->s_desc_per_block = blocksize / EXT4_DESC_SIZE(sb); 3675 sbi->s_desc_per_block = blocksize / EXT4_DESC_SIZE(sb);
@@ -3748,13 +3752,6 @@ static int ext4_fill_super(struct super_block *sb, void *data, int silent)
3748 } 3752 }
3749 sbi->s_cluster_ratio = clustersize / blocksize; 3753 sbi->s_cluster_ratio = clustersize / blocksize;
3750 3754
3751 if (sbi->s_inodes_per_group > blocksize * 8) {
3752 ext4_msg(sb, KERN_ERR,
3753 "#inodes per group too big: %lu",
3754 sbi->s_inodes_per_group);
3755 goto failed_mount;
3756 }
3757
3758 /* Do we have standard group size of clustersize * 8 blocks ? */ 3755 /* Do we have standard group size of clustersize * 8 blocks ? */
3759 if (sbi->s_blocks_per_group == clustersize << 3) 3756 if (sbi->s_blocks_per_group == clustersize << 3)
3760 set_opt2(sb, STD_GROUP_SIZE); 3757 set_opt2(sb, STD_GROUP_SIZE);