libceph: no more kick_requests() race
Since we no longer drop the request mutex between registering and mapping an osd request in ceph_osdc_start_request(), there is no chance of a race with kick_requests(). We can now therefore map and send the new request unconditionally (but we'll issue a warning should it ever occur). Signed-off-by: Alex Elder <elder@inktank.com> Reviewed-off-by: Sage Weil <sage@inktank.com>
This commit is contained in:
parent
dc4b870c97
commit
92451b4910
1 changed files with 15 additions and 22 deletions
|
@ -1779,31 +1779,24 @@ int ceph_osdc_start_request(struct ceph_osd_client *osdc,
|
|||
|
||||
down_read(&osdc->map_sem);
|
||||
mutex_lock(&osdc->request_mutex);
|
||||
/*
|
||||
* a racing kick_requests() may have sent the message for us
|
||||
* while we dropped request_mutex above, so only send now if
|
||||
* the request still han't been touched yet.
|
||||
*/
|
||||
__register_request(osdc, req);
|
||||
if (req->r_sent == 0) {
|
||||
rc = __map_request(osdc, req, 0);
|
||||
if (rc < 0) {
|
||||
if (nofail) {
|
||||
dout("osdc_start_request failed map, "
|
||||
" will retry %lld\n", req->r_tid);
|
||||
rc = 0;
|
||||
}
|
||||
goto out_unlock;
|
||||
WARN_ON(req->r_sent);
|
||||
rc = __map_request(osdc, req, 0);
|
||||
if (rc < 0) {
|
||||
if (nofail) {
|
||||
dout("osdc_start_request failed map, "
|
||||
" will retry %lld\n", req->r_tid);
|
||||
rc = 0;
|
||||
}
|
||||
if (req->r_osd == NULL) {
|
||||
dout("send_request %p no up osds in pg\n", req);
|
||||
ceph_monc_request_next_osdmap(&osdc->client->monc);
|
||||
} else {
|
||||
__send_request(osdc, req);
|
||||
}
|
||||
rc = 0;
|
||||
goto out_unlock;
|
||||
}
|
||||
|
||||
if (req->r_osd == NULL) {
|
||||
dout("send_request %p no up osds in pg\n", req);
|
||||
ceph_monc_request_next_osdmap(&osdc->client->monc);
|
||||
} else {
|
||||
__send_request(osdc, req);
|
||||
}
|
||||
rc = 0;
|
||||
out_unlock:
|
||||
mutex_unlock(&osdc->request_mutex);
|
||||
up_read(&osdc->map_sem);
|
||||
|
|
Loading…
Reference in a new issue