瀏覽代碼

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>
Sage Weil 15 年之前
父節點
當前提交
0ba6478df7
共有 1 個文件被更改,包括 9 次插入4 次删除
  1. 9 4
      fs/ceph/osd_client.c

+ 9 - 4
fs/ceph/osd_client.c

@@ -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);