Since we could skip corrupt block groups, this patch use ext4_warning() intead of ext4_error() to make FS not emount RO in default, also fix a leftover from upstream commit 163a203ddb36c36d4a1c942 --- fs/ext4/balloc.c | 6 +++--- fs/ext4/ialloc.c | 8 ++++---- fs/ext4/mballoc.c | 13 ++++++++++--- 3 files changed, 17 insertions(+), 10 deletions(-) Index: linux-3.12.44-52.18/fs/ext4/balloc.c =================================================================== --- linux-3.12.44-52.18.orig/fs/ext4/balloc.c +++ linux-3.12.44-52.18/fs/ext4/balloc.c @@ -364,7 +364,7 @@ void ext4_validate_block_bitmap(struct s blk = ext4_valid_block_bitmap(sb, desc, block_group, bh); if (unlikely(blk != 0)) { ext4_unlock_group(sb, block_group); - ext4_error(sb, "bg %u: block %llu: invalid block bitmap", + ext4_warning(sb, "bg %u: block %llu: invalid block bitmap", block_group, blk); set_bit(EXT4_GROUP_INFO_BBITMAP_CORRUPT_BIT, &grp->bb_state); return; @@ -372,7 +372,7 @@ void ext4_validate_block_bitmap(struct s if (unlikely(!ext4_block_bitmap_csum_verify(sb, block_group, desc, bh))) { ext4_unlock_group(sb, block_group); - ext4_error(sb, "bg %u: bad block bitmap checksum", block_group); + ext4_warning(sb, "bg %u: bad block bitmap checksum", block_group); set_bit(EXT4_GROUP_INFO_BBITMAP_CORRUPT_BIT, &grp->bb_state); return; } Index: linux-3.12.44-52.18/fs/ext4/ialloc.c =================================================================== --- linux-3.12.44-52.18.orig/fs/ext4/ialloc.c +++ linux-3.12.44-52.18/fs/ext4/ialloc.c @@ -76,7 +76,7 @@ static unsigned ext4_init_inode_bitmap(s /* If checksum is bad mark all blocks and inodes use to prevent * allocation, essentially implementing a per-group read-only flag. */ if (!ext4_group_desc_csum_verify(sb, block_group, gdp)) { - ext4_error(sb, "Checksum bad for group %u", block_group); + ext4_warning(sb, "Checksum bad for group %u", block_group); grp = ext4_get_group_info(sb, block_group); set_bit(EXT4_GROUP_INFO_BBITMAP_CORRUPT_BIT, &grp->bb_state); set_bit(EXT4_GROUP_INFO_IBITMAP_CORRUPT_BIT, &grp->bb_state); @@ -182,8 +182,8 @@ verify: EXT4_INODES_PER_GROUP(sb) / 8)) { ext4_unlock_group(sb, block_group); put_bh(bh); - ext4_error(sb, "Corrupt inode bitmap - block_group = %u, " - "inode_bitmap = %llu", block_group, bitmap_blk); + ext4_warning(sb, "Corrupt inode bitmap - block_group = %u, " + "inode_bitmap = %llu", block_group, bitmap_blk); grp = ext4_get_group_info(sb, block_group); set_bit(EXT4_GROUP_INFO_IBITMAP_CORRUPT_BIT, &grp->bb_state); return NULL; @@ -320,7 +320,7 @@ out: if (!fatal) fatal = err; } else { - ext4_error(sb, "bit already cleared for inode %lu", ino); + ext4_warning(sb, "bit already cleared for inode %lu", ino); set_bit(EXT4_GROUP_INFO_IBITMAP_CORRUPT_BIT, &grp->bb_state); } Index: linux-3.12.44-52.18/fs/ext4/mballoc.c =================================================================== --- linux-3.12.44-52.18.orig/fs/ext4/mballoc.c +++ linux-3.12.44-52.18/fs/ext4/mballoc.c @@ -752,11 +752,18 @@ int ext4_mb_generate_buddy(struct super_ if (free != grp->bb_free) { struct ext4_group_desc *gdp; gdp = ext4_get_group_desc(sb, group, NULL); - ext4_error(sb, "group %lu: %u blocks in bitmap, %u in bb, " - "%u in gd, %lu pa's\n", (long unsigned int)group, + ext4_warning(sb, "group %lu: %u blocks in bitmap, %u in bb, " + "%u in gd, %lu pa's block bitmap corrupt", + (long unsigned int)group, free, grp->bb_free, ext4_free_group_clusters(sb, gdp), grp->bb_prealloc_nr); - return -EIO; + /* + * If we intend to continue, we consider group descriptor + * corrupt and update bb_free using bitmap value + */ + grp->bb_free = free; + set_bit(EXT4_GROUP_INFO_BBITMAP_CORRUPT_BIT, &grp->bb_state); + } mb_set_largest_free_order(sb, grp);