Commit 42b06965 authored by Ilya Dryomov's avatar Ilya Dryomov

libceph: wait_request_timeout()

The unwatch timeout is currently implemented in rbd.  With
watch/unwatch code moving into libceph, we are going to need
a ceph_osdc_wait_request() variant with a timeout.
Signed-off-by: default avatarIlya Dryomov <idryomov@gmail.com>
parent 3540bfdb
...@@ -2668,28 +2668,36 @@ void ceph_osdc_cancel_request(struct ceph_osd_request *req) ...@@ -2668,28 +2668,36 @@ void ceph_osdc_cancel_request(struct ceph_osd_request *req)
EXPORT_SYMBOL(ceph_osdc_cancel_request); EXPORT_SYMBOL(ceph_osdc_cancel_request);
/* /*
* wait for a request to complete * @timeout: in jiffies, 0 means "wait forever"
*/ */
int ceph_osdc_wait_request(struct ceph_osd_client *osdc, static int wait_request_timeout(struct ceph_osd_request *req,
struct ceph_osd_request *req) unsigned long timeout)
{ {
int rc; long left;
dout("%s %p tid %llu\n", __func__, req, req->r_tid);
rc = wait_for_completion_interruptible(&req->r_completion); dout("%s req %p tid %llu\n", __func__, req, req->r_tid);
if (rc < 0) { left = wait_for_completion_interruptible_timeout(&req->r_completion,
dout("%s %p tid %llu interrupted\n", __func__, req, req->r_tid); ceph_timeout_jiffies(timeout));
if (left <= 0) {
left = left ?: -ETIMEDOUT;
ceph_osdc_cancel_request(req); ceph_osdc_cancel_request(req);
/* kludge - need to to wake ceph_osdc_sync() */ /* kludge - need to to wake ceph_osdc_sync() */
complete_all(&req->r_safe_completion); complete_all(&req->r_safe_completion);
return rc; } else {
left = req->r_result; /* completed */
} }
dout("%s %p tid %llu result %d\n", __func__, req, req->r_tid, return left;
req->r_result); }
return req->r_result;
/*
* wait for a request to complete
*/
int ceph_osdc_wait_request(struct ceph_osd_client *osdc,
struct ceph_osd_request *req)
{
return wait_request_timeout(req, 0);
} }
EXPORT_SYMBOL(ceph_osdc_wait_request); EXPORT_SYMBOL(ceph_osdc_wait_request);
......
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