]> git.karo-electronics.de Git - mv-sheeva.git/blob - fs/ceph/buffer.c
ceph: ref counted buffer
[mv-sheeva.git] / fs / ceph / buffer.c
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