]> www.infradead.org Git - linux.git/commitdiff
bcachefs: Split out bkey_types.h
authorKent Overstreet <kent.overstreet@linux.dev>
Fri, 1 Mar 2024 23:49:09 +0000 (18:49 -0500)
committerKent Overstreet <kent.overstreet@linux.dev>
Thu, 14 Mar 2024 01:22:26 +0000 (21:22 -0400)
We're going to need bkey_types.h in bcachefs_ioctl.h in a future patch.

Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
fs/bcachefs/bkey.h
fs/bcachefs/bkey_types.h [new file with mode: 0644]

index 2a8b8fef539c7d80d3a9a57fc9e72c59937ace5b..cf23ff47bed8be588593a7fb193ee21ca8298c65 100644 (file)
@@ -4,7 +4,7 @@
 
 #include <linux/bug.h>
 #include "bcachefs_format.h"
-
+#include "bkey_types.h"
 #include "btree_types.h"
 #include "util.h"
 #include "vstructs.h"
@@ -31,57 +31,6 @@ void bch2_bkey_packed_to_binary_text(struct printbuf *,
                                     const struct bkey_format *,
                                     const struct bkey_packed *);
 
-/* bkey with split value, const */
-struct bkey_s_c {
-       const struct bkey       *k;
-       const struct bch_val    *v;
-};
-
-/* bkey with split value */
-struct bkey_s {
-       union {
-       struct {
-               struct bkey     *k;
-               struct bch_val  *v;
-       };
-       struct bkey_s_c         s_c;
-       };
-};
-
-#define bkey_p_next(_k)                vstruct_next(_k)
-
-static inline struct bkey_i *bkey_next(struct bkey_i *k)
-{
-       return (struct bkey_i *) ((u64 *) k->_data + k->k.u64s);
-}
-
-#define bkey_val_u64s(_k)      ((_k)->u64s - BKEY_U64s)
-
-static inline size_t bkey_val_bytes(const struct bkey *k)
-{
-       return bkey_val_u64s(k) * sizeof(u64);
-}
-
-static inline void set_bkey_val_u64s(struct bkey *k, unsigned val_u64s)
-{
-       unsigned u64s = BKEY_U64s + val_u64s;
-
-       BUG_ON(u64s > U8_MAX);
-       k->u64s = u64s;
-}
-
-static inline void set_bkey_val_bytes(struct bkey *k, unsigned bytes)
-{
-       set_bkey_val_u64s(k, DIV_ROUND_UP(bytes, sizeof(u64)));
-}
-
-#define bkey_val_end(_k)       ((void *) (((u64 *) (_k).v) + bkey_val_u64s((_k).k)))
-
-#define bkey_deleted(_k)       ((_k)->type == KEY_TYPE_deleted)
-
-#define bkey_whiteout(_k)                              \
-       ((_k)->type == KEY_TYPE_deleted || (_k)->type == KEY_TYPE_whiteout)
-
 enum bkey_lr_packed {
        BKEY_PACKED_BOTH,
        BKEY_PACKED_RIGHT,
@@ -550,155 +499,6 @@ static inline void bkey_reassemble(struct bkey_i *dst,
        memcpy_u64s_small(&dst->v, src.v, bkey_val_u64s(src.k));
 }
 
-#define bkey_s_null            ((struct bkey_s)   { .k = NULL })
-#define bkey_s_c_null          ((struct bkey_s_c) { .k = NULL })
-
-#define bkey_s_err(err)                ((struct bkey_s)   { .k = ERR_PTR(err) })
-#define bkey_s_c_err(err)      ((struct bkey_s_c) { .k = ERR_PTR(err) })
-
-static inline struct bkey_s bkey_to_s(struct bkey *k)
-{
-       return (struct bkey_s) { .k = k, .v = NULL };
-}
-
-static inline struct bkey_s_c bkey_to_s_c(const struct bkey *k)
-{
-       return (struct bkey_s_c) { .k = k, .v = NULL };
-}
-
-static inline struct bkey_s bkey_i_to_s(struct bkey_i *k)
-{
-       return (struct bkey_s) { .k = &k->k, .v = &k->v };
-}
-
-static inline struct bkey_s_c bkey_i_to_s_c(const struct bkey_i *k)
-{
-       return (struct bkey_s_c) { .k = &k->k, .v = &k->v };
-}
-
-/*
- * For a given type of value (e.g. struct bch_extent), generates the types for
- * bkey + bch_extent - inline, split, split const - and also all the conversion
- * functions, which also check that the value is of the correct type.
- *
- * We use anonymous unions for upcasting - e.g. converting from e.g. a
- * bkey_i_extent to a bkey_i - since that's always safe, instead of conversion
- * functions.
- */
-#define x(name, ...)                                   \
-struct bkey_i_##name {                                                 \
-       union {                                                         \
-               struct bkey             k;                              \
-               struct bkey_i           k_i;                            \
-       };                                                              \
-       struct bch_##name               v;                              \
-};                                                                     \
-                                                                       \
-struct bkey_s_c_##name {                                               \
-       union {                                                         \
-       struct {                                                        \
-               const struct bkey       *k;                             \
-               const struct bch_##name *v;                             \
-       };                                                              \
-       struct bkey_s_c                 s_c;                            \
-       };                                                              \
-};                                                                     \
-                                                                       \
-struct bkey_s_##name {                                                 \
-       union {                                                         \
-       struct {                                                        \
-               struct bkey             *k;                             \
-               struct bch_##name       *v;                             \
-       };                                                              \
-       struct bkey_s_c_##name          c;                              \
-       struct bkey_s                   s;                              \
-       struct bkey_s_c                 s_c;                            \
-       };                                                              \
-};                                                                     \
-                                                                       \
-static inline struct bkey_i_##name *bkey_i_to_##name(struct bkey_i *k) \
-{                                                                      \
-       EBUG_ON(!IS_ERR_OR_NULL(k) && k->k.type != KEY_TYPE_##name);    \
-       return container_of(&k->k, struct bkey_i_##name, k);            \
-}                                                                      \
-                                                                       \
-static inline const struct bkey_i_##name *                             \
-bkey_i_to_##name##_c(const struct bkey_i *k)                           \
-{                                                                      \
-       EBUG_ON(!IS_ERR_OR_NULL(k) && k->k.type != KEY_TYPE_##name);    \
-       return container_of(&k->k, struct bkey_i_##name, k);            \
-}                                                                      \
-                                                                       \
-static inline struct bkey_s_##name bkey_s_to_##name(struct bkey_s k)   \
-{                                                                      \
-       EBUG_ON(!IS_ERR_OR_NULL(k.k) && k.k->type != KEY_TYPE_##name);  \
-       return (struct bkey_s_##name) {                                 \
-               .k = k.k,                                               \
-               .v = container_of(k.v, struct bch_##name, v),           \
-       };                                                              \
-}                                                                      \
-                                                                       \
-static inline struct bkey_s_c_##name bkey_s_c_to_##name(struct bkey_s_c k)\
-{                                                                      \
-       EBUG_ON(!IS_ERR_OR_NULL(k.k) && k.k->type != KEY_TYPE_##name);  \
-       return (struct bkey_s_c_##name) {                               \
-               .k = k.k,                                               \
-               .v = container_of(k.v, struct bch_##name, v),           \
-       };                                                              \
-}                                                                      \
-                                                                       \
-static inline struct bkey_s_##name name##_i_to_s(struct bkey_i_##name *k)\
-{                                                                      \
-       return (struct bkey_s_##name) {                                 \
-               .k = &k->k,                                             \
-               .v = &k->v,                                             \
-       };                                                              \
-}                                                                      \
-                                                                       \
-static inline struct bkey_s_c_##name                                   \
-name##_i_to_s_c(const struct bkey_i_##name *k)                         \
-{                                                                      \
-       return (struct bkey_s_c_##name) {                               \
-               .k = &k->k,                                             \
-               .v = &k->v,                                             \
-       };                                                              \
-}                                                                      \
-                                                                       \
-static inline struct bkey_s_##name bkey_i_to_s_##name(struct bkey_i *k)        \
-{                                                                      \
-       EBUG_ON(!IS_ERR_OR_NULL(k) && k->k.type != KEY_TYPE_##name);    \
-       return (struct bkey_s_##name) {                                 \
-               .k = &k->k,                                             \
-               .v = container_of(&k->v, struct bch_##name, v),         \
-       };                                                              \
-}                                                                      \
-                                                                       \
-static inline struct bkey_s_c_##name                                   \
-bkey_i_to_s_c_##name(const struct bkey_i *k)                           \
-{                                                                      \
-       EBUG_ON(!IS_ERR_OR_NULL(k) && k->k.type != KEY_TYPE_##name);    \
-       return (struct bkey_s_c_##name) {                               \
-               .k = &k->k,                                             \
-               .v = container_of(&k->v, struct bch_##name, v),         \
-       };                                                              \
-}                                                                      \
-                                                                       \
-static inline struct bkey_i_##name *bkey_##name##_init(struct bkey_i *_k)\
-{                                                                      \
-       struct bkey_i_##name *k =                                       \
-               container_of(&_k->k, struct bkey_i_##name, k);          \
-                                                                       \
-       bkey_init(&k->k);                                               \
-       memset(&k->v, 0, sizeof(k->v));                                 \
-       k->k.type = KEY_TYPE_##name;                                    \
-       set_bkey_val_bytes(&k->k, sizeof(k->v));                        \
-                                                                       \
-       return k;                                                       \
-}
-
-BCH_BKEY_TYPES();
-#undef x
-
 /* byte order helpers */
 
 #if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
diff --git a/fs/bcachefs/bkey_types.h b/fs/bcachefs/bkey_types.h
new file mode 100644 (file)
index 0000000..c9ae9e4
--- /dev/null
@@ -0,0 +1,213 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+#ifndef _BCACHEFS_BKEY_TYPES_H
+#define _BCACHEFS_BKEY_TYPES_H
+
+#include "bcachefs_format.h"
+
+/*
+ * bkey_i      - bkey with inline value
+ * bkey_s      - bkey with split value
+ * bkey_s_c    - bkey with split value, const
+ */
+
+#define bkey_p_next(_k)                vstruct_next(_k)
+
+static inline struct bkey_i *bkey_next(struct bkey_i *k)
+{
+       return (struct bkey_i *) ((u64 *) k->_data + k->k.u64s);
+}
+
+#define bkey_val_u64s(_k)      ((_k)->u64s - BKEY_U64s)
+
+static inline size_t bkey_val_bytes(const struct bkey *k)
+{
+       return bkey_val_u64s(k) * sizeof(u64);
+}
+
+static inline void set_bkey_val_u64s(struct bkey *k, unsigned val_u64s)
+{
+       unsigned u64s = BKEY_U64s + val_u64s;
+
+       BUG_ON(u64s > U8_MAX);
+       k->u64s = u64s;
+}
+
+static inline void set_bkey_val_bytes(struct bkey *k, unsigned bytes)
+{
+       set_bkey_val_u64s(k, DIV_ROUND_UP(bytes, sizeof(u64)));
+}
+
+#define bkey_val_end(_k)       ((void *) (((u64 *) (_k).v) + bkey_val_u64s((_k).k)))
+
+#define bkey_deleted(_k)       ((_k)->type == KEY_TYPE_deleted)
+
+#define bkey_whiteout(_k)                              \
+       ((_k)->type == KEY_TYPE_deleted || (_k)->type == KEY_TYPE_whiteout)
+
+/* bkey with split value, const */
+struct bkey_s_c {
+       const struct bkey       *k;
+       const struct bch_val    *v;
+};
+
+/* bkey with split value */
+struct bkey_s {
+       union {
+       struct {
+               struct bkey     *k;
+               struct bch_val  *v;
+       };
+       struct bkey_s_c         s_c;
+       };
+};
+
+#define bkey_s_null            ((struct bkey_s)   { .k = NULL })
+#define bkey_s_c_null          ((struct bkey_s_c) { .k = NULL })
+
+#define bkey_s_err(err)                ((struct bkey_s)   { .k = ERR_PTR(err) })
+#define bkey_s_c_err(err)      ((struct bkey_s_c) { .k = ERR_PTR(err) })
+
+static inline struct bkey_s bkey_to_s(struct bkey *k)
+{
+       return (struct bkey_s) { .k = k, .v = NULL };
+}
+
+static inline struct bkey_s_c bkey_to_s_c(const struct bkey *k)
+{
+       return (struct bkey_s_c) { .k = k, .v = NULL };
+}
+
+static inline struct bkey_s bkey_i_to_s(struct bkey_i *k)
+{
+       return (struct bkey_s) { .k = &k->k, .v = &k->v };
+}
+
+static inline struct bkey_s_c bkey_i_to_s_c(const struct bkey_i *k)
+{
+       return (struct bkey_s_c) { .k = &k->k, .v = &k->v };
+}
+
+/*
+ * For a given type of value (e.g. struct bch_extent), generates the types for
+ * bkey + bch_extent - inline, split, split const - and also all the conversion
+ * functions, which also check that the value is of the correct type.
+ *
+ * We use anonymous unions for upcasting - e.g. converting from e.g. a
+ * bkey_i_extent to a bkey_i - since that's always safe, instead of conversion
+ * functions.
+ */
+#define x(name, ...)                                   \
+struct bkey_i_##name {                                                 \
+       union {                                                         \
+               struct bkey             k;                              \
+               struct bkey_i           k_i;                            \
+       };                                                              \
+       struct bch_##name               v;                              \
+};                                                                     \
+                                                                       \
+struct bkey_s_c_##name {                                               \
+       union {                                                         \
+       struct {                                                        \
+               const struct bkey       *k;                             \
+               const struct bch_##name *v;                             \
+       };                                                              \
+       struct bkey_s_c                 s_c;                            \
+       };                                                              \
+};                                                                     \
+                                                                       \
+struct bkey_s_##name {                                                 \
+       union {                                                         \
+       struct {                                                        \
+               struct bkey             *k;                             \
+               struct bch_##name       *v;                             \
+       };                                                              \
+       struct bkey_s_c_##name          c;                              \
+       struct bkey_s                   s;                              \
+       struct bkey_s_c                 s_c;                            \
+       };                                                              \
+};                                                                     \
+                                                                       \
+static inline struct bkey_i_##name *bkey_i_to_##name(struct bkey_i *k) \
+{                                                                      \
+       EBUG_ON(!IS_ERR_OR_NULL(k) && k->k.type != KEY_TYPE_##name);    \
+       return container_of(&k->k, struct bkey_i_##name, k);            \
+}                                                                      \
+                                                                       \
+static inline const struct bkey_i_##name *                             \
+bkey_i_to_##name##_c(const struct bkey_i *k)                           \
+{                                                                      \
+       EBUG_ON(!IS_ERR_OR_NULL(k) && k->k.type != KEY_TYPE_##name);    \
+       return container_of(&k->k, struct bkey_i_##name, k);            \
+}                                                                      \
+                                                                       \
+static inline struct bkey_s_##name bkey_s_to_##name(struct bkey_s k)   \
+{                                                                      \
+       EBUG_ON(!IS_ERR_OR_NULL(k.k) && k.k->type != KEY_TYPE_##name);  \
+       return (struct bkey_s_##name) {                                 \
+               .k = k.k,                                               \
+               .v = container_of(k.v, struct bch_##name, v),           \
+       };                                                              \
+}                                                                      \
+                                                                       \
+static inline struct bkey_s_c_##name bkey_s_c_to_##name(struct bkey_s_c k)\
+{                                                                      \
+       EBUG_ON(!IS_ERR_OR_NULL(k.k) && k.k->type != KEY_TYPE_##name);  \
+       return (struct bkey_s_c_##name) {                               \
+               .k = k.k,                                               \
+               .v = container_of(k.v, struct bch_##name, v),           \
+       };                                                              \
+}                                                                      \
+                                                                       \
+static inline struct bkey_s_##name name##_i_to_s(struct bkey_i_##name *k)\
+{                                                                      \
+       return (struct bkey_s_##name) {                                 \
+               .k = &k->k,                                             \
+               .v = &k->v,                                             \
+       };                                                              \
+}                                                                      \
+                                                                       \
+static inline struct bkey_s_c_##name                                   \
+name##_i_to_s_c(const struct bkey_i_##name *k)                         \
+{                                                                      \
+       return (struct bkey_s_c_##name) {                               \
+               .k = &k->k,                                             \
+               .v = &k->v,                                             \
+       };                                                              \
+}                                                                      \
+                                                                       \
+static inline struct bkey_s_##name bkey_i_to_s_##name(struct bkey_i *k)        \
+{                                                                      \
+       EBUG_ON(!IS_ERR_OR_NULL(k) && k->k.type != KEY_TYPE_##name);    \
+       return (struct bkey_s_##name) {                                 \
+               .k = &k->k,                                             \
+               .v = container_of(&k->v, struct bch_##name, v),         \
+       };                                                              \
+}                                                                      \
+                                                                       \
+static inline struct bkey_s_c_##name                                   \
+bkey_i_to_s_c_##name(const struct bkey_i *k)                           \
+{                                                                      \
+       EBUG_ON(!IS_ERR_OR_NULL(k) && k->k.type != KEY_TYPE_##name);    \
+       return (struct bkey_s_c_##name) {                               \
+               .k = &k->k,                                             \
+               .v = container_of(&k->v, struct bch_##name, v),         \
+       };                                                              \
+}                                                                      \
+                                                                       \
+static inline struct bkey_i_##name *bkey_##name##_init(struct bkey_i *_k)\
+{                                                                      \
+       struct bkey_i_##name *k =                                       \
+               container_of(&_k->k, struct bkey_i_##name, k);          \
+                                                                       \
+       bkey_init(&k->k);                                               \
+       memset(&k->v, 0, sizeof(k->v));                                 \
+       k->k.type = KEY_TYPE_##name;                                    \
+       set_bkey_val_bytes(&k->k, sizeof(k->v));                        \
+                                                                       \
+       return k;                                                       \
+}
+
+BCH_BKEY_TYPES();
+#undef x
+
+#endif /* _BCACHEFS_BKEY_TYPES_H */