Commit 0ba6478d authored by Sage Weil's avatar Sage Weil

ceph: revoke osd request message on request completion

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: default avatarSage Weil <sage@newdream.net>
parent c1ea8823
...@@ -469,10 +469,15 @@ static void __unregister_request(struct ceph_osd_client *osdc, ...@@ -469,10 +469,15 @@ static void __unregister_request(struct ceph_osd_client *osdc,
rb_erase(&req->r_node, &osdc->requests); rb_erase(&req->r_node, &osdc->requests);
osdc->num_requests--; osdc->num_requests--;
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); list_del_init(&req->r_osd_item);
if (list_empty(&req->r_osd->o_requests)) if (list_empty(&req->r_osd->o_requests))
remove_osd(osdc, req->r_osd); remove_osd(osdc, req->r_osd);
req->r_osd = NULL; req->r_osd = NULL;
}
ceph_osdc_put_request(req); ceph_osdc_put_request(req);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment