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_sb *, 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 bool bch2_replicas_marked(struct bch_fs *, struct bch_replicas_entry_v1 *); 29 int bch2_mark_replicas(struct bch_fs *, 30 struct bch_replicas_entry_v1 *); 31 32 static inline struct replicas_delta * 33 replicas_delta_next(struct replicas_delta *d) 34 { 35 return (void *) d + replicas_entry_bytes(&d->r) + 8; 36 } 37 38 int bch2_replicas_delta_list_mark(struct bch_fs *, struct replicas_delta_list *); 39 40 void bch2_bkey_to_replicas(struct bch_replicas_entry_v1 *, struct bkey_s_c); 41 42 static inline void bch2_replicas_entry_cached(struct bch_replicas_entry_v1 *e, 43 unsigned dev) 44 { 45 e->data_type = BCH_DATA_cached; 46 e->nr_devs = 1; 47 e->nr_required = 1; 48 e->devs[0] = dev; 49 } 50 51 bool bch2_have_enough_devs(struct bch_fs *, struct bch_devs_mask, 52 unsigned, bool); 53 54 unsigned bch2_sb_dev_has_data(struct bch_sb *, unsigned); 55 unsigned bch2_dev_has_data(struct bch_fs *, struct bch_dev *); 56 57 int bch2_replicas_gc_end(struct bch_fs *, int); 58 int bch2_replicas_gc_start(struct bch_fs *, unsigned); 59 int bch2_replicas_gc2(struct bch_fs *); 60 61 int bch2_replicas_set_usage(struct bch_fs *, 62 struct bch_replicas_entry_v1 *, 63 u64); 64 65 #define for_each_cpu_replicas_entry(_r, _i) \ 66 for (_i = (_r)->entries; \ 67 (void *) (_i) < (void *) (_r)->entries + (_r)->nr * (_r)->entry_size;\ 68 _i = (void *) (_i) + (_r)->entry_size) 69 70 /* iterate over superblock replicas - used by userspace tools: */ 71 72 #define replicas_entry_next(_i) \ 73 ((typeof(_i)) ((void *) (_i) + replicas_entry_bytes(_i))) 74 75 #define for_each_replicas_entry(_r, _i) \ 76 for (_i = (_r)->entries; \ 77 (void *) (_i) < vstruct_end(&(_r)->field) && (_i)->data_type;\ 78 (_i) = replicas_entry_next(_i)) 79 80 #define for_each_replicas_entry_v0(_r, _i) \ 81 for (_i = (_r)->entries; \ 82 (void *) (_i) < vstruct_end(&(_r)->field) && (_i)->data_type;\ 83 (_i) = replicas_entry_next(_i)) 84 85 int bch2_sb_replicas_to_cpu_replicas(struct bch_fs *); 86 87 extern const struct bch_sb_field_ops bch_sb_field_ops_replicas; 88 extern const struct bch_sb_field_ops bch_sb_field_ops_replicas_v0; 89 90 void bch2_fs_replicas_exit(struct bch_fs *); 91 int bch2_fs_replicas_init(struct bch_fs *); 92 93 #endif /* _BCACHEFS_REPLICAS_H */ 94