aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorAlan Huang <mmpgouride@gmail.com>2024-10-09 00:59:08 +0800
committerKent Overstreet <kent.overstreet@linux.dev>2024-10-09 16:42:53 -0400
commita1541541480073365ac701a1125d750a86bfd644 (patch)
treea46c58a3e2a57aec0a29c92ea7637bc0623609b3
parentbcachefs: add check for btree id against max in try read node (diff)
downloadwireguard-linux-a1541541480073365ac701a1125d750a86bfd644.tar.xz
wireguard-linux-a1541541480073365ac701a1125d750a86bfd644.zip
bcachefs: Release transaction before wake up
We will get this if we wake up first: Kernel panic - not syncing: btree_node_write_done leaked btree_trans since there are still transactions waiting for cycle detectors after BTREE_NODE_write_in_flight is cleared. Signed-off-by: Alan Huang <mmpgouride@gmail.com> Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
-rw-r--r--fs/bcachefs/btree_io.c5
1 files changed, 3 insertions, 2 deletions
diff --git a/fs/bcachefs/btree_io.c b/fs/bcachefs/btree_io.c
index 1c1448b52207..cf933409d385 100644
--- a/fs/bcachefs/btree_io.c
+++ b/fs/bcachefs/btree_io.c
@@ -1838,10 +1838,11 @@ static void btree_node_write_done(struct bch_fs *c, struct btree *b)
struct btree_trans *trans = bch2_trans_get(c);
btree_node_lock_nopath_nofail(trans, &b->c, SIX_LOCK_read);
- __btree_node_write_done(c, b);
- six_unlock_read(&b->c.lock);
+ /* we don't need transaction context anymore after we got the lock. */
bch2_trans_put(trans);
+ __btree_node_write_done(c, b);
+ six_unlock_read(&b->c.lock);
}
static void btree_node_write_work(struct work_struct *work)