ceph: use kref for ceph_buffer
Signed-off-by: Sage Weil <sage@newdream.net>
diff --git a/fs/ceph/buffer.c b/fs/ceph/buffer.c
index cf9aacc..847c5da 100644
--- a/fs/ceph/buffer.c
+++ b/fs/ceph/buffer.c
@@ -9,13 +9,25 @@
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);