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: Sage Weil <sage@newdream.net>
This commit is contained in:
parent
c1ea8823be
commit
0ba6478df7
|
@ -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);
|
||||
|
||||
|
|
Loading…
Reference in New Issue