@@ -5113,6 +5113,55 @@ static void ext4_hash_info_init(struct super_block *sb)
5113
5113
}
5114
5114
}
5115
5115
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
+
5116
5165
static int __ext4_fill_super (struct fs_context * fc , struct super_block * sb )
5117
5166
{
5118
5167
struct ext4_super_block * es = NULL ;
@@ -5121,7 +5170,7 @@ static int __ext4_fill_super(struct fs_context *fc, struct super_block *sb)
5121
5170
struct inode * root ;
5122
5171
int ret = - ENOMEM ;
5123
5172
unsigned int i ;
5124
- int needs_recovery , has_huge_files ;
5173
+ int needs_recovery ;
5125
5174
int err = 0 ;
5126
5175
ext4_group_t first_not_zeroed ;
5127
5176
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)
5219
5268
goto failed_mount ;
5220
5269
}
5221
5270
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 ))
5247
5272
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 ));
5261
5273
5262
5274
ext4_hash_info_init (sb );
5263
5275
0 commit comments