diff options
author | Sage Weil <sage@newdream.net> | 2009-10-08 16:57:16 -0700 |
---|---|---|
committer | Sage Weil <sage@newdream.net> | 2009-10-09 11:58:07 -0700 |
commit | 0ba6478df7c6bef0f4b2625554545f941f89fb97 (patch) | |
tree | 2b99864e80174ab56cb0d0b42669e45e2c9d86cd | |
parent | c1ea8823be69ebebaface912142190e910711984 (diff) |
ceph: revoke osd request message on request completion
If an osd has failed or returned and a request has been sent twice, it's
possible to get a reply and unregister the request while the request
message is queued for delivery. Since the message references the caller's
page vector, we need to revoke it before completing.
Signed-off-by: Sage Weil <sage@newdream.net>
-rw-r--r-- | fs/ceph/osd_client.c | 13 |
1 files changed, 9 insertions, 4 deletions
diff --git a/fs/ceph/osd_client.c b/fs/ceph/osd_client.c index d14019dd686..0aea8afaa07 100644 --- a/fs/ceph/osd_client.c +++ b/fs/ceph/osd_client.c @@ -469,10 +469,15 @@ static void __unregister_request(struct ceph_osd_client *osdc, rb_erase(&req->r_node, &osdc->requests); osdc->num_requests--; - list_del_init(&req->r_osd_item); - if (list_empty(&req->r_osd->o_requests)) - remove_osd(osdc, req->r_osd); - req->r_osd = NULL; + if (req->r_osd) { + /* make sure the original request isn't in flight. */ + ceph_con_revoke(&req->r_osd->o_con, req->r_request); + + list_del_init(&req->r_osd_item); + if (list_empty(&req->r_osd->o_requests)) + remove_osd(osdc, req->r_osd); + req->r_osd = NULL; + } ceph_osdc_put_request(req); |