]>
Commit | Line | Data |
---|---|---|
c30dbb9c SW |
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 |