Message ID | 515ADE88.8080501@inktank.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Reviewed-by: Sage Weil <sage@inktank.com> On Tue, 2 Apr 2013, Alex Elder wrote: > The osd client mutex is acquired just before getting a reference to > a request in handle_reply(). However the error paths after that > don't drop the mutex before returning as they should. > > Drop the mutex after dropping the request reference. Also add a > bad_mutex label at that point and use it so the failed request > lookup case can be handled with the rest. > > This resolves: > http://tracker.ceph.com/issues/4615 > > Signed-off-by: Alex Elder <elder@inktank.com> > --- > net/ceph/osd_client.c | 5 +++-- > 1 file changed, 3 insertions(+), 2 deletions(-) > > diff --git a/net/ceph/osd_client.c b/net/ceph/osd_client.c > index 9b69f47..abbcde3 100644 > --- a/net/ceph/osd_client.c > +++ b/net/ceph/osd_client.c > @@ -1332,8 +1332,7 @@ static void handle_reply(struct ceph_osd_client > *osdc, struct ceph_msg *msg, > req = __lookup_request(osdc, tid); > if (req == NULL) { > dout("handle_reply tid %llu dne\n", tid); > - mutex_unlock(&osdc->request_mutex); > - return; > + goto bad_mutex; > } > ceph_osdc_get_request(req); > > @@ -1422,6 +1421,8 @@ done: > > bad_put: > ceph_osdc_put_request(req); > +bad_mutex: > + mutex_unlock(&osdc->request_mutex); > bad: > pr_err("corrupt osd_op_reply got %d %d\n", > (int)msg->front.iov_len, le32_to_cpu(msg->hdr.front_len)); > -- > 1.7.9.5 > > -- > To unsubscribe from this list: send the line "unsubscribe ceph-devel" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html > > -- To unsubscribe from this list: send the line "unsubscribe ceph-devel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
diff --git a/net/ceph/osd_client.c b/net/ceph/osd_client.c index 9b69f47..abbcde3 100644 --- a/net/ceph/osd_client.c +++ b/net/ceph/osd_client.c @@ -1332,8 +1332,7 @@ static void handle_reply(struct ceph_osd_client *osdc, struct ceph_msg *msg, req = __lookup_request(osdc, tid); if (req == NULL) { dout("handle_reply tid %llu dne\n", tid); - mutex_unlock(&osdc->request_mutex); - return; + goto bad_mutex; } ceph_osdc_get_request(req);
The osd client mutex is acquired just before getting a reference to a request in handle_reply(). However the error paths after that don't drop the mutex before returning as they should. Drop the mutex after dropping the request reference. Also add a bad_mutex label at that point and use it so the failed request lookup case can be handled with the rest. This resolves: http://tracker.ceph.com/issues/4615 Signed-off-by: Alex Elder <elder@inktank.com> --- net/ceph/osd_client.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) @@ -1422,6 +1421,8 @@ done: bad_put: ceph_osdc_put_request(req); +bad_mutex: + mutex_unlock(&osdc->request_mutex); bad: pr_err("corrupt osd_op_reply got %d %d\n", (int)msg->front.iov_len, le32_to_cpu(msg->hdr.front_len));