Browse Source

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 <elder@inktank.com>
Reviewed-by: Sage Weil <sage@inktank.com>
Alex Elder 13 years ago
parent
commit
ab8cb34a4b
1 changed files with 2 additions and 2 deletions
  1. 2 2
      net/ceph/osd_client.c

+ 2 - 2
net/ceph/osd_client.c

@@ -139,8 +139,6 @@ void ceph_osdc_release_request(struct kref *kref)
 
 
 	if (req->r_request)
 	if (req->r_request)
 		ceph_msg_put(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) {
 	if (req->r_con_filling_msg) {
 		dout("release_request revoking pages %p from con %p\n",
 		dout("release_request revoking pages %p from con %p\n",
 		     req->r_pages, req->r_con_filling_msg);
 		     req->r_pages, req->r_con_filling_msg);
@@ -148,6 +146,8 @@ void ceph_osdc_release_request(struct kref *kref)
 				      req->r_reply);
 				      req->r_reply);
 		ceph_con_put(req->r_con_filling_msg);
 		ceph_con_put(req->r_con_filling_msg);
 	}
 	}
+	if (req->r_reply)
+		ceph_msg_put(req->r_reply);
 	if (req->r_own_pages)
 	if (req->r_own_pages)
 		ceph_release_page_vector(req->r_pages,
 		ceph_release_page_vector(req->r_pages,
 					 req->r_num_pages);
 					 req->r_num_pages);