ceph: revoke osd request message on request completion
authorSage Weil <sage@newdream.net>
Thu, 8 Oct 2009 23:57:16 +0000 (16:57 -0700)
committerSage Weil <sage@newdream.net>
Fri, 9 Oct 2009 18:58:07 +0000 (11:58 -0700)
If an osd has failed or returned and a request has been sent twice, it's
possible to get a reply and unregister the request while the request
message is queued for delivery.  Since the message references the caller's
page vector, we need to revoke it before completing.

Signed-off-by: Sage Weil <sage@newdream.net>
fs/ceph/osd_client.c

index d14019dd686876085218edf2b0b7140a962666fd..0aea8afaa072ec3a0d778d8470649114c5a29541 100644 (file)
@@ -469,10 +469,15 @@ static void __unregister_request(struct ceph_osd_client *osdc,
        rb_erase(&req->r_node, &osdc->requests);
        osdc->num_requests--;
 
-       list_del_init(&req->r_osd_item);
-       if (list_empty(&req->r_osd->o_requests))
-               remove_osd(osdc, req->r_osd);
-       req->r_osd = NULL;
+       if (req->r_osd) {
+               /* make sure the original request isn't in flight. */
+               ceph_con_revoke(&req->r_osd->o_con, req->r_request);
+
+               list_del_init(&req->r_osd_item);
+               if (list_empty(&req->r_osd->o_requests))
+                       remove_osd(osdc, req->r_osd);
+               req->r_osd = NULL;
+       }
 
        ceph_osdc_put_request(req);