diff options
author | Theodore Ts'o <tytso@mit.edu> | 2016-11-18 13:28:30 -0500 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2017-01-06 04:40:13 -0500 |
commit | 01772f4683a9f92a06b3d2467c0084df2a512f35 (patch) | |
tree | ceb73ea764ba642bc47638d8ff42d291dfd4b51d /fs | |
parent | b493c715cdce57c803413e635e19f34f96041430 (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.c | 15 |
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); |