2018-11-28 02:30:56 +03:00
/* SPDX-License-Identifier: GPL-2.0 */
# ifndef _BCACHEFS_BKEY_SORT_H
# define _BCACHEFS_BKEY_SORT_H
struct sort_iter {
2019-12-15 00:20:33 +03:00
struct btree * b ;
2018-11-28 02:30:56 +03:00
unsigned used ;
2019-12-15 00:20:33 +03:00
unsigned size ;
2018-11-28 02:30:56 +03:00
struct sort_iter_set {
struct bkey_packed * k , * end ;
2023-09-10 03:10:11 +03:00
} data [ ] ;
2018-11-28 02:30:56 +03:00
} ;
2023-09-10 03:10:11 +03:00
static inline void sort_iter_init ( struct sort_iter * iter , struct btree * b , unsigned size )
2018-11-28 02:30:56 +03:00
{
iter - > b = b ;
2019-12-15 00:20:33 +03:00
iter - > used = 0 ;
2023-09-10 03:10:11 +03:00
iter - > size = size ;
}
struct sort_iter_stack {
struct sort_iter iter ;
struct sort_iter_set sets [ MAX_BSETS + 1 ] ;
} ;
static inline void sort_iter_stack_init ( struct sort_iter_stack * iter , struct btree * b )
{
sort_iter_init ( & iter - > iter , b , ARRAY_SIZE ( iter - > sets ) ) ;
2018-11-28 02:30:56 +03:00
}
static inline void sort_iter_add ( struct sort_iter * iter ,
struct bkey_packed * k ,
struct bkey_packed * end )
{
2019-12-15 00:20:33 +03:00
BUG_ON ( iter - > used > = iter - > size ) ;
2018-11-28 02:30:56 +03:00
if ( k ! = end )
iter - > data [ iter - > used + + ] = ( struct sort_iter_set ) { k , end } ;
}
struct btree_nr_keys
2019-12-15 00:20:33 +03:00
bch2_key_sort_fix_overlapping ( struct bch_fs * , struct bset * ,
struct sort_iter * ) ;
2018-11-28 02:30:56 +03:00
struct btree_nr_keys
2018-11-01 22:10:01 +03:00
bch2_sort_repack ( struct bset * , struct btree * ,
struct btree_node_iter * ,
struct bkey_format * , bool ) ;
2018-11-28 02:30:56 +03:00
unsigned bch2_sort_keys ( struct bkey_packed * ,
struct sort_iter * , bool ) ;
# endif /* _BCACHEFS_BKEY_SORT_H */