bcachefs: Release transaction before wake up
authorAlan Huang <mmpgouride@gmail.com>
Tue, 8 Oct 2024 16:59:08 +0000 (00:59 +0800)
committerKent Overstreet <kent.overstreet@linux.dev>
Wed, 9 Oct 2024 20:42:53 +0000 (16:42 -0400)
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>
fs/bcachefs/btree_io.c

index 1c1448b..cf93340 100644 (file)
@@ -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)