]> git.sesse.net Git - bcachefs-tools-debian/blob - libbcachefs/bkey_methods.h
Update bcachefs sources to e82e656279 bcachefs: Cleanups for building in userspace
[bcachefs-tools-debian] / libbcachefs / bkey_methods.h
1 #ifndef _BCACHEFS_BKEY_METHODS_H
2 #define _BCACHEFS_BKEY_METHODS_H
3
4 #include "bkey.h"
5
6 #define DEF_BTREE_ID(kwd, val, name) BKEY_TYPE_##kwd = val,
7
8 enum bkey_type {
9         DEFINE_BCH_BTREE_IDS()
10         BKEY_TYPE_BTREE,
11 };
12
13 #undef DEF_BTREE_ID
14
15 /* Type of a key in btree @id at level @level: */
16 static inline enum bkey_type bkey_type(unsigned level, enum btree_id id)
17 {
18         return level ? BKEY_TYPE_BTREE : (enum bkey_type) id;
19 }
20
21 static inline bool btree_type_has_ptrs(enum bkey_type type)
22 {
23         switch (type) {
24         case BKEY_TYPE_BTREE:
25         case BKEY_TYPE_EXTENTS:
26                 return true;
27         default:
28                 return false;
29         }
30 }
31
32 struct bch_fs;
33 struct btree;
34 struct bkey;
35
36 enum merge_result {
37         BCH_MERGE_NOMERGE,
38
39         /*
40          * The keys were mergeable, but would have overflowed size - so instead
41          * l was changed to the maximum size, and both keys were modified:
42          */
43         BCH_MERGE_PARTIAL,
44         BCH_MERGE_MERGE,
45 };
46
47 typedef bool (*key_filter_fn)(struct bch_fs *, struct btree *,
48                               struct bkey_s);
49 typedef enum merge_result (*key_merge_fn)(struct bch_fs *,
50                                           struct btree *,
51                                           struct bkey_i *, struct bkey_i *);
52
53 struct bkey_ops {
54         /* Returns reason for being invalid if invalid, else NULL: */
55         const char *    (*key_invalid)(const struct bch_fs *,
56                                        struct bkey_s_c);
57         void            (*key_debugcheck)(struct bch_fs *, struct btree *,
58                                           struct bkey_s_c);
59         void            (*val_to_text)(struct bch_fs *, char *,
60                                        size_t, struct bkey_s_c);
61         void            (*swab)(const struct bkey_format *, struct bkey_packed *);
62         key_filter_fn   key_normalize;
63         key_merge_fn    key_merge;
64         bool            is_extents;
65 };
66
67 const char *bch2_bkey_invalid(struct bch_fs *, enum bkey_type, struct bkey_s_c);
68 const char *bch2_btree_bkey_invalid(struct bch_fs *, struct btree *,
69                                     struct bkey_s_c);
70
71 void bch2_bkey_debugcheck(struct bch_fs *, struct btree *, struct bkey_s_c);
72 char *bch2_val_to_text(struct bch_fs *, enum bkey_type,
73                        char *, size_t, struct bkey_s_c);
74 char *bch2_bkey_val_to_text(struct bch_fs *, enum bkey_type,
75                             char *, size_t, struct bkey_s_c);
76
77 void bch2_bkey_swab(enum bkey_type, const struct bkey_format *,
78                     struct bkey_packed *);
79
80 extern const struct bkey_ops *bch2_bkey_ops[];
81
82 #endif /* _BCACHEFS_BKEY_METHODS_H */