@@ -5113,6 +5113,55 @@ static void ext4_hash_info_init(struct super_block *sb)
51135113 }
51145114}
51155115
5116+ static int ext4_block_group_meta_init (struct super_block * sb , int silent )
5117+ {
5118+ struct ext4_sb_info * sbi = EXT4_SB (sb );
5119+ struct ext4_super_block * es = sbi -> s_es ;
5120+ int has_huge_files ;
5121+
5122+ has_huge_files = ext4_has_feature_huge_file (sb );
5123+ sbi -> s_bitmap_maxbytes = ext4_max_bitmap_size (sb -> s_blocksize_bits ,
5124+ has_huge_files );
5125+ sb -> s_maxbytes = ext4_max_size (sb -> s_blocksize_bits , has_huge_files );
5126+
5127+ sbi -> s_desc_size = le16_to_cpu (es -> s_desc_size );
5128+ if (ext4_has_feature_64bit (sb )) {
5129+ if (sbi -> s_desc_size < EXT4_MIN_DESC_SIZE_64BIT ||
5130+ sbi -> s_desc_size > EXT4_MAX_DESC_SIZE ||
5131+ !is_power_of_2 (sbi -> s_desc_size )) {
5132+ ext4_msg (sb , KERN_ERR ,
5133+ "unsupported descriptor size %lu" ,
5134+ sbi -> s_desc_size );
5135+ return - EINVAL ;
5136+ }
5137+ } else
5138+ sbi -> s_desc_size = EXT4_MIN_DESC_SIZE ;
5139+
5140+ sbi -> s_blocks_per_group = le32_to_cpu (es -> s_blocks_per_group );
5141+ sbi -> s_inodes_per_group = le32_to_cpu (es -> s_inodes_per_group );
5142+
5143+ sbi -> s_inodes_per_block = sb -> s_blocksize / EXT4_INODE_SIZE (sb );
5144+ if (sbi -> s_inodes_per_block == 0 || sbi -> s_blocks_per_group == 0 ) {
5145+ if (!silent )
5146+ ext4_msg (sb , KERN_ERR , "VFS: Can't find ext4 filesystem" );
5147+ return - EINVAL ;
5148+ }
5149+ if (sbi -> s_inodes_per_group < sbi -> s_inodes_per_block ||
5150+ sbi -> s_inodes_per_group > sb -> s_blocksize * 8 ) {
5151+ ext4_msg (sb , KERN_ERR , "invalid inodes per group: %lu\n" ,
5152+ sbi -> s_inodes_per_group );
5153+ return - EINVAL ;
5154+ }
5155+ sbi -> s_itb_per_group = sbi -> s_inodes_per_group /
5156+ sbi -> s_inodes_per_block ;
5157+ sbi -> s_desc_per_block = sb -> s_blocksize / EXT4_DESC_SIZE (sb );
5158+ sbi -> s_mount_state = le16_to_cpu (es -> s_state ) & ~EXT4_FC_REPLAY ;
5159+ sbi -> s_addr_per_block_bits = ilog2 (EXT4_ADDR_PER_BLOCK (sb ));
5160+ sbi -> s_desc_per_block_bits = ilog2 (EXT4_DESC_PER_BLOCK (sb ));
5161+
5162+ return 0 ;
5163+ }
5164+
51165165static int __ext4_fill_super (struct fs_context * fc , struct super_block * sb )
51175166{
51185167 struct ext4_super_block * es = NULL ;
@@ -5121,7 +5170,7 @@ static int __ext4_fill_super(struct fs_context *fc, struct super_block *sb)
51215170 struct inode * root ;
51225171 int ret = - ENOMEM ;
51235172 unsigned int i ;
5124- int needs_recovery , has_huge_files ;
5173+ int needs_recovery ;
51255174 int err = 0 ;
51265175 ext4_group_t first_not_zeroed ;
51275176 struct ext4_fs_context * ctx = fc -> fs_private ;
@@ -5219,45 +5268,8 @@ static int __ext4_fill_super(struct fs_context *fc, struct super_block *sb)
52195268 goto failed_mount ;
52205269 }
52215270
5222- has_huge_files = ext4_has_feature_huge_file (sb );
5223- sbi -> s_bitmap_maxbytes = ext4_max_bitmap_size (sb -> s_blocksize_bits ,
5224- has_huge_files );
5225- sb -> s_maxbytes = ext4_max_size (sb -> s_blocksize_bits , has_huge_files );
5226-
5227- sbi -> s_desc_size = le16_to_cpu (es -> s_desc_size );
5228- if (ext4_has_feature_64bit (sb )) {
5229- if (sbi -> s_desc_size < EXT4_MIN_DESC_SIZE_64BIT ||
5230- sbi -> s_desc_size > EXT4_MAX_DESC_SIZE ||
5231- !is_power_of_2 (sbi -> s_desc_size )) {
5232- ext4_msg (sb , KERN_ERR ,
5233- "unsupported descriptor size %lu" ,
5234- sbi -> s_desc_size );
5235- goto failed_mount ;
5236- }
5237- } else
5238- sbi -> s_desc_size = EXT4_MIN_DESC_SIZE ;
5239-
5240- sbi -> s_blocks_per_group = le32_to_cpu (es -> s_blocks_per_group );
5241- sbi -> s_inodes_per_group = le32_to_cpu (es -> s_inodes_per_group );
5242-
5243- sbi -> s_inodes_per_block = sb -> s_blocksize / EXT4_INODE_SIZE (sb );
5244- if (sbi -> s_inodes_per_block == 0 || sbi -> s_blocks_per_group == 0 ) {
5245- if (!silent )
5246- ext4_msg (sb , KERN_ERR , "VFS: Can't find ext4 filesystem" );
5271+ if (ext4_block_group_meta_init (sb , silent ))
52475272 goto failed_mount ;
5248- }
5249- if (sbi -> s_inodes_per_group < sbi -> s_inodes_per_block ||
5250- sbi -> s_inodes_per_group > sb -> s_blocksize * 8 ) {
5251- ext4_msg (sb , KERN_ERR , "invalid inodes per group: %lu\n" ,
5252- sbi -> s_inodes_per_group );
5253- goto failed_mount ;
5254- }
5255- sbi -> s_itb_per_group = sbi -> s_inodes_per_group /
5256- sbi -> s_inodes_per_block ;
5257- sbi -> s_desc_per_block = sb -> s_blocksize / EXT4_DESC_SIZE (sb );
5258- sbi -> s_mount_state = le16_to_cpu (es -> s_state ) & ~EXT4_FC_REPLAY ;
5259- sbi -> s_addr_per_block_bits = ilog2 (EXT4_ADDR_PER_BLOCK (sb ));
5260- sbi -> s_desc_per_block_bits = ilog2 (EXT4_DESC_PER_BLOCK (sb ));
52615273
52625274 ext4_hash_info_init (sb );
52635275
0 commit comments