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->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(struct bkey_packed *, |
52 | struct sort_iter *, bool); |
53 | |
54 | #endif /* _BCACHEFS_BKEY_SORT_H */ |
55 | |