1 /* SPDX-License-Identifier: GPL-2.0 */ 2 #ifndef _BCACHEFS_REFLINK_H 3 #define _BCACHEFS_REFLINK_H 4 5 enum bch_validate_flags; 6 7 int bch2_reflink_p_validate(struct bch_fs *, struct bkey_s_c, enum bch_validate_flags); 8 void bch2_reflink_p_to_text(struct printbuf *, struct bch_fs *, struct bkey_s_c); 9 bool bch2_reflink_p_merge(struct bch_fs *, struct bkey_s, struct bkey_s_c); 10 int bch2_trigger_reflink_p(struct btree_trans *, enum btree_id, unsigned, 11 struct bkey_s_c, struct bkey_s, 12 enum btree_iter_update_trigger_flags); 13 14 #define bch2_bkey_ops_reflink_p ((struct bkey_ops) { \ 15 .key_validate = bch2_reflink_p_validate, \ 16 .val_to_text = bch2_reflink_p_to_text, \ 17 .key_merge = bch2_reflink_p_merge, \ 18 .trigger = bch2_trigger_reflink_p, \ 19 .min_val_size = 16, \ 20 }) 21 22 int bch2_reflink_v_validate(struct bch_fs *, struct bkey_s_c, enum bch_validate_flags); 23 void bch2_reflink_v_to_text(struct printbuf *, struct bch_fs *, struct bkey_s_c); 24 int bch2_trigger_reflink_v(struct btree_trans *, enum btree_id, unsigned, 25 struct bkey_s_c, struct bkey_s, 26 enum btree_iter_update_trigger_flags); 27 28 #define bch2_bkey_ops_reflink_v ((struct bkey_ops) { \ 29 .key_validate = bch2_reflink_v_validate, \ 30 .val_to_text = bch2_reflink_v_to_text, \ 31 .swab = bch2_ptr_swab, \ 32 .trigger = bch2_trigger_reflink_v, \ 33 .min_val_size = 8, \ 34 }) 35 36 int bch2_indirect_inline_data_validate(struct bch_fs *, struct bkey_s_c, 37 enum bch_validate_flags); 38 void bch2_indirect_inline_data_to_text(struct printbuf *, 39 struct bch_fs *, struct bkey_s_c); 40 int bch2_trigger_indirect_inline_data(struct btree_trans *, 41 enum btree_id, unsigned, 42 struct bkey_s_c, struct bkey_s, 43 enum btree_iter_update_trigger_flags); 44 45 #define bch2_bkey_ops_indirect_inline_data ((struct bkey_ops) { \ 46 .key_validate = bch2_indirect_inline_data_validate, \ 47 .val_to_text = bch2_indirect_inline_data_to_text, \ 48 .trigger = bch2_trigger_indirect_inline_data, \ 49 .min_val_size = 8, \ 50 }) 51 52 static inline const __le64 *bkey_refcount_c(struct bkey_s_c k) 53 { 54 switch (k.k->type) { 55 case KEY_TYPE_reflink_v: 56 return &bkey_s_c_to_reflink_v(k).v->refcount; 57 case KEY_TYPE_indirect_inline_data: 58 return &bkey_s_c_to_indirect_inline_data(k).v->refcount; 59 default: 60 return NULL; 61 } 62 } 63 64 static inline __le64 *bkey_refcount(struct bkey_s k) 65 { 66 switch (k.k->type) { 67 case KEY_TYPE_reflink_v: 68 return &bkey_s_to_reflink_v(k).v->refcount; 69 case KEY_TYPE_indirect_inline_data: 70 return &bkey_s_to_indirect_inline_data(k).v->refcount; 71 default: 72 return NULL; 73 } 74 } 75 76 s64 bch2_remap_range(struct bch_fs *, subvol_inum, u64, 77 subvol_inum, u64, u64, u64, s64 *); 78 79 #endif /* _BCACHEFS_REFLINK_H */ 80