summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKent Overstreet <kent.overstreet@gmail.com>2019-09-13 14:50:02 -0400
committerKent Overstreet <kent.overstreet@gmail.com>2019-09-14 10:47:58 -0400
commit599387fd2e4835177ecd661c669872327155ca12 (patch)
tree9e02055e79fb59e4b0f74283eec8f3f6595b719b
parenta522ffeec0c0f54d0b6e7e38337fd8c273e569e2 (diff)
bcachefs: Improve btree_iter_pos_in_node()
-rw-r--r--fs/bcachefs/btree_iter.c17
1 files changed, 14 insertions, 3 deletions
diff --git a/fs/bcachefs/btree_iter.c b/fs/bcachefs/btree_iter.c
index 0a80c1b1fdd9..0632f4b6c90e 100644
--- a/fs/bcachefs/btree_iter.c
+++ b/fs/bcachefs/btree_iter.c
@@ -742,18 +742,29 @@ static void btree_iter_verify_new_node(struct btree_iter *iter, struct btree *b)
btree_node_unlock(iter, b->level + 1);
}
+static inline bool btree_iter_pos_before_node(struct btree_iter *iter,
+ struct btree *b)
+{
+ return bkey_cmp(iter->pos, b->data->min_key) < 0;
+}
+
static inline bool btree_iter_pos_after_node(struct btree_iter *iter,
struct btree *b)
{
- return __btree_iter_pos_cmp(iter, NULL,
- bkey_to_packed(&b->key), true) < 0;
+ int cmp = bkey_cmp(b->key.k.p, iter->pos);
+
+ if (!cmp &&
+ (iter->flags & BTREE_ITER_IS_EXTENTS) &&
+ bkey_cmp(b->key.k.p, POS_MAX))
+ cmp = -1;
+ return cmp < 0;
}
static inline bool btree_iter_pos_in_node(struct btree_iter *iter,
struct btree *b)
{
return iter->btree_id == b->btree_id &&
- bkey_cmp(iter->pos, b->data->min_key) >= 0 &&
+ !btree_iter_pos_before_node(iter, b) &&
!btree_iter_pos_after_node(iter, b);
}