]> Git Repo - linux.git/blob - fs/bcachefs/reflink.h
Merge patch series "riscv: Extension parsing fixes"
[linux.git] / fs / bcachefs / reflink.h
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_invalid(struct bch_fs *, struct bkey_s_c,
8                            enum bch_validate_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,
14                            enum btree_iter_update_trigger_flags);
15
16 #define bch2_bkey_ops_reflink_p ((struct bkey_ops) {            \
17         .key_invalid    = bch2_reflink_p_invalid,               \
18         .val_to_text    = bch2_reflink_p_to_text,               \
19         .key_merge      = bch2_reflink_p_merge,                 \
20         .trigger        = bch2_trigger_reflink_p,               \
21         .min_val_size   = 16,                                   \
22 })
23
24 int bch2_reflink_v_invalid(struct bch_fs *, struct bkey_s_c,
25                            enum bch_validate_flags, struct printbuf *);
26 void bch2_reflink_v_to_text(struct printbuf *, struct bch_fs *,
27                             struct bkey_s_c);
28 int bch2_trigger_reflink_v(struct btree_trans *, enum btree_id, unsigned,
29                            struct bkey_s_c, struct bkey_s,
30                            enum btree_iter_update_trigger_flags);
31
32 #define bch2_bkey_ops_reflink_v ((struct bkey_ops) {            \
33         .key_invalid    = bch2_reflink_v_invalid,               \
34         .val_to_text    = bch2_reflink_v_to_text,               \
35         .swab           = bch2_ptr_swab,                        \
36         .trigger        = bch2_trigger_reflink_v,               \
37         .min_val_size   = 8,                                    \
38 })
39
40 int bch2_indirect_inline_data_invalid(struct bch_fs *, struct bkey_s_c,
41                                       enum bch_validate_flags, struct printbuf *);
42 void bch2_indirect_inline_data_to_text(struct printbuf *,
43                                 struct bch_fs *, struct bkey_s_c);
44 int bch2_trigger_indirect_inline_data(struct btree_trans *,
45                                          enum btree_id, unsigned,
46                               struct bkey_s_c, struct bkey_s,
47                               enum btree_iter_update_trigger_flags);
48
49 #define bch2_bkey_ops_indirect_inline_data ((struct bkey_ops) { \
50         .key_invalid    = bch2_indirect_inline_data_invalid,    \
51         .val_to_text    = bch2_indirect_inline_data_to_text,    \
52         .trigger        = bch2_trigger_indirect_inline_data,    \
53         .min_val_size   = 8,                                    \
54 })
55
56 static inline const __le64 *bkey_refcount_c(struct bkey_s_c k)
57 {
58         switch (k.k->type) {
59         case KEY_TYPE_reflink_v:
60                 return &bkey_s_c_to_reflink_v(k).v->refcount;
61         case KEY_TYPE_indirect_inline_data:
62                 return &bkey_s_c_to_indirect_inline_data(k).v->refcount;
63         default:
64                 return NULL;
65         }
66 }
67
68 static inline __le64 *bkey_refcount(struct bkey_s k)
69 {
70         switch (k.k->type) {
71         case KEY_TYPE_reflink_v:
72                 return &bkey_s_to_reflink_v(k).v->refcount;
73         case KEY_TYPE_indirect_inline_data:
74                 return &bkey_s_to_indirect_inline_data(k).v->refcount;
75         default:
76                 return NULL;
77         }
78 }
79
80 s64 bch2_remap_range(struct bch_fs *, subvol_inum, u64,
81                      subvol_inum, u64, u64, u64, s64 *);
82
83 #endif /* _BCACHEFS_REFLINK_H */
This page took 0.038308 seconds and 4 git commands to generate.