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);