aboutsummaryrefslogtreecommitdiff
path: root/net
diff options
context:
space:
mode:
authorAlex Elder <elder@inktank.com>2013-03-25 11:54:30 -0500
committerSage Weil <sage@inktank.com>2013-05-01 21:17:22 -0700
commit888334f966fab232fe9158c2c2f0a935e356b583 (patch)
tree59566142b9a177590c0d38eaaeb6edb7dd01fa8f /net
parent7e2766a1135544a2972d2767f3a41afd5f55067f (diff)
libceph: initialize data fields on last msg put
When the last reference to a ceph message is dropped, ceph_msg_last_put() is called to clean things up. For "normal" messages (allocated via ceph_msg_new() rather than being allocated from a memory pool) it's sufficient to just release resources. But for a mempool-allocated message we actually have to re-initialize the data fields in the message back to initial state so they're ready to go in the event the message gets reused. Some of this was already done; this fleshes it out so it's done more completely. This resolves: http://tracker.ceph.com/issues/4540 Signed-off-by: Alex Elder <elder@inktank.com> Reviewed-by: Sage Weil <sage@inktank.com> Reviewed-by: Josh Durgin <josh.durgin@inktank.com>
Diffstat (limited to 'net')
-rw-r--r--net/ceph/messenger.c7
1 files changed, 6 insertions, 1 deletions
diff --git a/net/ceph/messenger.c b/net/ceph/messenger.c
index 2aecc4896a0..0a9f6362d4d 100644
--- a/net/ceph/messenger.c
+++ b/net/ceph/messenger.c
@@ -3331,12 +3331,17 @@ void ceph_msg_last_put(struct kref *kref)
if (ceph_msg_has_pages(m)) {
m->p.length = 0;
m->p.pages = NULL;
+ m->p.type = CEPH_OSD_DATA_TYPE_NONE;
}
-
if (ceph_msg_has_pagelist(m)) {
ceph_pagelist_release(m->l.pagelist);
kfree(m->l.pagelist);
m->l.pagelist = NULL;
+ m->l.type = CEPH_OSD_DATA_TYPE_NONE;
+ }
+ if (ceph_msg_has_bio(m)) {
+ m->b.bio = NULL;
+ m->b.type = CEPH_OSD_DATA_TYPE_NONE;
}
if (m->pool)