diff options
-rw-r--r-- | fs/bcachefs/btree_cache.c | 25 |
1 files changed, 17 insertions, 8 deletions
diff --git a/fs/bcachefs/btree_cache.c b/fs/bcachefs/btree_cache.c index b0dc4c8a85cb..798f7be00cec 100644 --- a/fs/bcachefs/btree_cache.c +++ b/fs/bcachefs/btree_cache.c @@ -778,14 +778,12 @@ struct btree *bch2_btree_node_get_sibling(struct bch_fs *c, k = bch2_btree_node_iter_peek_all(&node_iter, parent); BUG_ON(bkey_cmp_left_packed(parent, k, &b->key.k.p)); - do { - k = sib == btree_prev_sib - ? bch2_btree_node_iter_prev_all(&node_iter, parent) - : (bch2_btree_node_iter_advance(&node_iter, parent), - bch2_btree_node_iter_peek_all(&node_iter, parent)); - if (!k) - goto out; - } while (bkey_deleted(k)); + k = sib == btree_prev_sib + ? bch2_btree_node_iter_prev(&node_iter, parent) + : (bch2_btree_node_iter_advance(&node_iter, parent), + bch2_btree_node_iter_peek(&node_iter, parent)); + if (!k) + goto out; bch2_bkey_unpack(parent, &tmp.k, k); @@ -838,6 +836,17 @@ out: (iter->uptodate >= BTREE_ITER_NEED_RELOCK || !btree_node_locked(iter, level))); + if (!IS_ERR_OR_NULL(ret)) { + struct btree *n1 = ret, *n2 = b; + + if (sib != btree_prev_sib) + swap(n1, n2); + + BUG_ON(bkey_cmp(btree_type_successor(n1->btree_id, + n1->key.k.p), + n2->data->min_key)); + } + return ret; out_upgrade: if (may_drop_locks) |