summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKent Overstreet <kent.overstreet@gmail.com>2018-06-30 22:21:54 -0400
committerKent Overstreet <kent.overstreet@gmail.com>2018-06-30 23:55:25 -0400
commit3db5dd5b30a216eca9dd149940a7da478277c0f5 (patch)
tree70a376bc47baad87633f986bebdc3dcea25453d6
parent73651471436d9b29beae939fc7e4aaf97f4cc548 (diff)
bcachefs: refactor bch2_btree_node_get_sibling() a bit
-rw-r--r--fs/bcachefs/btree_cache.c25
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)