diff options
Diffstat (limited to 'net/ceph/buffer.c')
-rw-r--r-- | net/ceph/buffer.c | 22 |
1 files changed, 6 insertions, 16 deletions
diff --git a/net/ceph/buffer.c b/net/ceph/buffer.c index bf3e6a13c215..621b5f65407f 100644 --- a/net/ceph/buffer.c +++ b/net/ceph/buffer.c | |||
@@ -6,6 +6,7 @@ | |||
6 | 6 | ||
7 | #include <linux/ceph/buffer.h> | 7 | #include <linux/ceph/buffer.h> |
8 | #include <linux/ceph/decode.h> | 8 | #include <linux/ceph/decode.h> |
9 | #include <linux/ceph/libceph.h> /* for ceph_kv{malloc,free} */ | ||
9 | 10 | ||
10 | struct ceph_buffer *ceph_buffer_new(size_t len, gfp_t gfp) | 11 | struct ceph_buffer *ceph_buffer_new(size_t len, gfp_t gfp) |
11 | { | 12 | { |
@@ -15,16 +16,10 @@ struct ceph_buffer *ceph_buffer_new(size_t len, gfp_t gfp) | |||
15 | if (!b) | 16 | if (!b) |
16 | return NULL; | 17 | return NULL; |
17 | 18 | ||
18 | b->vec.iov_base = kmalloc(len, gfp | __GFP_NOWARN); | 19 | b->vec.iov_base = ceph_kvmalloc(len, gfp); |
19 | if (b->vec.iov_base) { | 20 | if (!b->vec.iov_base) { |
20 | b->is_vmalloc = false; | 21 | kfree(b); |
21 | } else { | 22 | return NULL; |
22 | b->vec.iov_base = __vmalloc(len, gfp | __GFP_HIGHMEM, PAGE_KERNEL); | ||
23 | if (!b->vec.iov_base) { | ||
24 | kfree(b); | ||
25 | return NULL; | ||
26 | } | ||
27 | b->is_vmalloc = true; | ||
28 | } | 23 | } |
29 | 24 | ||
30 | kref_init(&b->kref); | 25 | kref_init(&b->kref); |
@@ -40,12 +35,7 @@ void ceph_buffer_release(struct kref *kref) | |||
40 | struct ceph_buffer *b = container_of(kref, struct ceph_buffer, kref); | 35 | struct ceph_buffer *b = container_of(kref, struct ceph_buffer, kref); |
41 | 36 | ||
42 | dout("buffer_release %p\n", b); | 37 | dout("buffer_release %p\n", b); |
43 | if (b->vec.iov_base) { | 38 | ceph_kvfree(b->vec.iov_base); |
44 | if (b->is_vmalloc) | ||
45 | vfree(b->vec.iov_base); | ||
46 | else | ||
47 | kfree(b->vec.iov_base); | ||
48 | } | ||
49 | kfree(b); | 39 | kfree(b); |
50 | } | 40 | } |
51 | EXPORT_SYMBOL(ceph_buffer_release); | 41 | EXPORT_SYMBOL(ceph_buffer_release); |