summaryrefslogtreecommitdiff
path: root/libbcachefs/btree_iter.h
diff options
context:
space:
mode:
Diffstat (limited to 'libbcachefs/btree_iter.h')
-rw-r--r--libbcachefs/btree_iter.h37
1 files changed, 28 insertions, 9 deletions
diff --git a/libbcachefs/btree_iter.h b/libbcachefs/btree_iter.h
index aeabc07d..39124e68 100644
--- a/libbcachefs/btree_iter.h
+++ b/libbcachefs/btree_iter.h
@@ -71,6 +71,30 @@ __trans_next_iter(struct btree_trans *trans, unsigned idx)
(_iter); \
_iter = __trans_next_iter((_trans), (_iter)->idx + 1))
+static inline struct btree_iter *next_btree_iter(struct btree_trans *trans, struct btree_iter *iter)
+{
+ unsigned idx = iter ? iter->sorted_idx + 1 : 0;
+
+ EBUG_ON(idx > trans->nr_sorted);
+
+ return idx < trans->nr_sorted
+ ? trans->iters + trans->sorted[idx]
+ : NULL;
+}
+
+static inline struct btree_iter *prev_btree_iter(struct btree_trans *trans, struct btree_iter *iter)
+{
+ EBUG_ON(iter->sorted_idx >= trans->nr_sorted);
+ return iter->sorted_idx
+ ? trans->iters + trans->sorted[iter->sorted_idx - 1]
+ : NULL;
+}
+
+#define trans_for_each_iter_inorder(_trans, _iter) \
+ for (_iter = next_btree_iter(trans, NULL); \
+ (_iter); \
+ _iter = next_btree_iter((_trans), (_iter)))
+
static inline bool __iter_has_node(const struct btree_iter *iter,
const struct btree *b)
{
@@ -191,19 +215,14 @@ static inline void bch2_btree_iter_set_pos_to_extent_start(struct btree_iter *it
iter->pos = bkey_start_pos(&iter->k);
}
-static inline struct btree_iter *btree_iter_child(struct btree_iter *iter)
+static inline struct btree_iter *idx_to_btree_iter(struct btree_trans *trans, unsigned idx)
{
- return iter->child_idx == U8_MAX ? NULL
- : iter->trans->iters + iter->child_idx;
+ return idx != U8_MAX ? trans->iters + idx : NULL;
}
-/* Sort order for locking btree iterators: */
-static inline int btree_iter_lock_cmp(const struct btree_iter *l,
- const struct btree_iter *r)
+static inline struct btree_iter *btree_iter_child(struct btree_iter *iter)
{
- return cmp_int(l->btree_id, r->btree_id) ?:
- -cmp_int(btree_iter_is_cached(l), btree_iter_is_cached(r)) ?:
- bkey_cmp(l->real_pos, r->real_pos);
+ return idx_to_btree_iter(iter->trans, iter->child_idx);
}
/*