aboutsummaryrefslogtreecommitdiffstats
path: root/fs/ceph/buffer.c
diff options
context:
space:
mode:
authorSage Weil <sage@newdream.net>2009-12-05 13:13:33 -0500
committerSage Weil <sage@newdream.net>2009-12-07 15:10:04 -0500
commitdd26d857a7bf1b5b734a23180c19eac3e46db944 (patch)
tree24b7ef04c08959df09739056b097ccd157e0251f /fs/ceph/buffer.c
parent2f2ffd35822688a3650e503197b8724f47312748 (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.c14
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
19void 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
19int ceph_buffer_alloc(struct ceph_buffer *b, int len, gfp_t gfp) 31int 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);