@@ -305,6 +305,22 @@ struct ext4_group_desc * ext4_get_group_desc(struct super_block *sb,
305
305
return desc ;
306
306
}
307
307
308
+ static ext4_fsblk_t ext4_valid_block_bitmap_padding (struct super_block * sb ,
309
+ ext4_group_t block_group ,
310
+ struct buffer_head * bh )
311
+ {
312
+ ext4_grpblk_t next_zero_bit ;
313
+ unsigned long bitmap_size = sb -> s_blocksize * 8 ;
314
+ unsigned int offset = num_clusters_in_group (sb , block_group );
315
+
316
+ if (bitmap_size <= offset )
317
+ return 0 ;
318
+
319
+ next_zero_bit = ext4_find_next_zero_bit (bh -> b_data , bitmap_size , offset );
320
+
321
+ return (next_zero_bit < bitmap_size ? next_zero_bit : 0 );
322
+ }
323
+
308
324
/*
309
325
* Return the block number which was discovered to be invalid, or 0 if
310
326
* the block bitmap is valid.
@@ -402,6 +418,15 @@ static int ext4_validate_block_bitmap(struct super_block *sb,
402
418
EXT4_GROUP_INFO_BBITMAP_CORRUPT );
403
419
return - EFSCORRUPTED ;
404
420
}
421
+ blk = ext4_valid_block_bitmap_padding (sb , block_group , bh );
422
+ if (unlikely (blk != 0 )) {
423
+ ext4_unlock_group (sb , block_group );
424
+ ext4_error (sb , "bg %u: block %llu: padding at end of block bitmap is not set" ,
425
+ block_group , blk );
426
+ ext4_mark_group_bitmap_corrupted (sb , block_group ,
427
+ EXT4_GROUP_INFO_BBITMAP_CORRUPT );
428
+ return - EFSCORRUPTED ;
429
+ }
405
430
set_buffer_verified (bh );
406
431
verified :
407
432
ext4_unlock_group (sb , block_group );
0 commit comments