diff options
author | Kent Overstreet <kent.overstreet@gmail.com> | 2017-03-17 09:18:50 +0300 |
---|---|---|
committer | Kent Overstreet <kent.overstreet@linux.dev> | 2023-10-23 00:08:07 +0300 |
commit | 1c6fdbd8f2465ddfb73a01ec620cbf3d14044e1a (patch) | |
tree | 9192de91a00908ee898bc331ac8b0544d6fc030a /fs/bcachefs/bkey_methods.h | |
parent | 0d29a833b7b1800bd2759bbc064b5ada4729caf5 (diff) | |
download | linux-1c6fdbd8f2465ddfb73a01ec620cbf3d14044e1a.tar.xz |
bcachefs: Initial commit
Initially forked from drivers/md/bcache, bcachefs is a new copy-on-write
filesystem with every feature you could possibly want.
Website: https://bcachefs.org
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
Diffstat (limited to 'fs/bcachefs/bkey_methods.h')
-rw-r--r-- | fs/bcachefs/bkey_methods.h | 87 |
1 files changed, 87 insertions, 0 deletions
diff --git a/fs/bcachefs/bkey_methods.h b/fs/bcachefs/bkey_methods.h new file mode 100644 index 000000000000..04c80f3603cc --- /dev/null +++ b/fs/bcachefs/bkey_methods.h @@ -0,0 +1,87 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +#ifndef _BCACHEFS_BKEY_METHODS_H +#define _BCACHEFS_BKEY_METHODS_H + +#include "bkey.h" + +#define DEF_BTREE_ID(kwd, val, name) BKEY_TYPE_##kwd = val, + +enum bkey_type { + DEFINE_BCH_BTREE_IDS() + BKEY_TYPE_BTREE, +}; + +#undef DEF_BTREE_ID + +/* Type of a key in btree @id at level @level: */ +static inline enum bkey_type bkey_type(unsigned level, enum btree_id id) +{ + return level ? BKEY_TYPE_BTREE : (enum bkey_type) id; +} + +static inline bool btree_type_has_ptrs(enum bkey_type type) +{ + switch (type) { + case BKEY_TYPE_BTREE: + case BKEY_TYPE_EXTENTS: + return true; + default: + return false; + } +} + +struct bch_fs; +struct btree; +struct bkey; + +enum merge_result { + BCH_MERGE_NOMERGE, + + /* + * The keys were mergeable, but would have overflowed size - so instead + * l was changed to the maximum size, and both keys were modified: + */ + BCH_MERGE_PARTIAL, + BCH_MERGE_MERGE, +}; + +typedef bool (*key_filter_fn)(struct bch_fs *, struct btree *, + struct bkey_s); +typedef enum merge_result (*key_merge_fn)(struct bch_fs *, + struct btree *, + struct bkey_i *, struct bkey_i *); + +struct bkey_ops { + /* Returns reason for being invalid if invalid, else NULL: */ + const char * (*key_invalid)(const struct bch_fs *, + struct bkey_s_c); + void (*key_debugcheck)(struct bch_fs *, struct btree *, + struct bkey_s_c); + void (*val_to_text)(struct bch_fs *, char *, + size_t, struct bkey_s_c); + void (*swab)(const struct bkey_format *, struct bkey_packed *); + key_filter_fn key_normalize; + key_merge_fn key_merge; + bool is_extents; +}; + +const char *bch2_bkey_val_invalid(struct bch_fs *, enum bkey_type, + struct bkey_s_c); +const char *__bch2_bkey_invalid(struct bch_fs *, enum bkey_type, struct bkey_s_c); +const char *bch2_bkey_invalid(struct bch_fs *, enum bkey_type, struct bkey_s_c); +const char *bch2_bkey_in_btree_node(struct btree *, struct bkey_s_c); + +void bch2_bkey_debugcheck(struct bch_fs *, struct btree *, struct bkey_s_c); + +int bch2_bkey_to_text(char *, size_t, const struct bkey *); +int bch2_val_to_text(struct bch_fs *, enum bkey_type, + char *, size_t, struct bkey_s_c); +int bch2_bkey_val_to_text(struct bch_fs *, enum bkey_type, + char *, size_t, struct bkey_s_c); + +void bch2_bkey_swab(enum bkey_type, const struct bkey_format *, + struct bkey_packed *); + +extern const struct bkey_ops bch2_bkey_ops[]; + +#endif /* _BCACHEFS_BKEY_METHODS_H */ |