xref: /linux-6.15/include/linux/ceph/buffer.h (revision 5c498950)
1b2441318SGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0 */
23d14c5d2SYehuda Sadeh #ifndef __FS_CEPH_BUFFER_H
33d14c5d2SYehuda Sadeh #define __FS_CEPH_BUFFER_H
43d14c5d2SYehuda Sadeh 
53d14c5d2SYehuda Sadeh #include <linux/kref.h>
63d14c5d2SYehuda Sadeh #include <linux/mm.h>
73d14c5d2SYehuda Sadeh #include <linux/vmalloc.h>
83d14c5d2SYehuda Sadeh #include <linux/types.h>
93d14c5d2SYehuda Sadeh #include <linux/uio.h>
103d14c5d2SYehuda Sadeh 
113d14c5d2SYehuda Sadeh /*
123d14c5d2SYehuda Sadeh  * a simple reference counted buffer.
133d14c5d2SYehuda Sadeh  *
144965fc38SIlya Dryomov  * use kmalloc for smaller sizes, vmalloc for larger sizes.
153d14c5d2SYehuda Sadeh  */
163d14c5d2SYehuda Sadeh struct ceph_buffer {
173d14c5d2SYehuda Sadeh 	struct kref kref;
183d14c5d2SYehuda Sadeh 	struct kvec vec;
193d14c5d2SYehuda Sadeh 	size_t alloc_len;
203d14c5d2SYehuda Sadeh };
213d14c5d2SYehuda Sadeh 
223d14c5d2SYehuda Sadeh extern struct ceph_buffer *ceph_buffer_new(size_t len, gfp_t gfp);
233d14c5d2SYehuda Sadeh extern void ceph_buffer_release(struct kref *kref);
243d14c5d2SYehuda Sadeh 
ceph_buffer_get(struct ceph_buffer * b)253d14c5d2SYehuda Sadeh static inline struct ceph_buffer *ceph_buffer_get(struct ceph_buffer *b)
263d14c5d2SYehuda Sadeh {
273d14c5d2SYehuda Sadeh 	kref_get(&b->kref);
283d14c5d2SYehuda Sadeh 	return b;
293d14c5d2SYehuda Sadeh }
303d14c5d2SYehuda Sadeh 
ceph_buffer_put(struct ceph_buffer * b)313d14c5d2SYehuda Sadeh static inline void ceph_buffer_put(struct ceph_buffer *b)
323d14c5d2SYehuda Sadeh {
33*5c498950SLuis Henriques 	if (b)
343d14c5d2SYehuda Sadeh 		kref_put(&b->kref, ceph_buffer_release);
353d14c5d2SYehuda Sadeh }
363d14c5d2SYehuda Sadeh 
373d14c5d2SYehuda Sadeh extern int ceph_decode_buffer(struct ceph_buffer **b, void **p, void *end);
383d14c5d2SYehuda Sadeh 
393d14c5d2SYehuda Sadeh #endif
40