bcachefs: Fix a deadlock
authorKent Overstreet <kent.overstreet@gmail.com>
Sat, 15 Sep 2018 21:57:22 +0000 (17:57 -0400)
committerKent Overstreet <kent.overstreet@linux.dev>
Sun, 22 Oct 2023 21:08:09 +0000 (17:08 -0400)
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
fs/bcachefs/btree_update_interior.c

index 6a2fcc4201b6322f2ee4f3697660ff0d22e58d80..6d99f3d191d308e4eac206b1223030373eb46c62 100644 (file)
@@ -1550,7 +1550,13 @@ void bch2_btree_insert_node(struct btree_update *as, struct btree *b,
 
        btree_node_interior_verify(b);
 
-       bch2_foreground_maybe_merge(c, iter, b->level, flags);
+       /*
+        * when called from the btree_split path the new nodes aren't added to
+        * the btree iterator yet, so the merge path's unlock/wait/relock dance
+        * won't work:
+        */
+       bch2_foreground_maybe_merge(c, iter, b->level,
+                                   flags|BTREE_INSERT_NOUNLOCK);
        return;
 split:
        btree_split(as, b, iter, keys, flags);