diff options
author | Sage Weil <sage@newdream.net> | 2010-07-05 15:15:14 -0400 |
---|---|---|
committer | Sage Weil <sage@newdream.net> | 2010-07-05 15:16:23 -0400 |
commit | ed98adad3d87594c55347824e85137d1829c9e70 (patch) | |
tree | b22414183f7eff1ac1ba606a3ebf2357f0876b4c /fs/ceph/messenger.c | |
parent | 153a10939ea6e42e9c0115b0645060d0d7bb4697 (diff) |
ceph: fix message revocation
A message can be on a queue (pending or sent), or out_msg (sending), or
both. We were assuming that if it's not on a queue it couldn't be out_msg,
but that was false in the case of lossy connections like the OSD. Fix
ceph_con_revoke() to treat these cases independently. Also, fix the
out_kvec_is_message check to only trigger if we are currently sending
_this_ message.
This fixes a GPF in tcp_sendpage, triggered by OSD restarts.
Signed-off-by: Sage Weil <sage@newdream.net>
Diffstat (limited to 'fs/ceph/messenger.c')
-rw-r--r-- | fs/ceph/messenger.c | 14 |
1 files changed, 7 insertions, 7 deletions
diff --git a/fs/ceph/messenger.c b/fs/ceph/messenger.c index 9ad43a310a41..9692d08e2f88 100644 --- a/fs/ceph/messenger.c +++ b/fs/ceph/messenger.c | |||
@@ -2015,20 +2015,20 @@ void ceph_con_revoke(struct ceph_connection *con, struct ceph_msg *msg) | |||
2015 | { | 2015 | { |
2016 | mutex_lock(&con->mutex); | 2016 | mutex_lock(&con->mutex); |
2017 | if (!list_empty(&msg->list_head)) { | 2017 | if (!list_empty(&msg->list_head)) { |
2018 | dout("con_revoke %p msg %p\n", con, msg); | 2018 | dout("con_revoke %p msg %p - was on queue\n", con, msg); |
2019 | list_del_init(&msg->list_head); | 2019 | list_del_init(&msg->list_head); |
2020 | ceph_msg_put(msg); | 2020 | ceph_msg_put(msg); |
2021 | msg->hdr.seq = 0; | 2021 | msg->hdr.seq = 0; |
2022 | if (con->out_msg == msg) { | 2022 | } |
2023 | ceph_msg_put(con->out_msg); | 2023 | if (con->out_msg == msg) { |
2024 | con->out_msg = NULL; | 2024 | dout("con_revoke %p msg %p - was sending\n", con, msg); |
2025 | } | 2025 | con->out_msg = NULL; |
2026 | if (con->out_kvec_is_msg) { | 2026 | if (con->out_kvec_is_msg) { |
2027 | con->out_skip = con->out_kvec_bytes; | 2027 | con->out_skip = con->out_kvec_bytes; |
2028 | con->out_kvec_is_msg = false; | 2028 | con->out_kvec_is_msg = false; |
2029 | } | 2029 | } |
2030 | } else { | 2030 | ceph_msg_put(msg); |
2031 | dout("con_revoke %p msg %p - not queued (sent?)\n", con, msg); | 2031 | msg->hdr.seq = 0; |
2032 | } | 2032 | } |
2033 | mutex_unlock(&con->mutex); | 2033 | mutex_unlock(&con->mutex); |
2034 | } | 2034 | } |