]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
bcachefs: If we did repair on a btree node, make sure we rewrite it
authorKent Overstreet <kent.overstreet@linux.dev>
Fri, 29 Nov 2024 23:17:00 +0000 (18:17 -0500)
committerKent Overstreet <kent.overstreet@linux.dev>
Sat, 21 Dec 2024 06:36:21 +0000 (01:36 -0500)
Ensure that "invalid bkey" repair gets persisted, so that it doesn't
repeatedly spam the logs.

Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
fs/bcachefs/btree_io.c

index eedcb2445b9900e40ba300204c97de945a7a4e94..9df9fc1c5e2b47a7c63216dec5fc38c7a33bdeda 100644 (file)
@@ -997,6 +997,7 @@ drop_this_key:
 got_good_key:
                le16_add_cpu(&i->u64s, -next_good_key);
                memmove_u64s_down(k, bkey_p_next(k), (u64 *) vstruct_end(i) - (u64 *) k);
+               set_btree_node_need_rewrite(b);
        }
 fsck_err:
        printbuf_exit(&buf);
@@ -1259,6 +1260,7 @@ int bch2_btree_node_read_done(struct bch_fs *c, struct bch_dev *ca,
                        memmove_u64s_down(k, bkey_p_next(k),
                                          (u64 *) vstruct_end(i) - (u64 *) k);
                        set_btree_bset_end(b, b->set);
+                       set_btree_node_need_rewrite(b);
                        continue;
                }
                if (ret)
@@ -1372,15 +1374,18 @@ start:
                               rb->start_time);
        bio_put(&rb->bio);
 
-       if (saw_error &&
+       if ((saw_error ||
+            btree_node_need_rewrite(b)) &&
            !btree_node_read_error(b) &&
            c->curr_recovery_pass != BCH_RECOVERY_PASS_scan_for_btree_nodes) {
-               printbuf_reset(&buf);
-               bch2_btree_id_level_to_text(&buf, b->c.btree_id, b->c.level);
-               prt_str(&buf, " ");
-               bch2_bkey_val_to_text(&buf, c, bkey_i_to_s_c(&b->key));
-               bch_err_ratelimited(c, "%s: rewriting btree node at due to error\n  %s",
-                                   __func__, buf.buf);
+               if (saw_error) {
+                       printbuf_reset(&buf);
+                       bch2_btree_id_level_to_text(&buf, b->c.btree_id, b->c.level);
+                       prt_str(&buf, " ");
+                       bch2_bkey_val_to_text(&buf, c, bkey_i_to_s_c(&b->key));
+                       bch_err_ratelimited(c, "%s: rewriting btree node at due to error\n  %s",
+                                           __func__, buf.buf);
+               }
 
                bch2_btree_node_rewrite_async(c, b);
        }