Whamcloud - gitweb
LU-15544 ldiskfs: SUSE 15 SP4 kernel 5.14.21 SUSE
[fs/lustre-release.git] / ldiskfs / kernel_patches / patches / linux-5.14 / ext4-corrupted-inode-block-bitmaps-handling-patches.patch
1 Subject: [PATCH] ext4-corrupted-inode-block-bitmaps-handling-patches
2
3 Since we could skip corrupt block groups, this patch
4 use ext4_warning() intead of ext4_error() to make FS not
5 remount RO in default
6
7 ---
8  fs/ext4/balloc.c  | 10 +++----
9  fs/ext4/ialloc.c  |  6 ++---
10  fs/ext4/mballoc.c | 68 +++++++++++++++++++----------------------------
11  3 files changed, 35 insertions(+), 49 deletions(-)
12
13 diff --git a/fs/ext4/balloc.c b/fs/ext4/balloc.c
14 index 9dc6e74..ca05c72 100644
15 --- a/fs/ext4/balloc.c
16 +++ b/fs/ext4/balloc.c
17 @@ -387,7 +387,7 @@ static int ext4_validate_block_bitmap(struct super_block *sb,
18                                                     desc, bh) ||
19                      ext4_simulate_fail(sb, EXT4_SIM_BBITMAP_CRC))) {
20                 ext4_unlock_group(sb, block_group);
21 -               ext4_error(sb, "bg %u: bad block bitmap checksum", block_group);
22 +               ext4_warning(sb, "bg %u: bad block bitmap checksum", block_group);
23                 ext4_mark_group_bitmap_corrupted(sb, block_group,
24                                         EXT4_GROUP_INFO_BBITMAP_CORRUPT);
25                 return -EFSBADCRC;
26 @@ -395,8 +395,8 @@ static int ext4_validate_block_bitmap(struct super_block *sb,
27         blk = ext4_valid_block_bitmap(sb, desc, block_group, bh);
28         if (unlikely(blk != 0)) {
29                 ext4_unlock_group(sb, block_group);
30 -               ext4_error(sb, "bg %u: block %llu: invalid block bitmap",
31 -                          block_group, blk);
32 +               ext4_warning(sb, "bg %u: block %llu: invalid block bitmap",
33 +                            block_group, blk);
34                 ext4_mark_group_bitmap_corrupted(sb, block_group,
35                                         EXT4_GROUP_INFO_BBITMAP_CORRUPT);
36                 return -EFSCORRUPTED;
37 @@ -479,8 +479,8 @@ ext4_read_block_bitmap_nowait(struct super_block *sb, ext4_group_t block_group,
38                 ext4_unlock_group(sb, block_group);
39                 unlock_buffer(bh);
40                 if (err) {
41 -                       ext4_error(sb, "Failed to init block bitmap for group "
42 -                                  "%u: %d", block_group, err);
43 +                       ext4_warning(sb, "Failed to init block bitmap for group "
44 +                                    "%u: %d", block_group, err);
45                         goto out;
46                 }
47                 goto verify;
48 diff --git a/fs/ext4/ialloc.c b/fs/ext4/ialloc.c
49 index 4840190..f73d3f8 100644
50 --- a/fs/ext4/ialloc.c
51 +++ b/fs/ext4/ialloc.c
52 @@ -102,8 +102,8 @@ static int ext4_validate_inode_bitmap(struct super_block *sb,
53                                            EXT4_INODES_PER_GROUP(sb) / 8) ||
54             ext4_simulate_fail(sb, EXT4_SIM_IBITMAP_CRC)) {
55                 ext4_unlock_group(sb, block_group);
56 -               ext4_error(sb, "Corrupt inode bitmap - block_group = %u, "
57 -                          "inode_bitmap = %llu", block_group, blk);
58 +               ext4_warning(sb, "Corrupt inode bitmap - block_group = %u, "
59 +                            "inode_bitmap = %llu", block_group, blk);
60                 ext4_mark_group_bitmap_corrupted(sb, block_group,
61                                         EXT4_GROUP_INFO_IBITMAP_CORRUPT);
62                 return -EFSBADCRC;
63 @@ -353,7 +353,7 @@ out:
64                 if (!fatal)
65                         fatal = err;
66         } else {
67 -               ext4_error(sb, "bit already cleared for inode %lu", ino);
68 +               ext4_warning(sb, "bit already cleared for inode %lu", ino);
69                 ext4_mark_group_bitmap_corrupted(sb, block_group,
70                                         EXT4_GROUP_INFO_IBITMAP_CORRUPT);
71         }
72 diff --git a/fs/ext4/mballoc.c b/fs/ext4/mballoc.c
73 index de49616..90dfe9c 100644
74 --- a/fs/ext4/mballoc.c
75 +++ b/fs/ext4/mballoc.c
76 @@ -1134,10 +1134,14 @@ int ext4_mb_generate_buddy(struct super_block *sb,
77         grp->bb_fragments = fragments;
78  
79         if (free != grp->bb_free) {
80 -               ext4_grp_locked_error(sb, group, 0, 0,
81 -                                     "block bitmap and bg descriptor "
82 -                                     "inconsistent: %u vs %u free clusters",
83 -                                     free, grp->bb_free);
84 +               struct ext4_group_desc *gdp;
85 +               gdp = ext4_get_group_desc(sb, group, NULL);
86 +               ext4_warning(sb, "group %lu: block bitmap and bg descriptor "
87 +                            "inconsistent: %u vs %u free clusters "
88 +                            "%u in gd, %lu pa's",
89 +                            (long unsigned int)group, free, grp->bb_free,
90 +                            ext4_free_group_clusters(sb, gdp),
91 +                            grp->bb_prealloc_nr);
92                 /*
93                  * If we intend to continue, we consider group descriptor
94                  * corrupt and update bb_free using bitmap value
95 @@ -1481,7 +1485,7 @@ ext4_mb_load_buddy_gfp(struct super_block *sb, ext4_group_t group,
96         int block;
97         int pnum;
98         int poff;
99 -       struct page *page;
100 +       struct page *page = NULL;
101         int ret;
102         struct ext4_group_info *grp;
103         struct ext4_sb_info *sbi = EXT4_SB(sb);
104 @@ -1507,7 +1511,7 @@ ext4_mb_load_buddy_gfp(struct super_block *sb, ext4_group_t group,
105                  */
106                 ret = ext4_mb_init_group(sb, group, gfp);
107                 if (ret)
108 -                       return ret;
109 +                       goto err;
110         }
111  
112         /*
113 @@ -1607,6 +1611,7 @@ err:
114                 put_page(e4b->bd_buddy_page);
115         e4b->bd_buddy = NULL;
116         e4b->bd_bitmap = NULL;
117 +       ext4_warning(sb, "Error loading buddy information for %u", group);
118         return ret;
119  }
120  
121 @@ -4526,9 +4531,11 @@ int ext4_mb_check_ondisk_bitmap(struct super_block *sb, void *bitmap,
122         }
123  
124         if (free != free_in_gdp) {
125 -               ext4_error(sb, "on-disk bitmap for group %d"
126 +               ext4_warning(sb, "on-disk bitmap for group %d"
127                         "corrupted: %u blocks free in bitmap, %u - in gd\n",
128                         group, free, free_in_gdp);
129 +               ext4_mark_group_bitmap_corrupted(sb, group,
130 +                                       EXT4_GROUP_INFO_BBITMAP_CORRUPT);
131                 return -EIO;
132         }
133         return 0;
134 @@ -4894,16 +4901,8 @@ ext4_mb_release_inode_pa(struct ext4_buddy *e4b, struct buffer_head *bitmap_bh,
135         /* "free < pa->pa_free" means we maybe double alloc the same blocks,
136          * otherwise maybe leave some free blocks unavailable, no need to BUG.*/
137         if ((free > pa->pa_free && !pa->pa_error) || (free < pa->pa_free)) {
138 -               ext4_error(sb, "pa free mismatch: [pa %p] "
139 -                               "[phy %lu] [logic %lu] [len %u] [free %u] "
140 -                               "[error %u] [inode %d] [freed %u]", pa,
141 -                               (unsigned long)pa->pa_pstart,
142 -                               (unsigned long)pa->pa_lstart,
143 -                               pa->pa_len, (unsigned)pa->pa_free,
144 -                               (unsigned)pa->pa_error, pa->pa_inode->i_ino,
145 -                               free);
146                 ext4_grp_locked_error(sb, group, 0, 0, "free %u, pa_free %u",
147 -                                       free, pa->pa_free);
148 +                                     free, pa->pa_free);
149                 /*
150                  * pa is already deleted so we use the value obtained
151                  * from the bitmap and continue.
152 @@ -4963,16 +4962,11 @@ ext4_mb_discard_group_preallocations(struct super_block *sb,
153         bitmap_bh = ext4_read_block_bitmap(sb, group);
154         if (IS_ERR(bitmap_bh)) {
155                 err = PTR_ERR(bitmap_bh);
156 -               ext4_error_err(sb, -err,
157 -                              "Error %d reading block bitmap for %u",
158 -                              err, group);
159                 goto out_dbg;
160         }
161  
162         err = ext4_mb_load_buddy(sb, group, &e4b);
163         if (err) {
164 -               ext4_warning(sb, "Error %d loading buddy information for %u",
165 -                            err, group);
166                 put_bh(bitmap_bh);
167                 goto out_dbg;
168         }
169 @@ -5129,17 +5123,12 @@ repeat:
170  
171                 err = ext4_mb_load_buddy_gfp(sb, group, &e4b,
172                                              GFP_NOFS|__GFP_NOFAIL);
173 -               if (err) {
174 -                       ext4_error_err(sb, -err, "Error %d loading buddy information for %u",
175 -                                      err, group);
176 +               if (err)
177                         return;
178 -               }
179  
180                 bitmap_bh = ext4_read_block_bitmap(sb, group);
181                 if (IS_ERR(bitmap_bh)) {
182                         err = PTR_ERR(bitmap_bh);
183 -                       ext4_error_err(sb, -err, "Error %d reading block bitmap for %u",
184 -                                      err, group);
185                         ext4_mb_unload_buddy(&e4b);
186                         continue;
187                 }
188 @@ -5434,11 +5423,8 @@ ext4_mb_discard_lg_preallocations(struct super_block *sb,
189                 group = ext4_get_group_number(sb, pa->pa_pstart);
190                 err = ext4_mb_load_buddy_gfp(sb, group, &e4b,
191                                              GFP_NOFS|__GFP_NOFAIL);
192 -               if (err) {
193 -                       ext4_error_err(sb, -err, "Error %d loading buddy information for %u",
194 -                                      err, group);
195 +               if (err)
196                         continue;
197 -               }
198                 ext4_lock_group(sb, group);
199                 list_del(&pa->pa_group_list);
200                 ext4_get_group_info(sb, group)->bb_prealloc_nr--;
201 @@ -5773,7 +5759,7 @@ errout:
202                          * been updated or not when fail case. So can
203                          * not revert pa_free back, just mark pa_error*/
204                         pa->pa_error++;
205 -                       ext4_error(sb,
206 +                       ext4_warning(sb,
207                                 "Updating bitmap error: [err %d] "
208                                 "[pa %p] [phy %lu] [logic %lu] "
209                                 "[len %u] [free %u] [error %u] "
210 @@ -5784,6 +5770,7 @@ errout:
211                                 (unsigned)pa->pa_free,
212                                 (unsigned)pa->pa_error,
213                                 pa->pa_inode ? pa->pa_inode->i_ino : 0);
214 +                       ext4_mark_group_bitmap_corrupted(sb, 0, 0);
215                 }
216         }
217         ext4_mb_release_context(ac);
218 @@ -6182,7 +6169,7 @@ do_more:
219         err = ext4_mb_load_buddy_gfp(sb, block_group, &e4b,
220                                      GFP_NOFS|__GFP_NOFAIL);
221         if (err)
222 -               goto error_return;
223 +               goto error_brelse;
224  
225         /*
226          * We need to make sure we don't reuse the freed block until after the
227 @@ -6273,8 +6260,9 @@ do_more:
228                 goto do_more;
229         }
230  error_return:
231 -       brelse(bitmap_bh);
232         ext4_std_error(sb, err);
233 +error_brelse:
234 +       brelse(bitmap_bh);
235         return;
236  }
237  
238 @@ -6375,7 +6363,7 @@ int ext4_group_add_blocks(handle_t *handle, struct super_block *sb,
239  
240         err = ext4_mb_load_buddy(sb, block_group, &e4b);
241         if (err)
242 -               goto error_return;
243 +               goto error_brelse;
244  
245         /*
246          * need to update group_info->bb_free and bitmap
247 @@ -6414,8 +6402,9 @@ int ext4_group_add_blocks(handle_t *handle, struct super_block *sb,
248                 err = ret;
249  
250  error_return:
251 -       brelse(bitmap_bh);
252         ext4_std_error(sb, err);
253 +error_brelse:
254 +       brelse(bitmap_bh);
255         return err;
256  }
257  
258 @@ -6538,11 +6527,8 @@ ext4_trim_all_free(struct super_block *sb, ext4_group_t group,
259         trace_ext4_trim_all_free(sb, group, start, max);
260  
261         ret = ext4_mb_load_buddy(sb, group, &e4b);
262 -       if (ret) {
263 -               ext4_warning(sb, "Error %d loading buddy information for %u",
264 -                            ret, group);
265 -               return ret;
266 -       }
267 +       if (ret)
268 +               return ret;
269         ext4_lock_group(sb, group);
270         if (!EXT4_MB_GRP_WAS_TRIMMED(e4b.bd_info) ||
271             minblocks < atomic_read(&EXT4_SB(sb)->s_last_trim_minblks)) {
272 -- 
273 2.34.1
274