aboutsummaryrefslogtreecommitdiffstats
path: root/net/ceph/osd_client.c
diff options
context:
space:
mode:
authorIlya Dryomov <ilya.dryomov@inktank.com>2014-06-19 03:38:13 -0400
committerIlya Dryomov <ilya.dryomov@inktank.com>2014-07-08 07:08:44 -0400
commitc9f9b93ddfd76498fe36d9f550bd26533a4ee6bf (patch)
treebc0fb9ea84b6705f82c4858e24ff5bc93b8c2000 /net/ceph/osd_client.c
parent4f23409e0c787be1a501527c79578833567a1e58 (diff)
libceph: introduce ceph_osdc_cancel_request()
Introduce ceph_osdc_cancel_request() intended for canceling requests from the higher layers (rbd and cephfs). Because higher layers are in charge and are supposed to know what and when they are canceling, the request is not completed, only unref'ed and removed from the libceph data structures. __cancel_request() is no longer called before __unregister_request(), because __unregister_request() unconditionally revokes r_request and there is no point in trying to do it twice. Signed-off-by: Ilya Dryomov <ilya.dryomov@inktank.com> Reviewed-by: Alex Elder <elder@linaro.org>
Diffstat (limited to 'net/ceph/osd_client.c')
-rw-r--r--net/ceph/osd_client.c31
1 files changed, 25 insertions, 6 deletions
diff --git a/net/ceph/osd_client.c b/net/ceph/osd_client.c
index 89d7d8861d80..6c1ccf5590a3 100644
--- a/net/ceph/osd_client.c
+++ b/net/ceph/osd_client.c
@@ -2468,6 +2468,25 @@ int ceph_osdc_start_request(struct ceph_osd_client *osdc,
2468EXPORT_SYMBOL(ceph_osdc_start_request); 2468EXPORT_SYMBOL(ceph_osdc_start_request);
2469 2469
2470/* 2470/*
2471 * Unregister a registered request. The request is not completed (i.e.
2472 * no callbacks or wakeups) - higher layers are supposed to know what
2473 * they are canceling.
2474 */
2475void ceph_osdc_cancel_request(struct ceph_osd_request *req)
2476{
2477 struct ceph_osd_client *osdc = req->r_osdc;
2478
2479 mutex_lock(&osdc->request_mutex);
2480 if (req->r_linger)
2481 __unregister_linger_request(osdc, req);
2482 __unregister_request(osdc, req);
2483 mutex_unlock(&osdc->request_mutex);
2484
2485 dout("%s %p tid %llu canceled\n", __func__, req, req->r_tid);
2486}
2487EXPORT_SYMBOL(ceph_osdc_cancel_request);
2488
2489/*
2471 * wait for a request to complete 2490 * wait for a request to complete
2472 */ 2491 */
2473int ceph_osdc_wait_request(struct ceph_osd_client *osdc, 2492int ceph_osdc_wait_request(struct ceph_osd_client *osdc,
@@ -2475,18 +2494,18 @@ int ceph_osdc_wait_request(struct ceph_osd_client *osdc,
2475{ 2494{
2476 int rc; 2495 int rc;
2477 2496
2497 dout("%s %p tid %llu\n", __func__, req, req->r_tid);
2498
2478 rc = wait_for_completion_interruptible(&req->r_completion); 2499 rc = wait_for_completion_interruptible(&req->r_completion);
2479 if (rc < 0) { 2500 if (rc < 0) {
2480 mutex_lock(&osdc->request_mutex); 2501 dout("%s %p tid %llu interrupted\n", __func__, req, req->r_tid);
2481 __cancel_request(req); 2502 ceph_osdc_cancel_request(req);
2482 __unregister_request(osdc, req);
2483 mutex_unlock(&osdc->request_mutex);
2484 complete_request(req); 2503 complete_request(req);
2485 dout("wait_request tid %llu canceled/timed out\n", req->r_tid);
2486 return rc; 2504 return rc;
2487 } 2505 }
2488 2506
2489 dout("wait_request tid %llu result %d\n", req->r_tid, req->r_result); 2507 dout("%s %p tid %llu result %d\n", __func__, req, req->r_tid,
2508 req->r_result);
2490 return req->r_result; 2509 return req->r_result;
2491} 2510}
2492EXPORT_SYMBOL(ceph_osdc_wait_request); 2511EXPORT_SYMBOL(ceph_osdc_wait_request);