From: Alex Elder Date: Mon, 25 Mar 2013 16:54:30 +0000 (-0500) Subject: libceph: initialize data fields on last msg put X-Git-Url: https://git.karo-electronics.de/?a=commitdiff_plain;h=888334f966fab232fe9158c2c2f0a935e356b583;p=linux-beck.git 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 Reviewed-by: Sage Weil Reviewed-by: Josh Durgin --- diff --git a/net/ceph/messenger.c b/net/ceph/messenger.c index 2aecc4896a03..0a9f6362d4d8 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)