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