1c30dbb9cc7fc75ab1d0ee6fb084ba4684f7a665dSage Weil#ifndef __FS_CEPH_BUFFER_H
2c30dbb9cc7fc75ab1d0ee6fb084ba4684f7a665dSage Weil#define __FS_CEPH_BUFFER_H
3c30dbb9cc7fc75ab1d0ee6fb084ba4684f7a665dSage Weil
4dd26d857a7bf1b5b734a23180c19eac3e46db944Sage Weil#include <linux/kref.h>
5c30dbb9cc7fc75ab1d0ee6fb084ba4684f7a665dSage Weil#include <linux/mm.h>
6c30dbb9cc7fc75ab1d0ee6fb084ba4684f7a665dSage Weil#include <linux/vmalloc.h>
7c30dbb9cc7fc75ab1d0ee6fb084ba4684f7a665dSage Weil#include <linux/types.h>
8c30dbb9cc7fc75ab1d0ee6fb084ba4684f7a665dSage Weil#include <linux/uio.h>
9c30dbb9cc7fc75ab1d0ee6fb084ba4684f7a665dSage Weil
10c30dbb9cc7fc75ab1d0ee6fb084ba4684f7a665dSage Weil/*
11c30dbb9cc7fc75ab1d0ee6fb084ba4684f7a665dSage Weil * a simple reference counted buffer.
12c30dbb9cc7fc75ab1d0ee6fb084ba4684f7a665dSage Weil *
13c30dbb9cc7fc75ab1d0ee6fb084ba4684f7a665dSage Weil * use kmalloc for small sizes (<= one page), vmalloc for larger
14c30dbb9cc7fc75ab1d0ee6fb084ba4684f7a665dSage Weil * sizes.
15c30dbb9cc7fc75ab1d0ee6fb084ba4684f7a665dSage Weil */
16c30dbb9cc7fc75ab1d0ee6fb084ba4684f7a665dSage Weilstruct ceph_buffer {
17dd26d857a7bf1b5b734a23180c19eac3e46db944Sage Weil	struct kref kref;
18c30dbb9cc7fc75ab1d0ee6fb084ba4684f7a665dSage Weil	struct kvec vec;
19c30dbb9cc7fc75ab1d0ee6fb084ba4684f7a665dSage Weil	size_t alloc_len;
20c30dbb9cc7fc75ab1d0ee6fb084ba4684f7a665dSage Weil};
21c30dbb9cc7fc75ab1d0ee6fb084ba4684f7a665dSage Weil
22b6c1d5b81ea0841ae9d3ce2cda319ab986b081cfSage Weilextern struct ceph_buffer *ceph_buffer_new(size_t len, gfp_t gfp);
23b6c1d5b81ea0841ae9d3ce2cda319ab986b081cfSage Weilextern void ceph_buffer_release(struct kref *kref);
24c30dbb9cc7fc75ab1d0ee6fb084ba4684f7a665dSage Weil
25c30dbb9cc7fc75ab1d0ee6fb084ba4684f7a665dSage Weilstatic inline struct ceph_buffer *ceph_buffer_get(struct ceph_buffer *b)
26c30dbb9cc7fc75ab1d0ee6fb084ba4684f7a665dSage Weil{
27dd26d857a7bf1b5b734a23180c19eac3e46db944Sage Weil	kref_get(&b->kref);
28c30dbb9cc7fc75ab1d0ee6fb084ba4684f7a665dSage Weil	return b;
29c30dbb9cc7fc75ab1d0ee6fb084ba4684f7a665dSage Weil}
30c30dbb9cc7fc75ab1d0ee6fb084ba4684f7a665dSage Weil
31c30dbb9cc7fc75ab1d0ee6fb084ba4684f7a665dSage Weilstatic inline void ceph_buffer_put(struct ceph_buffer *b)
32c30dbb9cc7fc75ab1d0ee6fb084ba4684f7a665dSage Weil{
33b6c1d5b81ea0841ae9d3ce2cda319ab986b081cfSage Weil	kref_put(&b->kref, ceph_buffer_release);
34c30dbb9cc7fc75ab1d0ee6fb084ba4684f7a665dSage Weil}
35c30dbb9cc7fc75ab1d0ee6fb084ba4684f7a665dSage Weil
36c7e337d6490d6f2f5e66ddf1b04d00b0dbd10108Sage Weilextern int ceph_decode_buffer(struct ceph_buffer **b, void **p, void *end);
37c7e337d6490d6f2f5e66ddf1b04d00b0dbd10108Sage Weil
38c30dbb9cc7fc75ab1d0ee6fb084ba4684f7a665dSage Weil#endif
39