aboutsummaryrefslogtreecommitdiffstats
path: root/fs/ceph/messenger.c
diff options
context:
space:
mode:
authorSage Weil <sage@newdream.net>2010-07-05 15:15:14 -0400
committerSage Weil <sage@newdream.net>2010-07-05 15:16:23 -0400
commited98adad3d87594c55347824e85137d1829c9e70 (patch)
treeb22414183f7eff1ac1ba606a3ebf2357f0876b4c /fs/ceph/messenger.c
parent153a10939ea6e42e9c0115b0645060d0d7bb4697 (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.c14
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}