Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

bcachefs: Split out bkey_types.h

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>

+214 -201
+1 -201
fs/bcachefs/bkey.h
··· 4 4 5 5 #include <linux/bug.h> 6 6 #include "bcachefs_format.h" 7 - 7 + #include "bkey_types.h" 8 8 #include "btree_types.h" 9 9 #include "util.h" 10 10 #include "vstructs.h" ··· 30 30 void bch2_bkey_packed_to_binary_text(struct printbuf *, 31 31 const struct bkey_format *, 32 32 const struct bkey_packed *); 33 - 34 - /* bkey with split value, const */ 35 - struct bkey_s_c { 36 - const struct bkey *k; 37 - const struct bch_val *v; 38 - }; 39 - 40 - /* bkey with split value */ 41 - struct bkey_s { 42 - union { 43 - struct { 44 - struct bkey *k; 45 - struct bch_val *v; 46 - }; 47 - struct bkey_s_c s_c; 48 - }; 49 - }; 50 - 51 - #define bkey_p_next(_k) vstruct_next(_k) 52 - 53 - static inline struct bkey_i *bkey_next(struct bkey_i *k) 54 - { 55 - return (struct bkey_i *) ((u64 *) k->_data + k->k.u64s); 56 - } 57 - 58 - #define bkey_val_u64s(_k) ((_k)->u64s - BKEY_U64s) 59 - 60 - static inline size_t bkey_val_bytes(const struct bkey *k) 61 - { 62 - return bkey_val_u64s(k) * sizeof(u64); 63 - } 64 - 65 - static inline void set_bkey_val_u64s(struct bkey *k, unsigned val_u64s) 66 - { 67 - unsigned u64s = BKEY_U64s + val_u64s; 68 - 69 - BUG_ON(u64s > U8_MAX); 70 - k->u64s = u64s; 71 - } 72 - 73 - static inline void set_bkey_val_bytes(struct bkey *k, unsigned bytes) 74 - { 75 - set_bkey_val_u64s(k, DIV_ROUND_UP(bytes, sizeof(u64))); 76 - } 77 - 78 - #define bkey_val_end(_k) ((void *) (((u64 *) (_k).v) + bkey_val_u64s((_k).k))) 79 - 80 - #define bkey_deleted(_k) ((_k)->type == KEY_TYPE_deleted) 81 - 82 - #define bkey_whiteout(_k) \ 83 - ((_k)->type == KEY_TYPE_deleted || (_k)->type == KEY_TYPE_whiteout) 84 33 85 34 enum bkey_lr_packed { 86 35 BKEY_PACKED_BOTH, ··· 498 549 dst->k = *src.k; 499 550 memcpy_u64s_small(&dst->v, src.v, bkey_val_u64s(src.k)); 500 551 } 501 - 502 - #define bkey_s_null ((struct bkey_s) { .k = NULL }) 503 - #define bkey_s_c_null ((struct bkey_s_c) { .k = NULL }) 504 - 505 - #define bkey_s_err(err) ((struct bkey_s) { .k = ERR_PTR(err) }) 506 - #define bkey_s_c_err(err) ((struct bkey_s_c) { .k = ERR_PTR(err) }) 507 - 508 - static inline struct bkey_s bkey_to_s(struct bkey *k) 509 - { 510 - return (struct bkey_s) { .k = k, .v = NULL }; 511 - } 512 - 513 - static inline struct bkey_s_c bkey_to_s_c(const struct bkey *k) 514 - { 515 - return (struct bkey_s_c) { .k = k, .v = NULL }; 516 - } 517 - 518 - static inline struct bkey_s bkey_i_to_s(struct bkey_i *k) 519 - { 520 - return (struct bkey_s) { .k = &k->k, .v = &k->v }; 521 - } 522 - 523 - static inline struct bkey_s_c bkey_i_to_s_c(const struct bkey_i *k) 524 - { 525 - return (struct bkey_s_c) { .k = &k->k, .v = &k->v }; 526 - } 527 - 528 - /* 529 - * For a given type of value (e.g. struct bch_extent), generates the types for 530 - * bkey + bch_extent - inline, split, split const - and also all the conversion 531 - * functions, which also check that the value is of the correct type. 532 - * 533 - * We use anonymous unions for upcasting - e.g. converting from e.g. a 534 - * bkey_i_extent to a bkey_i - since that's always safe, instead of conversion 535 - * functions. 536 - */ 537 - #define x(name, ...) \ 538 - struct bkey_i_##name { \ 539 - union { \ 540 - struct bkey k; \ 541 - struct bkey_i k_i; \ 542 - }; \ 543 - struct bch_##name v; \ 544 - }; \ 545 - \ 546 - struct bkey_s_c_##name { \ 547 - union { \ 548 - struct { \ 549 - const struct bkey *k; \ 550 - const struct bch_##name *v; \ 551 - }; \ 552 - struct bkey_s_c s_c; \ 553 - }; \ 554 - }; \ 555 - \ 556 - struct bkey_s_##name { \ 557 - union { \ 558 - struct { \ 559 - struct bkey *k; \ 560 - struct bch_##name *v; \ 561 - }; \ 562 - struct bkey_s_c_##name c; \ 563 - struct bkey_s s; \ 564 - struct bkey_s_c s_c; \ 565 - }; \ 566 - }; \ 567 - \ 568 - static inline struct bkey_i_##name *bkey_i_to_##name(struct bkey_i *k) \ 569 - { \ 570 - EBUG_ON(!IS_ERR_OR_NULL(k) && k->k.type != KEY_TYPE_##name); \ 571 - return container_of(&k->k, struct bkey_i_##name, k); \ 572 - } \ 573 - \ 574 - static inline const struct bkey_i_##name * \ 575 - bkey_i_to_##name##_c(const struct bkey_i *k) \ 576 - { \ 577 - EBUG_ON(!IS_ERR_OR_NULL(k) && k->k.type != KEY_TYPE_##name); \ 578 - return container_of(&k->k, struct bkey_i_##name, k); \ 579 - } \ 580 - \ 581 - static inline struct bkey_s_##name bkey_s_to_##name(struct bkey_s k) \ 582 - { \ 583 - EBUG_ON(!IS_ERR_OR_NULL(k.k) && k.k->type != KEY_TYPE_##name); \ 584 - return (struct bkey_s_##name) { \ 585 - .k = k.k, \ 586 - .v = container_of(k.v, struct bch_##name, v), \ 587 - }; \ 588 - } \ 589 - \ 590 - static inline struct bkey_s_c_##name bkey_s_c_to_##name(struct bkey_s_c k)\ 591 - { \ 592 - EBUG_ON(!IS_ERR_OR_NULL(k.k) && k.k->type != KEY_TYPE_##name); \ 593 - return (struct bkey_s_c_##name) { \ 594 - .k = k.k, \ 595 - .v = container_of(k.v, struct bch_##name, v), \ 596 - }; \ 597 - } \ 598 - \ 599 - static inline struct bkey_s_##name name##_i_to_s(struct bkey_i_##name *k)\ 600 - { \ 601 - return (struct bkey_s_##name) { \ 602 - .k = &k->k, \ 603 - .v = &k->v, \ 604 - }; \ 605 - } \ 606 - \ 607 - static inline struct bkey_s_c_##name \ 608 - name##_i_to_s_c(const struct bkey_i_##name *k) \ 609 - { \ 610 - return (struct bkey_s_c_##name) { \ 611 - .k = &k->k, \ 612 - .v = &k->v, \ 613 - }; \ 614 - } \ 615 - \ 616 - static inline struct bkey_s_##name bkey_i_to_s_##name(struct bkey_i *k) \ 617 - { \ 618 - EBUG_ON(!IS_ERR_OR_NULL(k) && k->k.type != KEY_TYPE_##name); \ 619 - return (struct bkey_s_##name) { \ 620 - .k = &k->k, \ 621 - .v = container_of(&k->v, struct bch_##name, v), \ 622 - }; \ 623 - } \ 624 - \ 625 - static inline struct bkey_s_c_##name \ 626 - bkey_i_to_s_c_##name(const struct bkey_i *k) \ 627 - { \ 628 - EBUG_ON(!IS_ERR_OR_NULL(k) && k->k.type != KEY_TYPE_##name); \ 629 - return (struct bkey_s_c_##name) { \ 630 - .k = &k->k, \ 631 - .v = container_of(&k->v, struct bch_##name, v), \ 632 - }; \ 633 - } \ 634 - \ 635 - static inline struct bkey_i_##name *bkey_##name##_init(struct bkey_i *_k)\ 636 - { \ 637 - struct bkey_i_##name *k = \ 638 - container_of(&_k->k, struct bkey_i_##name, k); \ 639 - \ 640 - bkey_init(&k->k); \ 641 - memset(&k->v, 0, sizeof(k->v)); \ 642 - k->k.type = KEY_TYPE_##name; \ 643 - set_bkey_val_bytes(&k->k, sizeof(k->v)); \ 644 - \ 645 - return k; \ 646 - } 647 - 648 - BCH_BKEY_TYPES(); 649 - #undef x 650 552 651 553 /* byte order helpers */ 652 554
+213
fs/bcachefs/bkey_types.h
··· 1 + /* SPDX-License-Identifier: GPL-2.0 */ 2 + #ifndef _BCACHEFS_BKEY_TYPES_H 3 + #define _BCACHEFS_BKEY_TYPES_H 4 + 5 + #include "bcachefs_format.h" 6 + 7 + /* 8 + * bkey_i - bkey with inline value 9 + * bkey_s - bkey with split value 10 + * bkey_s_c - bkey with split value, const 11 + */ 12 + 13 + #define bkey_p_next(_k) vstruct_next(_k) 14 + 15 + static inline struct bkey_i *bkey_next(struct bkey_i *k) 16 + { 17 + return (struct bkey_i *) ((u64 *) k->_data + k->k.u64s); 18 + } 19 + 20 + #define bkey_val_u64s(_k) ((_k)->u64s - BKEY_U64s) 21 + 22 + static inline size_t bkey_val_bytes(const struct bkey *k) 23 + { 24 + return bkey_val_u64s(k) * sizeof(u64); 25 + } 26 + 27 + static inline void set_bkey_val_u64s(struct bkey *k, unsigned val_u64s) 28 + { 29 + unsigned u64s = BKEY_U64s + val_u64s; 30 + 31 + BUG_ON(u64s > U8_MAX); 32 + k->u64s = u64s; 33 + } 34 + 35 + static inline void set_bkey_val_bytes(struct bkey *k, unsigned bytes) 36 + { 37 + set_bkey_val_u64s(k, DIV_ROUND_UP(bytes, sizeof(u64))); 38 + } 39 + 40 + #define bkey_val_end(_k) ((void *) (((u64 *) (_k).v) + bkey_val_u64s((_k).k))) 41 + 42 + #define bkey_deleted(_k) ((_k)->type == KEY_TYPE_deleted) 43 + 44 + #define bkey_whiteout(_k) \ 45 + ((_k)->type == KEY_TYPE_deleted || (_k)->type == KEY_TYPE_whiteout) 46 + 47 + /* bkey with split value, const */ 48 + struct bkey_s_c { 49 + const struct bkey *k; 50 + const struct bch_val *v; 51 + }; 52 + 53 + /* bkey with split value */ 54 + struct bkey_s { 55 + union { 56 + struct { 57 + struct bkey *k; 58 + struct bch_val *v; 59 + }; 60 + struct bkey_s_c s_c; 61 + }; 62 + }; 63 + 64 + #define bkey_s_null ((struct bkey_s) { .k = NULL }) 65 + #define bkey_s_c_null ((struct bkey_s_c) { .k = NULL }) 66 + 67 + #define bkey_s_err(err) ((struct bkey_s) { .k = ERR_PTR(err) }) 68 + #define bkey_s_c_err(err) ((struct bkey_s_c) { .k = ERR_PTR(err) }) 69 + 70 + static inline struct bkey_s bkey_to_s(struct bkey *k) 71 + { 72 + return (struct bkey_s) { .k = k, .v = NULL }; 73 + } 74 + 75 + static inline struct bkey_s_c bkey_to_s_c(const struct bkey *k) 76 + { 77 + return (struct bkey_s_c) { .k = k, .v = NULL }; 78 + } 79 + 80 + static inline struct bkey_s bkey_i_to_s(struct bkey_i *k) 81 + { 82 + return (struct bkey_s) { .k = &k->k, .v = &k->v }; 83 + } 84 + 85 + static inline struct bkey_s_c bkey_i_to_s_c(const struct bkey_i *k) 86 + { 87 + return (struct bkey_s_c) { .k = &k->k, .v = &k->v }; 88 + } 89 + 90 + /* 91 + * For a given type of value (e.g. struct bch_extent), generates the types for 92 + * bkey + bch_extent - inline, split, split const - and also all the conversion 93 + * functions, which also check that the value is of the correct type. 94 + * 95 + * We use anonymous unions for upcasting - e.g. converting from e.g. a 96 + * bkey_i_extent to a bkey_i - since that's always safe, instead of conversion 97 + * functions. 98 + */ 99 + #define x(name, ...) \ 100 + struct bkey_i_##name { \ 101 + union { \ 102 + struct bkey k; \ 103 + struct bkey_i k_i; \ 104 + }; \ 105 + struct bch_##name v; \ 106 + }; \ 107 + \ 108 + struct bkey_s_c_##name { \ 109 + union { \ 110 + struct { \ 111 + const struct bkey *k; \ 112 + const struct bch_##name *v; \ 113 + }; \ 114 + struct bkey_s_c s_c; \ 115 + }; \ 116 + }; \ 117 + \ 118 + struct bkey_s_##name { \ 119 + union { \ 120 + struct { \ 121 + struct bkey *k; \ 122 + struct bch_##name *v; \ 123 + }; \ 124 + struct bkey_s_c_##name c; \ 125 + struct bkey_s s; \ 126 + struct bkey_s_c s_c; \ 127 + }; \ 128 + }; \ 129 + \ 130 + static inline struct bkey_i_##name *bkey_i_to_##name(struct bkey_i *k) \ 131 + { \ 132 + EBUG_ON(!IS_ERR_OR_NULL(k) && k->k.type != KEY_TYPE_##name); \ 133 + return container_of(&k->k, struct bkey_i_##name, k); \ 134 + } \ 135 + \ 136 + static inline const struct bkey_i_##name * \ 137 + bkey_i_to_##name##_c(const struct bkey_i *k) \ 138 + { \ 139 + EBUG_ON(!IS_ERR_OR_NULL(k) && k->k.type != KEY_TYPE_##name); \ 140 + return container_of(&k->k, struct bkey_i_##name, k); \ 141 + } \ 142 + \ 143 + static inline struct bkey_s_##name bkey_s_to_##name(struct bkey_s k) \ 144 + { \ 145 + EBUG_ON(!IS_ERR_OR_NULL(k.k) && k.k->type != KEY_TYPE_##name); \ 146 + return (struct bkey_s_##name) { \ 147 + .k = k.k, \ 148 + .v = container_of(k.v, struct bch_##name, v), \ 149 + }; \ 150 + } \ 151 + \ 152 + static inline struct bkey_s_c_##name bkey_s_c_to_##name(struct bkey_s_c k)\ 153 + { \ 154 + EBUG_ON(!IS_ERR_OR_NULL(k.k) && k.k->type != KEY_TYPE_##name); \ 155 + return (struct bkey_s_c_##name) { \ 156 + .k = k.k, \ 157 + .v = container_of(k.v, struct bch_##name, v), \ 158 + }; \ 159 + } \ 160 + \ 161 + static inline struct bkey_s_##name name##_i_to_s(struct bkey_i_##name *k)\ 162 + { \ 163 + return (struct bkey_s_##name) { \ 164 + .k = &k->k, \ 165 + .v = &k->v, \ 166 + }; \ 167 + } \ 168 + \ 169 + static inline struct bkey_s_c_##name \ 170 + name##_i_to_s_c(const struct bkey_i_##name *k) \ 171 + { \ 172 + return (struct bkey_s_c_##name) { \ 173 + .k = &k->k, \ 174 + .v = &k->v, \ 175 + }; \ 176 + } \ 177 + \ 178 + static inline struct bkey_s_##name bkey_i_to_s_##name(struct bkey_i *k) \ 179 + { \ 180 + EBUG_ON(!IS_ERR_OR_NULL(k) && k->k.type != KEY_TYPE_##name); \ 181 + return (struct bkey_s_##name) { \ 182 + .k = &k->k, \ 183 + .v = container_of(&k->v, struct bch_##name, v), \ 184 + }; \ 185 + } \ 186 + \ 187 + static inline struct bkey_s_c_##name \ 188 + bkey_i_to_s_c_##name(const struct bkey_i *k) \ 189 + { \ 190 + EBUG_ON(!IS_ERR_OR_NULL(k) && k->k.type != KEY_TYPE_##name); \ 191 + return (struct bkey_s_c_##name) { \ 192 + .k = &k->k, \ 193 + .v = container_of(&k->v, struct bch_##name, v), \ 194 + }; \ 195 + } \ 196 + \ 197 + static inline struct bkey_i_##name *bkey_##name##_init(struct bkey_i *_k)\ 198 + { \ 199 + struct bkey_i_##name *k = \ 200 + container_of(&_k->k, struct bkey_i_##name, k); \ 201 + \ 202 + bkey_init(&k->k); \ 203 + memset(&k->v, 0, sizeof(k->v)); \ 204 + k->k.type = KEY_TYPE_##name; \ 205 + set_bkey_val_bytes(&k->k, sizeof(k->v)); \ 206 + \ 207 + return k; \ 208 + } 209 + 210 + BCH_BKEY_TYPES(); 211 + #undef x 212 + 213 + #endif /* _BCACHEFS_BKEY_TYPES_H */