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>
9 #include <linux/ceph/libceph.h> /* for ceph_kv{malloc,free} */
11 struct ceph_buffer
*ceph_buffer_new(size_t len
, gfp_t gfp
)
13 struct ceph_buffer
*b
;
15 b
= kmalloc(sizeof(*b
), gfp
);
19 b
->vec
.iov_base
= ceph_kvmalloc(len
, gfp
);
20 if (!b
->vec
.iov_base
) {
28 dout("buffer_new %p\n", b
);
31 EXPORT_SYMBOL(ceph_buffer_new
);
33 void ceph_buffer_release(struct kref
*kref
)
35 struct ceph_buffer
*b
= container_of(kref
, struct ceph_buffer
, kref
);
37 dout("buffer_release %p\n", b
);
38 ceph_kvfree(b
->vec
.iov_base
);
41 EXPORT_SYMBOL(ceph_buffer_release
);
43 int ceph_decode_buffer(struct ceph_buffer
**b
, void **p
, void *end
)
47 ceph_decode_need(p
, end
, sizeof(u32
), bad
);
48 len
= ceph_decode_32(p
);
49 dout("decode_buffer len %d\n", (int)len
);
50 ceph_decode_need(p
, end
, len
, bad
);
51 *b
= ceph_buffer_new(len
, GFP_NOFS
);
54 ceph_decode_copy(p
, (*b
)->vec
.iov_base
, len
);