bcachefs: maintain lock invariants in btree_iter_next_node()
authorKent Overstreet <kent.overstreet@linux.dev>
Thu, 11 Apr 2024 22:04:00 +0000 (18:04 -0400)
committerKent Overstreet <kent.overstreet@linux.dev>
Wed, 8 May 2024 21:29:19 +0000 (17:29 -0400)
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
fs/bcachefs/btree_iter.c

index e08167e3559d3d1557adc3b9466a5f9d69dc0578..bb037e4da299050974fbedd0cebf93516d37ee5c 100644 (file)
@@ -1902,6 +1902,9 @@ struct btree *bch2_btree_iter_next_node(struct btree_iter *iter)
        if (bpos_eq(iter->pos, b->key.k.p)) {
                __btree_path_set_level_up(trans, path, path->level++);
        } else {
+               if (btree_lock_want(path, path->level + 1) == BTREE_NODE_UNLOCKED)
+                       btree_node_unlock(trans, path, path->level + 1);
+
                /*
                 * Haven't gotten to the end of the parent node: go back down to
                 * the next child node