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 Sadehstatic 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 Sadehstatic 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