1 /* SPDX-License-Identifier: GPL-2.0 */ 2 #ifndef _BCACHEFS_BKEY_SORT_H 3 #define _BCACHEFS_BKEY_SORT_H 4 5 struct sort_iter { 6 struct btree *b; 7 unsigned used; 8 unsigned size; 9 10 struct sort_iter_set { 11 struct bkey_packed *k, *end; 12 } data[]; 13 }; 14 15 static inline void sort_iter_init(struct sort_iter *iter, struct btree *b, unsigned size) 16 { 17 iter->b = b; 18 iter->used = 0; 19 iter->size = size; 20 } 21 22 struct sort_iter_stack { 23 struct sort_iter iter; 24 struct sort_iter_set sets[MAX_BSETS + 1]; 25 }; 26 27 static inline void sort_iter_stack_init(struct sort_iter_stack *iter, struct btree *b) 28 { 29 sort_iter_init(&iter->iter, b, ARRAY_SIZE(iter->sets)); 30 } 31 32 static inline void sort_iter_add(struct sort_iter *iter, 33 struct bkey_packed *k, 34 struct bkey_packed *end) 35 { 36 BUG_ON(iter->used >= iter->size); 37 38 if (k != end) 39 iter->data[iter->used++] = (struct sort_iter_set) { k, end }; 40 } 41 42 struct btree_nr_keys 43 bch2_key_sort_fix_overlapping(struct bch_fs *, struct bset *, 44 struct sort_iter *); 45 46 struct btree_nr_keys 47 bch2_sort_repack(struct bset *, struct btree *, 48 struct btree_node_iter *, 49 struct bkey_format *, bool); 50 51 unsigned bch2_sort_keys_keep_unwritten_whiteouts(struct bkey_packed *, struct sort_iter *); 52 unsigned bch2_sort_keys(struct bkey_packed *, struct sort_iter *); 53 54 #endif /* _BCACHEFS_BKEY_SORT_H */ 55