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