diff options
author | Sage Weil <sage@newdream.net> | 2009-12-05 13:13:33 -0500 |
---|---|---|
committer | Sage Weil <sage@newdream.net> | 2009-12-07 15:10:04 -0500 |
commit | dd26d857a7bf1b5b734a23180c19eac3e46db944 (patch) | |
tree | 24b7ef04c08959df09739056b097ccd157e0251f /fs/ceph/buffer.c | |
parent | 2f2ffd35822688a3650e503197b8724f47312748 (diff) |
ceph: use kref for ceph_buffer
Signed-off-by: Sage Weil <sage@newdream.net>
Diffstat (limited to 'fs/ceph/buffer.c')
-rw-r--r-- | fs/ceph/buffer.c | 14 |
1 files changed, 13 insertions, 1 deletions
diff --git a/fs/ceph/buffer.c b/fs/ceph/buffer.c index cf9aaccef22b..847c5da9a0db 100644 --- a/fs/ceph/buffer.c +++ b/fs/ceph/buffer.c | |||
@@ -9,13 +9,25 @@ struct ceph_buffer *ceph_buffer_new(gfp_t gfp) | |||
9 | b = kmalloc(sizeof(*b), gfp); | 9 | b = kmalloc(sizeof(*b), gfp); |
10 | if (!b) | 10 | if (!b) |
11 | return NULL; | 11 | return NULL; |
12 | atomic_set(&b->nref, 1); | 12 | kref_init(&b->kref); |
13 | b->vec.iov_base = NULL; | 13 | b->vec.iov_base = NULL; |
14 | b->vec.iov_len = 0; | 14 | b->vec.iov_len = 0; |
15 | b->alloc_len = 0; | 15 | b->alloc_len = 0; |
16 | return b; | 16 | return b; |
17 | } | 17 | } |
18 | 18 | ||
19 | void ceph_buffer_release(struct kref *kref) | ||
20 | { | ||
21 | struct ceph_buffer *b = container_of(kref, struct ceph_buffer, kref); | ||
22 | if (b->vec.iov_base) { | ||
23 | if (b->is_vmalloc) | ||
24 | vfree(b->vec.iov_base); | ||
25 | else | ||
26 | kfree(b->vec.iov_base); | ||
27 | } | ||
28 | kfree(b); | ||
29 | } | ||
30 | |||
19 | int ceph_buffer_alloc(struct ceph_buffer *b, int len, gfp_t gfp) | 31 | int ceph_buffer_alloc(struct ceph_buffer *b, int len, gfp_t gfp) |
20 | { | 32 | { |
21 | b->vec.iov_base = kmalloc(len, gfp | __GFP_NOWARN); | 33 | b->vec.iov_base = kmalloc(len, gfp | __GFP_NOWARN); |