ceph: fix sync vs canceled write
If we cancel a write, trigger the safe completions to prevent a sync from blocking indefinitely in ceph_osdc_sync(). Signed-off-by: Sage Weil <sage@newdream.net>
This commit is contained in:
@@ -1144,6 +1144,13 @@ static void handle_osds_timeout(struct work_struct *work)
|
|||||||
round_jiffies_relative(delay));
|
round_jiffies_relative(delay));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void complete_request(struct ceph_osd_request *req)
|
||||||
|
{
|
||||||
|
if (req->r_safe_callback)
|
||||||
|
req->r_safe_callback(req, NULL);
|
||||||
|
complete_all(&req->r_safe_completion); /* fsync waiter */
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* handle osd op reply. either call the callback if it is specified,
|
* handle osd op reply. either call the callback if it is specified,
|
||||||
* or do the completion to wake up the waiting thread.
|
* or do the completion to wake up the waiting thread.
|
||||||
@@ -1226,11 +1233,8 @@ static void handle_reply(struct ceph_osd_client *osdc, struct ceph_msg *msg,
|
|||||||
else
|
else
|
||||||
complete_all(&req->r_completion);
|
complete_all(&req->r_completion);
|
||||||
|
|
||||||
if (flags & CEPH_OSD_FLAG_ONDISK) {
|
if (flags & CEPH_OSD_FLAG_ONDISK)
|
||||||
if (req->r_safe_callback)
|
complete_request(req);
|
||||||
req->r_safe_callback(req, msg);
|
|
||||||
complete_all(&req->r_safe_completion); /* fsync waiter */
|
|
||||||
}
|
|
||||||
|
|
||||||
done:
|
done:
|
||||||
dout("req=%p req->r_linger=%d\n", req, req->r_linger);
|
dout("req=%p req->r_linger=%d\n", req, req->r_linger);
|
||||||
@@ -1732,6 +1736,7 @@ int ceph_osdc_wait_request(struct ceph_osd_client *osdc,
|
|||||||
__cancel_request(req);
|
__cancel_request(req);
|
||||||
__unregister_request(osdc, req);
|
__unregister_request(osdc, req);
|
||||||
mutex_unlock(&osdc->request_mutex);
|
mutex_unlock(&osdc->request_mutex);
|
||||||
|
complete_request(req);
|
||||||
dout("wait_request tid %llu canceled/timed out\n", req->r_tid);
|
dout("wait_request tid %llu canceled/timed out\n", req->r_tid);
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user