diff options
author | Yan, Zheng <zheng.z.yan@intel.com> | 2013-05-31 03:54:44 -0400 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2014-01-09 15:24:25 -0500 |
commit | aede2cb5c95588e703e358239a4f3842e21f103e (patch) | |
tree | 27a9eb82f8239a9e31ce7184f22bfdf8f1d4903b /net/ceph | |
parent | 7aa73ee13251af1534de166ea5379f32a6bf7793 (diff) |
libceph: fix safe completion
commit eb845ff13a44477f8a411baedbf11d678b9daf0a upstream.
handle_reply() calls complete_request() only if the first OSD reply
has ONDISK flag.
Signed-off-by: Yan, Zheng <zheng.z.yan@intel.com>
Reviewed-by: Sage Weil <sage@inktank.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'net/ceph')
-rw-r--r-- | net/ceph/osd_client.c | 17 |
1 files changed, 8 insertions, 9 deletions
diff --git a/net/ceph/osd_client.c b/net/ceph/osd_client.c index d127e36b4964..10e947cbc478 100644 --- a/net/ceph/osd_client.c +++ b/net/ceph/osd_client.c | |||
@@ -1522,6 +1522,8 @@ static void handle_reply(struct ceph_osd_client *osdc, struct ceph_msg *msg, | |||
1522 | for (i = 0; i < numops; i++) | 1522 | for (i = 0; i < numops; i++) |
1523 | req->r_reply_op_result[i] = ceph_decode_32(&p); | 1523 | req->r_reply_op_result[i] = ceph_decode_32(&p); |
1524 | 1524 | ||
1525 | already_completed = req->r_got_reply; | ||
1526 | |||
1525 | if (!req->r_got_reply) { | 1527 | if (!req->r_got_reply) { |
1526 | 1528 | ||
1527 | req->r_result = result; | 1529 | req->r_result = result; |
@@ -1552,16 +1554,14 @@ static void handle_reply(struct ceph_osd_client *osdc, struct ceph_msg *msg, | |||
1552 | ((flags & CEPH_OSD_FLAG_WRITE) == 0)) | 1554 | ((flags & CEPH_OSD_FLAG_WRITE) == 0)) |
1553 | __unregister_request(osdc, req); | 1555 | __unregister_request(osdc, req); |
1554 | 1556 | ||
1555 | already_completed = req->r_completed; | ||
1556 | req->r_completed = 1; | ||
1557 | mutex_unlock(&osdc->request_mutex); | 1557 | mutex_unlock(&osdc->request_mutex); |
1558 | if (already_completed) | ||
1559 | goto done; | ||
1560 | 1558 | ||
1561 | if (req->r_callback) | 1559 | if (!already_completed) { |
1562 | req->r_callback(req, msg); | 1560 | if (req->r_callback) |
1563 | else | 1561 | req->r_callback(req, msg); |
1564 | complete_all(&req->r_completion); | 1562 | else |
1563 | complete_all(&req->r_completion); | ||
1564 | } | ||
1565 | 1565 | ||
1566 | if (flags & CEPH_OSD_FLAG_ONDISK) | 1566 | if (flags & CEPH_OSD_FLAG_ONDISK) |
1567 | complete_request(req); | 1567 | complete_request(req); |
@@ -2121,7 +2121,6 @@ int ceph_osdc_start_request(struct ceph_osd_client *osdc, | |||
2121 | __register_request(osdc, req); | 2121 | __register_request(osdc, req); |
2122 | req->r_sent = 0; | 2122 | req->r_sent = 0; |
2123 | req->r_got_reply = 0; | 2123 | req->r_got_reply = 0; |
2124 | req->r_completed = 0; | ||
2125 | rc = __map_request(osdc, req, 0); | 2124 | rc = __map_request(osdc, req, 0); |
2126 | if (rc < 0) { | 2125 | if (rc < 0) { |
2127 | if (nofail) { | 2126 | if (nofail) { |