diff options
-rw-r--r-- | .bcachefs_revision | 2 | ||||
-rw-r--r-- | libbcachefs/btree_iter.c | 7 |
2 files changed, 8 insertions, 1 deletions
diff --git a/.bcachefs_revision b/.bcachefs_revision index b04d44bc..90d4c53b 100644 --- a/.bcachefs_revision +++ b/.bcachefs_revision @@ -1 +1 @@ -2e70771b8dc0d0f2d0356a5a7d16cab9430cd49e +fb365e1745d352401a2af47aedb43ab1bf6f8ce1 diff --git a/libbcachefs/btree_iter.c b/libbcachefs/btree_iter.c index e5da186b..ecad24fa 100644 --- a/libbcachefs/btree_iter.c +++ b/libbcachefs/btree_iter.c @@ -704,8 +704,12 @@ static void btree_iter_prefetch(struct btree_iter *iter) struct bkey_packed *k; BKEY_PADDED(k) tmp; unsigned nr = iter->level ? 1 : 8; + bool was_locked = btree_node_locked(iter, iter->level + 1); while (nr) { + if (!bch2_btree_node_relock(iter, iter->level + 1)) + return; + bch2_btree_node_iter_advance(&node_iter, b); k = bch2_btree_node_iter_peek(&node_iter, b); if (!k) @@ -714,6 +718,9 @@ static void btree_iter_prefetch(struct btree_iter *iter) bch2_bkey_unpack(b, &tmp.k, k); bch2_btree_node_prefetch(iter, &tmp.k, iter->level); } + + if (!was_locked) + btree_node_unlock(iter, iter->level + 1); } static inline int btree_iter_down(struct btree_iter *iter) |