diff options
author | Sage Weil <sage@newdream.net> | 2009-12-05 19:13:33 +0100 |
---|---|---|
committer | Sage Weil <sage@newdream.net> | 2009-12-07 21:10:04 +0100 |
commit | dd26d857a7bf1b5b734a23180c19eac3e46db944 (patch) | |
tree | 24b7ef04c08959df09739056b097ccd157e0251f /fs/ceph/buffer.c | |
parent | ceph: mark v0.18 release (diff) | |
download | linux-dd26d857a7bf1b5b734a23180c19eac3e46db944.tar.xz linux-dd26d857a7bf1b5b734a23180c19eac3e46db944.zip |
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) b = kmalloc(sizeof(*b), gfp); if (!b) return NULL; - atomic_set(&b->nref, 1); + kref_init(&b->kref); b->vec.iov_base = NULL; b->vec.iov_len = 0; b->alloc_len = 0; return b; } +void ceph_buffer_release(struct kref *kref) +{ + struct ceph_buffer *b = container_of(kref, struct ceph_buffer, kref); + if (b->vec.iov_base) { + if (b->is_vmalloc) + vfree(b->vec.iov_base); + else + kfree(b->vec.iov_base); + } + kfree(b); +} + int ceph_buffer_alloc(struct ceph_buffer *b, int len, gfp_t gfp) { b->vec.iov_base = kmalloc(len, gfp | __GFP_NOWARN); |