summaryrefslogtreecommitdiff
path: root/fs/ceph/messenger.c
diff options
context:
space:
mode:
authorSage Weil <sage@newdream.net>2009-12-07 15:55:05 -0800
committerSage Weil <sage@newdream.net>2009-12-07 15:55:05 -0800
commitc2e552e76e2c6907ca50cd9a4b747a2e2e8c615e (patch)
tree4251e189caeb4de3f4a8763ae70600fc9d3acb51 /fs/ceph/messenger.c
parent415e49a9c4faf1a1480b1497da2037608e5aa2c5 (diff)
downloadlwn-c2e552e76e2c6907ca50cd9a4b747a2e2e8c615e.tar.gz
lwn-c2e552e76e2c6907ca50cd9a4b747a2e2e8c615e.zip
ceph: use kref for ceph_msg
Signed-off-by: Sage Weil <sage@newdream.net>
Diffstat (limited to 'fs/ceph/messenger.c')
-rw-r--r--fs/ceph/messenger.c47
1 files changed, 18 insertions, 29 deletions
diff --git a/fs/ceph/messenger.c b/fs/ceph/messenger.c
index bf762107b3d5..b0571b01b19f 100644
--- a/fs/ceph/messenger.c
+++ b/fs/ceph/messenger.c
@@ -1958,7 +1958,7 @@ struct ceph_msg *ceph_msg_new(int type, int front_len,
m = kmalloc(sizeof(*m), GFP_NOFS);
if (m == NULL)
goto out;
- atomic_set(&m->nref, 1);
+ kref_init(&m->kref);
INIT_LIST_HEAD(&m->list_head);
m->hdr.type = cpu_to_le16(type);
@@ -2070,34 +2070,23 @@ void ceph_msg_kfree(struct ceph_msg *m)
/*
* Drop a msg ref. Destroy as needed.
*/
-void ceph_msg_put(struct ceph_msg *m)
-{
- dout("ceph_msg_put %p %d -> %d\n", m, atomic_read(&m->nref),
- atomic_read(&m->nref)-1);
- if (atomic_read(&m->nref) <= 0) {
- pr_err("bad ceph_msg_put on %p %llu %d=%s %d+%d\n",
- m, le64_to_cpu(m->hdr.seq),
- le16_to_cpu(m->hdr.type),
- ceph_msg_type_name(le16_to_cpu(m->hdr.type)),
- le32_to_cpu(m->hdr.front_len),
- le32_to_cpu(m->hdr.data_len));
- WARN_ON(1);
- }
- if (atomic_dec_and_test(&m->nref)) {
- dout("ceph_msg_put last one on %p\n", m);
- WARN_ON(!list_empty(&m->list_head));
-
- /* drop middle, data, if any */
- if (m->middle) {
- ceph_buffer_put(m->middle);
- m->middle = NULL;
- }
- m->nr_pages = 0;
- m->pages = NULL;
+void ceph_msg_last_put(struct kref *kref)
+{
+ struct ceph_msg *m = container_of(kref, struct ceph_msg, kref);
- if (m->pool)
- ceph_msgpool_put(m->pool, m);
- else
- ceph_msg_kfree(m);
+ dout("ceph_msg_put last one on %p\n", m);
+ WARN_ON(!list_empty(&m->list_head));
+
+ /* drop middle, data, if any */
+ if (m->middle) {
+ ceph_buffer_put(m->middle);
+ m->middle = NULL;
}
+ m->nr_pages = 0;
+ m->pages = NULL;
+
+ if (m->pool)
+ ceph_msgpool_put(m->pool, m);
+ else
+ ceph_msg_kfree(m);
}