diff options
Diffstat (limited to 'libbcachefs/btree_iter.h')
-rw-r--r-- | libbcachefs/btree_iter.h | 37 |
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); } /* |