bcachefs: Fix blocking with locks held
authorKent Overstreet <kent.overstreet@linux.dev>
Sat, 24 Sep 2022 01:00:24 +0000 (21:00 -0400)
committerKent Overstreet <kent.overstreet@linux.dev>
Sun, 22 Oct 2023 21:09:41 +0000 (17:09 -0400)
This is a major oopsy - we should always be unlocking before calling
closure_sync(), else we'll cause a deadlock.

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

index 7a682c1751b3a0f29be89b1e68985043f5d8ddc3..797efa738dc4f28c3e4644abd08ca4912e56d202 100644 (file)
@@ -1117,10 +1117,10 @@ bch2_btree_update_start(struct btree_trans *trans, struct btree_path *path,
 
                closure_init_stack(&cl);
 
-               bch2_trans_unlock(trans);
-
                do {
                        ret = bch2_btree_reserve_get(trans, as, nr_nodes, flags, &cl);
+
+                       bch2_trans_unlock(trans);
                        closure_sync(&cl);
                } while (ret == -EAGAIN);
        }