summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.bcachefs_revision2
-rw-r--r--libbcachefs/btree_iter.c7
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)