Whamcloud - gitweb
d119fbc1c88511d4ad563cc3a61764766ca450d5
[fs/lustre-release.git] / ldiskfs / kernel_patches / patches / rhel7 / ext4-corrupted-inode-block-bitmaps-handling-patches.patch
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
5 ---
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(-)
10
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",
21                            block_group, blk);
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,
26                         desc, bh))) {
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,
32                                            grp->bb_free);
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);
35                 unlock_buffer(bh);
36                 if (err)
37 -                       ext4_error(sb, "Checksum bad for grp %u", block_group);
38 +                       ext4_warning(sb, "Checksum bad for grp %u", block_group);
39                 return bh;
40         }
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);
58                 put_bh(bh);
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)) {
65                         int count;
66 @@ -337,7 +337,7 @@ out:
67                 if (!fatal)
68                         fatal = err;
69         } else {
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)) {
73                         int count;
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),
89                         grp->bb_prealloc_nr);
90 -               return -EIO;
91 +               /*
92 +                * If we intend to continue, we consider group descriptor
93 +                * corrupt and update bb_free using bitmap value
94 +                */
95 +               grp->bb_free = free;
96 +               set_bit(EXT4_GROUP_INFO_BBITMAP_CORRUPT_BIT, &grp->bb_state);
97 +               
98         }
99         mb_set_largest_free_order(sb, grp);
100  
101 -- 
102 1.8.3.1
103