mirror of
https://github.com/followmsi/android_kernel_google_msm.git
synced 2024-11-06 23:17:41 +00:00
libceph: avoid unregistering osd request when not registered
(cherry picked from commit 35f9f8a09e
)
There is a race between two __unregister_request() callers: the
reply path and the ceph_osdc_wait_request(). If we get a reply
*and* the timeout expires at roughly the same time, both callers
will try to unregister the request, and the second one will do bad
things.
Simply check if the request is still already unregistered; if so,
return immediately and do nothing.
Fixes http://tracker.newdream.net/issues/2420
Signed-off-by: Sage Weil <sage@inktank.com>
Reviewed-by: Alex Elder <elder@inktank.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
1d3df0e266
commit
15ba38ebce
1 changed files with 6 additions and 0 deletions
|
@ -841,6 +841,12 @@ static void register_request(struct ceph_osd_client *osdc,
|
|||
static void __unregister_request(struct ceph_osd_client *osdc,
|
||||
struct ceph_osd_request *req)
|
||||
{
|
||||
if (RB_EMPTY_NODE(&req->r_node)) {
|
||||
dout("__unregister_request %p tid %lld not registered\n",
|
||||
req, req->r_tid);
|
||||
return;
|
||||
}
|
||||
|
||||
dout("__unregister_request %p tid %lld\n", req, req->r_tid);
|
||||
rb_erase(&req->r_node, &osdc->requests);
|
||||
osdc->num_requests--;
|
||||
|
|
Loading…
Reference in a new issue