bcachefs: Don't start rewriting btree nodes until after journal replay
authorKent Overstreet <kent.overstreet@linux.dev>
Mon, 9 Dec 2024 11:00:33 +0000 (06:00 -0500)
committerKent Overstreet <kent.overstreet@linux.dev>
Sat, 21 Dec 2024 06:36:22 +0000 (01:36 -0500)
This fixes a deadlock during journal replay when btree node read errors
kick off a ton of rewrites: we don't want them competing with journal
replay.

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

index 7d9dab95bdcfded293664b83476c46c776016fef..03a6eba7403dd6162301d07561f707aec4e16249 100644 (file)
@@ -2291,7 +2291,8 @@ void bch2_btree_node_rewrite_async(struct bch_fs *c, struct btree *b)
        bool now = false, pending = false;
 
        spin_lock(&c->btree_node_rewrites_lock);
-       if (bch2_write_ref_tryget(c, BCH_WRITE_REF_node_rewrite)) {
+       if (c->curr_recovery_pass > BCH_RECOVERY_PASS_journal_replay &&
+           bch2_write_ref_tryget(c, BCH_WRITE_REF_node_rewrite)) {
                list_add(&a->list, &c->btree_node_rewrites);
                now = true;
        } else if (!test_bit(BCH_FS_may_go_rw, &c->flags)) {