| /* SPDX-License-Identifier: GPL-2.0 */ |
| #ifndef _BCACHEFS_BKEY_ON_STACK_H |
| #define _BCACHEFS_BKEY_ON_STACK_H |
| |
| #include "bcachefs.h" |
| |
| struct bkey_on_stack { |
| struct bkey_i *k; |
| u64 onstack[12]; |
| }; |
| |
| static inline void bkey_on_stack_realloc(struct bkey_on_stack *s, |
| struct bch_fs *c, unsigned u64s) |
| { |
| if (s->k == (void *) s->onstack && |
| u64s > ARRAY_SIZE(s->onstack)) { |
| s->k = mempool_alloc(&c->large_bkey_pool, GFP_NOFS); |
| memcpy(s->k, s->onstack, sizeof(s->onstack)); |
| } |
| } |
| |
| static inline void bkey_on_stack_reassemble(struct bkey_on_stack *s, |
| struct bch_fs *c, |
| struct bkey_s_c k) |
| { |
| bkey_on_stack_realloc(s, c, k.k->u64s); |
| bkey_reassemble(s->k, k); |
| } |
| |
| static inline void bkey_on_stack_init(struct bkey_on_stack *s) |
| { |
| s->k = (void *) s->onstack; |
| } |
| |
| static inline void bkey_on_stack_exit(struct bkey_on_stack *s, |
| struct bch_fs *c) |
| { |
| if (s->k != (void *) s->onstack) |
| mempool_free(s->k, &c->large_bkey_pool); |
| s->k = NULL; |
| } |
| |
| #endif /* _BCACHEFS_BKEY_ON_STACK_H */ |