diff options
Diffstat (limited to 'fs/ceph/buffer.c')
-rw-r--r-- | fs/ceph/buffer.c | 34 |
1 files changed, 34 insertions, 0 deletions
diff --git a/fs/ceph/buffer.c b/fs/ceph/buffer.c new file mode 100644 index 000000000000..cf9aaccef22b --- /dev/null +++ b/fs/ceph/buffer.c | |||
@@ -0,0 +1,34 @@ | |||
1 | |||
2 | #include "ceph_debug.h" | ||
3 | #include "buffer.h" | ||
4 | |||
5 | struct ceph_buffer *ceph_buffer_new(gfp_t gfp) | ||
6 | { | ||
7 | struct ceph_buffer *b; | ||
8 | |||
9 | b = kmalloc(sizeof(*b), gfp); | ||
10 | if (!b) | ||
11 | return NULL; | ||
12 | atomic_set(&b->nref, 1); | ||
13 | b->vec.iov_base = NULL; | ||
14 | b->vec.iov_len = 0; | ||
15 | b->alloc_len = 0; | ||
16 | return b; | ||
17 | } | ||
18 | |||
19 | int ceph_buffer_alloc(struct ceph_buffer *b, int len, gfp_t gfp) | ||
20 | { | ||
21 | b->vec.iov_base = kmalloc(len, gfp | __GFP_NOWARN); | ||
22 | if (b->vec.iov_base) { | ||
23 | b->is_vmalloc = false; | ||
24 | } else { | ||
25 | b->vec.iov_base = __vmalloc(len, gfp, PAGE_KERNEL); | ||
26 | b->is_vmalloc = true; | ||
27 | } | ||
28 | if (!b->vec.iov_base) | ||
29 | return -ENOMEM; | ||
30 | b->alloc_len = len; | ||
31 | b->vec.iov_len = len; | ||
32 | return 0; | ||
33 | } | ||
34 | |||