blob: 726ef74837638f3f8f9c7deb2311a5eded810aa1 [file] [log] [blame]
Kent Overstreet1c6fdbd2017-03-16 22:18:50 -08001/* SPDX-License-Identifier: GPL-2.0 */
2#ifndef _BCACHEFS_BKEY_METHODS_H
3#define _BCACHEFS_BKEY_METHODS_H
4
5#include "bkey.h"
6
Kent Overstreet1c6fdbd2017-03-16 22:18:50 -08007struct bch_fs;
8struct btree;
Kent Overstreet880e2272022-03-13 00:26:52 -05009struct btree_trans;
Kent Overstreet1c6fdbd2017-03-16 22:18:50 -080010struct bkey;
Kent Overstreet26609b62018-11-01 15:10:01 -040011enum btree_node_type;
12
Kent Overstreeta4461c82019-07-16 12:23:04 -040013extern const char * const bch2_bkey_types[];
Kent Overstreet183e9c42023-07-06 19:23:27 -040014extern const struct bkey_ops bch2_bkey_null_ops;
Kent Overstreet1c6fdbd2017-03-16 22:18:50 -080015
Kent Overstreet275c8422022-04-03 21:50:25 -040016/*
17 * key_invalid: checks validity of @k, returns 0 if good or -EINVAL if bad. If
18 * invalid, entire key will be deleted.
19 *
20 * When invalid, error string is returned via @err. @rw indicates whether key is
21 * being read or written; more aggressive checks can be enabled when rw == WRITE.
Kent Overstreeta1019572022-10-22 15:59:53 -040022 */
Kent Overstreet1c6fdbd2017-03-16 22:18:50 -080023struct bkey_ops {
Kent Overstreetb65db752023-10-24 20:44:36 -040024 int (*key_invalid)(struct bch_fs *c, struct bkey_s_c k,
Kent Overstreet65eaf4e2024-05-08 18:40:42 -040025 enum bch_validate_flags flags, struct printbuf *err);
Kent Overstreet319f9ac2018-11-09 01:24:07 -050026 void (*val_to_text)(struct printbuf *, struct bch_fs *,
27 struct bkey_s_c);
Kent Overstreet1f49daf2020-02-06 20:15:15 -050028 void (*swab)(struct bkey_s);
Kent Overstreet26609b62018-11-01 15:10:01 -040029 bool (*key_normalize)(struct bch_fs *, struct bkey_s);
Kent Overstreet59ba21d2021-04-28 23:49:30 -040030 bool (*key_merge)(struct bch_fs *, struct bkey_s, struct bkey_s_c);
Kent Overstreetf0431c52023-12-31 21:01:06 -050031 int (*trigger)(struct btree_trans *, enum btree_id, unsigned,
Kent Overstreet5dd8c602024-04-07 18:05:34 -040032 struct bkey_s_c, struct bkey_s,
33 enum btree_iter_update_trigger_flags);
Kent Overstreet39fb2982020-01-07 13:29:32 -050034 void (*compat)(enum btree_id id, unsigned version,
35 unsigned big_endian, int write,
36 struct bkey_s);
Kent Overstreet174f9302023-04-29 13:24:18 -040037
38 /* Size of value type when first created: */
39 unsigned min_val_size;
Kent Overstreet1c6fdbd2017-03-16 22:18:50 -080040};
41
Kent Overstreet59ba21d2021-04-28 23:49:30 -040042extern const struct bkey_ops bch2_bkey_ops[];
43
Kent Overstreet183e9c42023-07-06 19:23:27 -040044static inline const struct bkey_ops *bch2_bkey_type_ops(enum bch_bkey_type type)
45{
46 return likely(type < KEY_TYPE_MAX)
47 ? &bch2_bkey_ops[type]
48 : &bch2_bkey_null_ops;
49}
50
Kent Overstreet8726dc92023-07-06 21:16:10 -040051int bch2_bkey_val_invalid(struct bch_fs *, struct bkey_s_c,
Kent Overstreet65eaf4e2024-05-08 18:40:42 -040052 enum bch_validate_flags, struct printbuf *);
Kent Overstreet8726dc92023-07-06 21:16:10 -040053int __bch2_bkey_invalid(struct bch_fs *, struct bkey_s_c, enum btree_node_type,
Kent Overstreet65eaf4e2024-05-08 18:40:42 -040054 enum bch_validate_flags, struct printbuf *);
Kent Overstreet8726dc92023-07-06 21:16:10 -040055int bch2_bkey_invalid(struct bch_fs *, struct bkey_s_c, enum btree_node_type,
Kent Overstreet65eaf4e2024-05-08 18:40:42 -040056 enum bch_validate_flags, struct printbuf *);
Kent Overstreetb65db752023-10-24 20:44:36 -040057int bch2_bkey_in_btree_node(struct bch_fs *, struct btree *,
58 struct bkey_s_c, struct printbuf *);
Kent Overstreet1c6fdbd2017-03-16 22:18:50 -080059
Kent Overstreet319f9ac2018-11-09 01:24:07 -050060void bch2_bpos_to_text(struct printbuf *, struct bpos);
61void bch2_bkey_to_text(struct printbuf *, const struct bkey *);
Kent Overstreet26609b62018-11-01 15:10:01 -040062void bch2_val_to_text(struct printbuf *, struct bch_fs *,
Kent Overstreet319f9ac2018-11-09 01:24:07 -050063 struct bkey_s_c);
64void bch2_bkey_val_to_text(struct printbuf *, struct bch_fs *,
Kent Overstreet26609b62018-11-01 15:10:01 -040065 struct bkey_s_c);
Kent Overstreet1c6fdbd2017-03-16 22:18:50 -080066
Kent Overstreet1f49daf2020-02-06 20:15:15 -050067void bch2_bkey_swab_val(struct bkey_s);
Kent Overstreet1c6fdbd2017-03-16 22:18:50 -080068
Kent Overstreet26609b62018-11-01 15:10:01 -040069bool bch2_bkey_normalize(struct bch_fs *, struct bkey_s);
70
Kent Overstreet59ba21d2021-04-28 23:49:30 -040071static inline bool bch2_bkey_maybe_mergable(const struct bkey *l, const struct bkey *r)
72{
73 return l->type == r->type &&
74 !bversion_cmp(l->version, r->version) &&
Kent Overstreete88a75e2022-11-24 03:12:22 -050075 bpos_eq(l->p, bkey_start_pos(r));
Kent Overstreet59ba21d2021-04-28 23:49:30 -040076}
77
78bool bch2_bkey_merge(struct bch_fs *, struct bkey_s, struct bkey_s_c);
Kent Overstreet26609b62018-11-01 15:10:01 -040079
Kent Overstreetf0431c52023-12-31 21:01:06 -050080static inline int bch2_key_trigger(struct btree_trans *trans,
81 enum btree_id btree, unsigned level,
82 struct bkey_s_c old, struct bkey_s new,
Kent Overstreet5dd8c602024-04-07 18:05:34 -040083 enum btree_iter_update_trigger_flags flags)
Kent Overstreet880e2272022-03-13 00:26:52 -050084{
Kent Overstreet717296c2023-12-27 23:19:09 -050085 const struct bkey_ops *ops = bch2_bkey_type_ops(old.k->type ?: new.k->type);
Kent Overstreet880e2272022-03-13 00:26:52 -050086
Kent Overstreetf0431c52023-12-31 21:01:06 -050087 return ops->trigger
88 ? ops->trigger(trans, btree, level, old, new, flags)
Kent Overstreet880e2272022-03-13 00:26:52 -050089 : 0;
90}
91
Kent Overstreetf0431c52023-12-31 21:01:06 -050092static inline int bch2_key_trigger_old(struct btree_trans *trans,
Kent Overstreet5dd8c602024-04-07 18:05:34 -040093 enum btree_id btree_id, unsigned level,
94 struct bkey_s_c old,
95 enum btree_iter_update_trigger_flags flags)
Kent Overstreete1b8f5f2022-03-31 21:44:55 -040096{
97 struct bkey_i deleted;
98
99 bkey_init(&deleted.k);
100 deleted.k.p = old.k->p;
101
Kent Overstreetf0431c52023-12-31 21:01:06 -0500102 return bch2_key_trigger(trans, btree_id, level, old, bkey_i_to_s(&deleted),
Kent Overstreet5dd8c602024-04-07 18:05:34 -0400103 BTREE_TRIGGER_overwrite|flags);
Kent Overstreete1b8f5f2022-03-31 21:44:55 -0400104}
105
Kent Overstreetf0431c52023-12-31 21:01:06 -0500106static inline int bch2_key_trigger_new(struct btree_trans *trans,
Kent Overstreet5dd8c602024-04-07 18:05:34 -0400107 enum btree_id btree_id, unsigned level,
108 struct bkey_s new,
109 enum btree_iter_update_trigger_flags flags)
Kent Overstreete1b8f5f2022-03-31 21:44:55 -0400110{
111 struct bkey_i deleted;
112
113 bkey_init(&deleted.k);
Kent Overstreet717296c2023-12-27 23:19:09 -0500114 deleted.k.p = new.k->p;
Kent Overstreete1b8f5f2022-03-31 21:44:55 -0400115
Kent Overstreetf0431c52023-12-31 21:01:06 -0500116 return bch2_key_trigger(trans, btree_id, level, bkey_i_to_s_c(&deleted), new,
Kent Overstreet5dd8c602024-04-07 18:05:34 -0400117 BTREE_TRIGGER_insert|flags);
Kent Overstreete1b8f5f2022-03-31 21:44:55 -0400118}
119
Kent Overstreet26609b62018-11-01 15:10:01 -0400120void bch2_bkey_renumber(enum btree_node_type, struct bkey_packed *, int);
Kent Overstreet1c6fdbd2017-03-16 22:18:50 -0800121
Kent Overstreet39fb2982020-01-07 13:29:32 -0500122void __bch2_bkey_compat(unsigned, enum btree_id, unsigned, unsigned,
123 int, struct bkey_format *, struct bkey_packed *);
124
125static inline void bch2_bkey_compat(unsigned level, enum btree_id btree_id,
126 unsigned version, unsigned big_endian,
127 int write,
128 struct bkey_format *f,
129 struct bkey_packed *k)
130{
131 if (version < bcachefs_metadata_version_current ||
132 big_endian != CPU_BIG_ENDIAN)
133 __bch2_bkey_compat(level, btree_id, version,
134 big_endian, write, f, k);
135
136}
137
Kent Overstreet1c6fdbd2017-03-16 22:18:50 -0800138#endif /* _BCACHEFS_BKEY_METHODS_H */