1 /* SPDX-License-Identifier: GPL-2.0 */ 2 #ifndef _BCACHEFS_REPLICAS_H 3 #define _BCACHEFS_REPLICAS_H 4 5 #include "bkey.h" 6 #include "eytzinger.h" 7 #include "replicas_types.h" 8 9 void bch2_replicas_entry_sort(struct bch_replicas_entry_v1 *); 10 void bch2_replicas_entry_to_text(struct printbuf *, 11 struct bch_replicas_entry_v1 *); 12 int bch2_replicas_entry_validate(struct bch_replicas_entry_v1 *, 13 struct bch_fs *, struct printbuf *); 14 void bch2_cpu_replicas_to_text(struct printbuf *, struct bch_replicas_cpu *); 15 16 static inline struct bch_replicas_entry_v1 * 17 cpu_replicas_entry(struct bch_replicas_cpu *r, unsigned i) 18 { 19 return (void *) r->entries + r->entry_size * i; 20 } 21 22 int bch2_replicas_entry_idx(struct bch_fs *, 23 struct bch_replicas_entry_v1 *); 24 25 void bch2_devlist_to_replicas(struct bch_replicas_entry_v1 *, 26 enum bch_data_type, 27 struct bch_devs_list); 28 29 bool bch2_replicas_marked_locked(struct bch_fs *, 30 struct bch_replicas_entry_v1 *); 31 bool bch2_replicas_marked(struct bch_fs *, struct bch_replicas_entry_v1 *); 32 int bch2_mark_replicas(struct bch_fs *, 33 struct bch_replicas_entry_v1 *); 34 35 void bch2_bkey_to_replicas(struct bch_replicas_entry_v1 *, struct bkey_s_c); 36 37 static inline void bch2_replicas_entry_cached(struct bch_replicas_entry_v1 *e, 38 unsigned dev) 39 { 40 e->data_type = BCH_DATA_cached; 41 e->nr_devs = 1; 42 e->nr_required = 1; 43 e->devs[0] = dev; 44 } 45 46 bool bch2_have_enough_devs(struct bch_fs *, struct bch_devs_mask, 47 unsigned, bool); 48 49 unsigned bch2_sb_dev_has_data(struct bch_sb *, unsigned); 50 unsigned bch2_dev_has_data(struct bch_fs *, struct bch_dev *); 51 52 int bch2_replicas_gc_end(struct bch_fs *, int); 53 int bch2_replicas_gc_start(struct bch_fs *, unsigned); 54 int bch2_replicas_gc2(struct bch_fs *); 55 56 #define for_each_cpu_replicas_entry(_r, _i) \ 57 for (_i = (_r)->entries; \ 58 (void *) (_i) < (void *) (_r)->entries + (_r)->nr * (_r)->entry_size;\ 59 _i = (void *) (_i) + (_r)->entry_size) 60 61 /* iterate over superblock replicas - used by userspace tools: */ 62 63 #define replicas_entry_next(_i) \ 64 ((typeof(_i)) ((void *) (_i) + replicas_entry_bytes(_i))) 65 66 #define for_each_replicas_entry(_r, _i) \ 67 for (_i = (_r)->entries; \ 68 (void *) (_i) < vstruct_end(&(_r)->field) && (_i)->data_type;\ 69 (_i) = replicas_entry_next(_i)) 70 71 #define for_each_replicas_entry_v0(_r, _i) \ 72 for (_i = (_r)->entries; \ 73 (void *) (_i) < vstruct_end(&(_r)->field) && (_i)->data_type;\ 74 (_i) = replicas_entry_next(_i)) 75 76 int bch2_sb_replicas_to_cpu_replicas(struct bch_fs *); 77 78 extern const struct bch_sb_field_ops bch_sb_field_ops_replicas; 79 extern const struct bch_sb_field_ops bch_sb_field_ops_replicas_v0; 80 81 void bch2_fs_replicas_exit(struct bch_fs *); 82 83 #endif /* _BCACHEFS_REPLICAS_H */ 84