2017-03-16 22:18:50 -08:00
/* SPDX-License-Identifier: GPL-2.0 */
# ifndef _BCACHEFS_REPLICAS_H
# define _BCACHEFS_REPLICAS_H
2022-10-21 19:15:07 -04:00
# include "bkey.h"
2019-01-21 15:32:13 -05:00
# include "eytzinger.h"
2018-10-30 14:14:19 -04:00
# include "replicas_types.h"
2021-02-02 15:56:44 -05:00
void bch2_replicas_entry_sort ( struct bch_replicas_entry * ) ;
2019-01-21 15:32:13 -05:00
void bch2_replicas_entry_to_text ( struct printbuf * ,
struct bch_replicas_entry * ) ;
void bch2_cpu_replicas_to_text ( struct printbuf * , struct bch_replicas_cpu * ) ;
static inline struct bch_replicas_entry *
cpu_replicas_entry ( struct bch_replicas_cpu * r , unsigned i )
{
return ( void * ) r - > entries + r - > entry_size * i ;
}
int bch2_replicas_entry_idx ( struct bch_fs * ,
struct bch_replicas_entry * ) ;
void bch2_devlist_to_replicas ( struct bch_replicas_entry * ,
enum bch_data_type ,
struct bch_devs_list ) ;
2020-07-10 16:13:52 -04:00
bool bch2_replicas_marked ( struct bch_fs * , struct bch_replicas_entry * ) ;
2019-01-21 15:32:13 -05:00
int bch2_mark_replicas ( struct bch_fs * ,
struct bch_replicas_entry * ) ;
2021-04-03 20:29:05 -04:00
static inline struct replicas_delta *
replicas_delta_next ( struct replicas_delta * d )
{
return ( void * ) d + replicas_entry_bytes ( & d - > r ) + 8 ;
}
int bch2_replicas_delta_list_mark ( struct bch_fs * , struct replicas_delta_list * ) ;
2019-03-11 14:59:58 -04:00
void bch2_bkey_to_replicas ( struct bch_replicas_entry * , struct bkey_s_c ) ;
2017-03-16 22:18:50 -08:00
2019-01-21 15:32:13 -05:00
static inline void bch2_replicas_entry_cached ( struct bch_replicas_entry * e ,
unsigned dev )
{
2020-07-09 18:28:11 -04:00
e - > data_type = BCH_DATA_cached ;
2019-01-21 15:32:13 -05:00
e - > nr_devs = 1 ;
e - > nr_required = 1 ;
e - > devs [ 0 ] = dev ;
}
2017-03-16 22:18:50 -08:00
2021-02-06 23:17:26 -05:00
bool bch2_have_enough_devs ( struct bch_fs * , struct bch_devs_mask ,
unsigned , bool ) ;
2022-02-20 05:00:45 -05:00
unsigned bch2_sb_dev_has_data ( struct bch_sb * , unsigned ) ;
2017-03-16 22:18:50 -08:00
unsigned bch2_dev_has_data ( struct bch_fs * , struct bch_dev * ) ;
int bch2_replicas_gc_end ( struct bch_fs * , int ) ;
int bch2_replicas_gc_start ( struct bch_fs * , unsigned ) ;
2019-04-30 17:15:39 -04:00
int bch2_replicas_gc2 ( struct bch_fs * ) ;
2017-03-16 22:18:50 -08:00
2019-01-24 19:09:49 -05:00
int bch2_replicas_set_usage ( struct bch_fs * ,
struct bch_replicas_entry * ,
u64 ) ;
2019-01-24 17:54:51 -05:00
# define for_each_cpu_replicas_entry(_r, _i) \
for ( _i = ( _r ) - > entries ; \
( void * ) ( _i ) < ( void * ) ( _r ) - > entries + ( _r ) - > nr * ( _r ) - > entry_size ; \
_i = ( void * ) ( _i ) + ( _r ) - > entry_size )
2017-03-16 22:18:50 -08:00
/* iterate over superblock replicas - used by userspace tools: */
2018-10-30 14:14:19 -04:00
# define replicas_entry_next(_i) \
( ( typeof ( _i ) ) ( ( void * ) ( _i ) + replicas_entry_bytes ( _i ) ) )
2017-03-16 22:18:50 -08:00
# define for_each_replicas_entry(_r, _i) \
for ( _i = ( _r ) - > entries ; \
( void * ) ( _i ) < vstruct_end ( & ( _r ) - > field ) & & ( _i ) - > data_type ; \
( _i ) = replicas_entry_next ( _i ) )
2018-10-30 14:32:47 -04:00
# define for_each_replicas_entry_v0(_r, _i) \
for ( _i = ( _r ) - > entries ; \
( void * ) ( _i ) < vstruct_end ( & ( _r ) - > field ) & & ( _i ) - > data_type ; \
( _i ) = replicas_entry_next ( _i ) )
2017-03-16 22:18:50 -08:00
int bch2_sb_replicas_to_cpu_replicas ( struct bch_fs * ) ;
extern const struct bch_sb_field_ops bch_sb_field_ops_replicas ;
2018-10-30 14:32:47 -04:00
extern const struct bch_sb_field_ops bch_sb_field_ops_replicas_v0 ;
2017-03-16 22:18:50 -08:00
2021-04-24 00:24:25 -04:00
void bch2_fs_replicas_exit ( struct bch_fs * ) ;
2019-01-24 17:12:00 -05:00
int bch2_fs_replicas_init ( struct bch_fs * ) ;
2017-03-16 22:18:50 -08:00
# endif /* _BCACHEFS_REPLICAS_H */