2 #include <linux/ceph/ceph_debug.h>
4 #include <linux/module.h>
5 #include <linux/slab.h>
7 #include <linux/ceph/buffer.h>
8 #include <linux/ceph/decode.h>
10 struct ceph_buffer
*ceph_buffer_new(size_t len
, gfp_t gfp
)
12 struct ceph_buffer
*b
;
14 b
= kmalloc(sizeof(*b
), gfp
);
18 b
->vec
.iov_base
= kmalloc(len
, gfp
| __GFP_NOWARN
);
19 if (b
->vec
.iov_base
) {
20 b
->is_vmalloc
= false;
22 b
->vec
.iov_base
= __vmalloc(len
, gfp
| __GFP_HIGHMEM
, PAGE_KERNEL
);
23 if (!b
->vec
.iov_base
) {
33 dout("buffer_new %p\n", b
);
36 EXPORT_SYMBOL(ceph_buffer_new
);
38 void ceph_buffer_release(struct kref
*kref
)
40 struct ceph_buffer
*b
= container_of(kref
, struct ceph_buffer
, kref
);
42 dout("buffer_release %p\n", b
);
43 if (b
->vec
.iov_base
) {
45 vfree(b
->vec
.iov_base
);
47 kfree(b
->vec
.iov_base
);
51 EXPORT_SYMBOL(ceph_buffer_release
);
53 int ceph_decode_buffer(struct ceph_buffer
**b
, void **p
, void *end
)
57 ceph_decode_need(p
, end
, sizeof(u32
), bad
);
58 len
= ceph_decode_32(p
);
59 dout("decode_buffer len %d\n", (int)len
);
60 ceph_decode_need(p
, end
, len
, bad
);
61 *b
= ceph_buffer_new(len
, GFP_NOFS
);
64 ceph_decode_copy(p
, (*b
)->vec
.iov_base
, len
);