1 // SPDX-License-Identifier: GPL-2.0
3 #include <linux/ceph/ceph_debug.h>
5 #include <linux/module.h>
6 #include <linux/slab.h>
8 #include <linux/ceph/buffer.h>
9 #include <linux/ceph/decode.h>
10 #include <linux/ceph/libceph.h> /* for ceph_kvmalloc */
12 struct ceph_buffer
*ceph_buffer_new(size_t len
, gfp_t gfp
)
14 struct ceph_buffer
*b
;
16 b
= kmalloc(sizeof(*b
), gfp
);
20 b
->vec
.iov_base
= ceph_kvmalloc(len
, gfp
);
21 if (!b
->vec
.iov_base
) {
29 dout("buffer_new %p\n", b
);
32 EXPORT_SYMBOL(ceph_buffer_new
);
34 void ceph_buffer_release(struct kref
*kref
)
36 struct ceph_buffer
*b
= container_of(kref
, struct ceph_buffer
, kref
);
38 dout("buffer_release %p\n", b
);
39 kvfree(b
->vec
.iov_base
);
42 EXPORT_SYMBOL(ceph_buffer_release
);
44 int ceph_decode_buffer(struct ceph_buffer
**b
, void **p
, void *end
)
48 ceph_decode_need(p
, end
, sizeof(u32
), bad
);
49 len
= ceph_decode_32(p
);
50 dout("decode_buffer len %d\n", (int)len
);
51 ceph_decode_need(p
, end
, len
, bad
);
52 *b
= ceph_buffer_new(len
, GFP_NOFS
);
55 ceph_decode_copy(p
, (*b
)->vec
.iov_base
, len
);