|
@@ -71,6 +71,7 @@ static unsigned ext4_init_inode_bitmap(struct super_block *sb,
|
|
|
struct ext4_group_desc *gdp)
|
|
|
{
|
|
|
struct ext4_group_info *grp;
|
|
|
+ struct ext4_sb_info *sbi = EXT4_SB(sb);
|
|
|
J_ASSERT_BH(bh, buffer_locked(bh));
|
|
|
|
|
|
/* If checksum is bad mark all blocks and inodes use to prevent
|
|
@@ -78,7 +79,16 @@ static unsigned ext4_init_inode_bitmap(struct super_block *sb,
|
|
|
if (!ext4_group_desc_csum_verify(sb, block_group, gdp)) {
|
|
|
ext4_error(sb, "Checksum bad for group %u", block_group);
|
|
|
grp = ext4_get_group_info(sb, block_group);
|
|
|
+ if (!EXT4_MB_GRP_BBITMAP_CORRUPT(grp))
|
|
|
+ percpu_counter_sub(&sbi->s_freeclusters_counter,
|
|
|
+ grp->bb_free);
|
|
|
set_bit(EXT4_GROUP_INFO_BBITMAP_CORRUPT_BIT, &grp->bb_state);
|
|
|
+ if (!EXT4_MB_GRP_IBITMAP_CORRUPT(grp)) {
|
|
|
+ int count;
|
|
|
+ count = ext4_free_inodes_count(sb, gdp);
|
|
|
+ percpu_counter_sub(&sbi->s_freeinodes_counter,
|
|
|
+ count);
|
|
|
+ }
|
|
|
set_bit(EXT4_GROUP_INFO_IBITMAP_CORRUPT_BIT, &grp->bb_state);
|
|
|
return 0;
|
|
|
}
|
|
@@ -116,6 +126,7 @@ ext4_read_inode_bitmap(struct super_block *sb, ext4_group_t block_group)
|
|
|
struct buffer_head *bh = NULL;
|
|
|
ext4_fsblk_t bitmap_blk;
|
|
|
struct ext4_group_info *grp;
|
|
|
+ struct ext4_sb_info *sbi = EXT4_SB(sb);
|
|
|
|
|
|
desc = ext4_get_group_desc(sb, block_group, NULL);
|
|
|
if (!desc)
|
|
@@ -185,6 +196,12 @@ verify:
|
|
|
ext4_error(sb, "Corrupt inode bitmap - block_group = %u, "
|
|
|
"inode_bitmap = %llu", block_group, bitmap_blk);
|
|
|
grp = ext4_get_group_info(sb, block_group);
|
|
|
+ if (!EXT4_MB_GRP_IBITMAP_CORRUPT(grp)) {
|
|
|
+ int count;
|
|
|
+ count = ext4_free_inodes_count(sb, desc);
|
|
|
+ percpu_counter_sub(&sbi->s_freeinodes_counter,
|
|
|
+ count);
|
|
|
+ }
|
|
|
set_bit(EXT4_GROUP_INFO_IBITMAP_CORRUPT_BIT, &grp->bb_state);
|
|
|
return NULL;
|
|
|
}
|
|
@@ -321,6 +338,12 @@ out:
|
|
|
fatal = err;
|
|
|
} else {
|
|
|
ext4_error(sb, "bit already cleared for inode %lu", ino);
|
|
|
+ if (!EXT4_MB_GRP_IBITMAP_CORRUPT(grp)) {
|
|
|
+ int count;
|
|
|
+ count = ext4_free_inodes_count(sb, gdp);
|
|
|
+ percpu_counter_sub(&sbi->s_freeinodes_counter,
|
|
|
+ count);
|
|
|
+ }
|
|
|
set_bit(EXT4_GROUP_INFO_IBITMAP_CORRUPT_BIT, &grp->bb_state);
|
|
|
}
|
|
|
|