1 Since we could skip corrupt block groups, this patch
2 use ext4_warning() intead of ext4_error() to make FS not
3 emount RO in default, also fix a leftover from upstream
4 commit 163a203ddb36c36d4a1c942
6 fs/ext4/balloc.c | 6 +++---
7 fs/ext4/ialloc.c | 8 ++++----
8 fs/ext4/mballoc.c | 13 ++++++++++---
9 3 files changed, 17 insertions(+), 10 deletions(-)
11 diff --git a/fs/ext4/balloc.c b/fs/ext4/balloc.c
12 index e069155..8ecf06e 100644
13 --- a/fs/ext4/balloc.c
14 +++ b/fs/ext4/balloc.c
15 @@ -377,7 +377,7 @@ static void ext4_validate_block_bitmap(struct super_block *sb,
16 blk = ext4_valid_block_bitmap(sb, desc, block_group, bh);
17 if (unlikely(blk != 0)) {
18 ext4_unlock_group(sb, block_group);
19 - ext4_error(sb, "bg %u: block %llu: invalid block bitmap",
20 + ext4_warning(sb, "bg %u: block %llu: invalid block bitmap",
22 if (!EXT4_MB_GRP_BBITMAP_CORRUPT(grp))
23 percpu_counter_sub(&sbi->s_freeclusters_counter,
24 @@ -388,7 +388,7 @@ static void ext4_validate_block_bitmap(struct super_block *sb,
25 if (unlikely(!ext4_block_bitmap_csum_verify(sb, block_group,
27 ext4_unlock_group(sb, block_group);
28 - ext4_error(sb, "bg %u: bad block bitmap checksum", block_group);
29 + ext4_warning(sb, "bg %u: bad block bitmap checksum", block_group);
30 if (!EXT4_MB_GRP_BBITMAP_CORRUPT(grp))
31 percpu_counter_sub(&sbi->s_freeclusters_counter,
33 @@ -446,7 +446,7 @@ ext4_read_block_bitmap_nowait(struct super_block *sb, ext4_group_t block_group)
34 ext4_unlock_group(sb, block_group);
37 - ext4_error(sb, "Checksum bad for grp %u", block_group);
38 + ext4_warning(sb, "Checksum bad for grp %u", block_group);
41 ext4_unlock_group(sb, block_group);
42 diff --git a/fs/ext4/ialloc.c b/fs/ext4/ialloc.c
43 index fc65310..4936bff 100644
44 --- a/fs/ext4/ialloc.c
45 +++ b/fs/ext4/ialloc.c
46 @@ -77,7 +77,7 @@ static unsigned ext4_init_inode_bitmap(struct super_block *sb,
47 /* If checksum is bad mark all blocks and inodes use to prevent
48 * allocation, essentially implementing a per-group read-only flag. */
49 if (!ext4_group_desc_csum_verify(sb, block_group, gdp)) {
50 - ext4_error(sb, "Checksum bad for group %u", block_group);
51 + ext4_warning(sb, "Checksum bad for group %u", block_group);
52 grp = ext4_get_group_info(sb, block_group);
53 if (!EXT4_MB_GRP_BBITMAP_CORRUPT(grp))
54 percpu_counter_sub(&sbi->s_freeclusters_counter,
55 @@ -193,8 +193,8 @@ verify:
56 EXT4_INODES_PER_GROUP(sb) / 8)) {
57 ext4_unlock_group(sb, block_group);
59 - ext4_error(sb, "Corrupt inode bitmap - block_group = %u, "
60 - "inode_bitmap = %llu", block_group, bitmap_blk);
61 + ext4_warning(sb, "Corrupt inode bitmap - block_group = %u, "
62 + "inode_bitmap = %llu", block_group, bitmap_blk);
63 grp = ext4_get_group_info(sb, block_group);
64 if (!EXT4_MB_GRP_IBITMAP_CORRUPT(grp)) {
66 @@ -337,7 +337,7 @@ out:
70 - ext4_error(sb, "bit already cleared for inode %lu", ino);
71 + ext4_warning(sb, "bit already cleared for inode %lu", ino);
72 if (gdp && !EXT4_MB_GRP_IBITMAP_CORRUPT(grp)) {
74 count = ext4_free_inodes_count(sb, gdp);
75 diff --git a/fs/ext4/mballoc.c b/fs/ext4/mballoc.c
76 index d2b07bd..695ccd3 100644
77 --- a/fs/ext4/mballoc.c
78 +++ b/fs/ext4/mballoc.c
79 @@ -752,11 +752,18 @@ int ext4_mb_generate_buddy(struct super_block *sb,
80 if (free != grp->bb_free) {
81 struct ext4_group_desc *gdp;
82 gdp = ext4_get_group_desc(sb, group, NULL);
83 - ext4_error(sb, "group %lu: %u blocks in bitmap, %u in bb, "
84 - "%u in gd, %lu pa's\n", (long unsigned int)group,
85 + ext4_warning(sb, "group %lu: %u blocks in bitmap, %u in bb, "
86 + "%u in gd, %lu pa's block bitmap corrupt",
87 + (long unsigned int)group,
88 free, grp->bb_free, ext4_free_group_clusters(sb, gdp),
92 + * If we intend to continue, we consider group descriptor
93 + * corrupt and update bb_free using bitmap value
95 + grp->bb_free = free;
96 + set_bit(EXT4_GROUP_INFO_BBITMAP_CORRUPT_BIT, &grp->bb_state);
99 mb_set_largest_free_order(sb, grp);