Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
torvalds
GitHub Repository: torvalds/linux
Path: blob/master/fs/bcachefs/bkey_buf.h
26278 views
1
/* SPDX-License-Identifier: GPL-2.0 */
2
#ifndef _BCACHEFS_BKEY_BUF_H
3
#define _BCACHEFS_BKEY_BUF_H
4
5
#include "bcachefs.h"
6
#include "bkey.h"
7
8
struct bkey_buf {
9
struct bkey_i *k;
10
u64 onstack[12];
11
};
12
13
static inline void bch2_bkey_buf_realloc(struct bkey_buf *s,
14
struct bch_fs *c, unsigned u64s)
15
{
16
if (s->k == (void *) s->onstack &&
17
u64s > ARRAY_SIZE(s->onstack)) {
18
s->k = mempool_alloc(&c->large_bkey_pool, GFP_NOFS);
19
memcpy(s->k, s->onstack, sizeof(s->onstack));
20
}
21
}
22
23
static inline void bch2_bkey_buf_reassemble(struct bkey_buf *s,
24
struct bch_fs *c,
25
struct bkey_s_c k)
26
{
27
bch2_bkey_buf_realloc(s, c, k.k->u64s);
28
bkey_reassemble(s->k, k);
29
}
30
31
static inline void bch2_bkey_buf_copy(struct bkey_buf *s,
32
struct bch_fs *c,
33
struct bkey_i *src)
34
{
35
bch2_bkey_buf_realloc(s, c, src->k.u64s);
36
bkey_copy(s->k, src);
37
}
38
39
static inline void bch2_bkey_buf_unpack(struct bkey_buf *s,
40
struct bch_fs *c,
41
struct btree *b,
42
struct bkey_packed *src)
43
{
44
bch2_bkey_buf_realloc(s, c, BKEY_U64s +
45
bkeyp_val_u64s(&b->format, src));
46
bch2_bkey_unpack(b, s->k, src);
47
}
48
49
static inline void bch2_bkey_buf_init(struct bkey_buf *s)
50
{
51
s->k = (void *) s->onstack;
52
}
53
54
static inline void bch2_bkey_buf_exit(struct bkey_buf *s, struct bch_fs *c)
55
{
56
if (s->k != (void *) s->onstack)
57
mempool_free(s->k, &c->large_bkey_pool);
58
s->k = NULL;
59
}
60
61
#endif /* _BCACHEFS_BKEY_BUF_H */
62
63