2017-03-16 22:18:50 -08:00
/* SPDX-License-Identifier: GPL-2.0 */
# ifndef _BCACHEFS_REPLICAS_H
# define _BCACHEFS_REPLICAS_H
2019-01-21 15:32:13 -05:00
# include "eytzinger.h"
2018-10-30 14:14:19 -04:00
# include "replicas_types.h"
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 ) ;
bool bch2_replicas_marked ( struct bch_fs * ,
struct bch_replicas_entry * , bool ) ;
int bch2_mark_replicas ( struct bch_fs * ,
struct bch_replicas_entry * ) ;
2019-03-15 18:20:46 -04:00
bool bch2_bkey_replicas_marked_locked ( struct bch_fs * ,
struct bkey_s_c , bool ) ;
2019-03-11 14:59:58 -04:00
void bch2_bkey_to_replicas ( struct bch_replicas_entry * , struct bkey_s_c ) ;
2018-11-01 15:10:01 -04:00
bool bch2_bkey_replicas_marked ( struct bch_fs * ,
2018-11-07 17:48:32 -05:00
struct bkey_s_c , bool ) ;
2018-11-01 15:10:01 -04:00
int bch2_mark_bkey_replicas ( struct bch_fs * , 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 )
{
e - > data_type = BCH_DATA_CACHED ;
e - > nr_devs = 1 ;
e - > nr_required = 1 ;
e - > devs [ 0 ] = dev ;
}
2017-03-16 22:18:50 -08:00
struct replicas_status {
struct {
2018-10-30 14:32:47 -04:00
int redundancy ;
2017-03-16 22:18:50 -08:00
unsigned nr_offline ;
} replicas [ BCH_DATA_NR ] ;
} ;
struct replicas_status __bch2_replicas_status ( struct bch_fs * ,
struct bch_devs_mask ) ;
struct replicas_status bch2_replicas_status ( struct bch_fs * ) ;
bool bch2_have_enough_devs ( struct replicas_status , unsigned ) ;
2018-10-30 14:32:47 -04:00
int bch2_replicas_online ( struct bch_fs * , bool ) ;
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
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 */