From: Alex Elder Date: Mon, 4 Jun 2012 19:43:32 +0000 (-0500) Subject: libceph: osd_client: don't drop reply reference too early X-Git-Url: http://drtracing.org/?a=commitdiff_plain;h=ab8cb34a4b2f60281a4b18b1f1ad23bc2313d91b;p=deliverable%2Flinux.git libceph: osd_client: don't drop reply reference too early In ceph_osdc_release_request(), a reference to the r_reply message is dropped. But just after that, that same message is revoked if it was in use to receive an incoming reply. Reorder these so we are sure we hold a reference until we're actually done with the message. Signed-off-by: Alex Elder Reviewed-by: Sage Weil --- diff --git a/net/ceph/osd_client.c b/net/ceph/osd_client.c index e30efbcc6388..d8b6d319499a 100644 --- a/net/ceph/osd_client.c +++ b/net/ceph/osd_client.c @@ -139,8 +139,6 @@ void ceph_osdc_release_request(struct kref *kref) if (req->r_request) ceph_msg_put(req->r_request); - if (req->r_reply) - ceph_msg_put(req->r_reply); if (req->r_con_filling_msg) { dout("release_request revoking pages %p from con %p\n", req->r_pages, req->r_con_filling_msg); @@ -148,6 +146,8 @@ void ceph_osdc_release_request(struct kref *kref) req->r_reply); ceph_con_put(req->r_con_filling_msg); } + if (req->r_reply) + ceph_msg_put(req->r_reply); if (req->r_own_pages) ceph_release_page_vector(req->r_pages, req->r_num_pages);