aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorKent Overstreet <kent.overstreet@linux.dev>2024-12-09 06:00:33 -0500
committerKent Overstreet <kent.overstreet@linux.dev>2024-12-21 01:36:22 -0500
commit54dacdada6de8d97e7ca7e51eadc96c61032bdb4 (patch)
tree409e89418b138111fd12f0e6f0f47e5ef7c4bf51
parentbcachefs: Fix reuse of bucket before journal flush on multiple empty -> nonempty transition (diff)
downloadwireguard-linux-54dacdada6de8d97e7ca7e51eadc96c61032bdb4.tar.xz
wireguard-linux-54dacdada6de8d97e7ca7e51eadc96c61032bdb4.zip
bcachefs: Don't start rewriting btree nodes until after journal replay
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>
-rw-r--r--fs/bcachefs/btree_update_interior.c3
1 files changed, 2 insertions, 1 deletions
diff --git a/fs/bcachefs/btree_update_interior.c b/fs/bcachefs/btree_update_interior.c
index 7d9dab95bdcf..03a6eba7403d 100644
--- a/fs/bcachefs/btree_update_interior.c
+++ b/fs/bcachefs/btree_update_interior.c
@@ -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)) {