diff options
author | Sage Weil <sage@inktank.com> | 2012-07-30 21:16:56 -0400 |
---|---|---|
committer | Sage Weil <sage@inktank.com> | 2012-07-30 21:16:56 -0400 |
commit | 7b862e07b1a4d5c963d19027f10ea78085f27f9b (patch) | |
tree | 003d412e6ebfd50f03cabd0bc82aa3916d3bbd06 /net | |
parent | 4f471e4a9c7db0256834e1b376ea50c82e345c3c (diff) |
libceph: verify state after retaking con lock after dispatch
We drop the con mutex when delivering a message. When we retake the
lock, we need to verify we are still in the OPEN state before
preparing to read the next tag, or else we risk stepping on a
connection that has been closed.
Signed-off-by: Sage Weil <sage@inktank.com>
Reviewed-by: Alex Elder <elder@inktank.com>
Diffstat (limited to 'net')
-rw-r--r-- | net/ceph/messenger.c | 3 |
1 files changed, 2 insertions, 1 deletions
diff --git a/net/ceph/messenger.c b/net/ceph/messenger.c index a6a0c7a0a979..feb5a2ac724c 100644 --- a/net/ceph/messenger.c +++ b/net/ceph/messenger.c | |||
@@ -2003,7 +2003,6 @@ static void process_message(struct ceph_connection *con) | |||
2003 | con->ops->dispatch(con, msg); | 2003 | con->ops->dispatch(con, msg); |
2004 | 2004 | ||
2005 | mutex_lock(&con->mutex); | 2005 | mutex_lock(&con->mutex); |
2006 | prepare_read_tag(con); | ||
2007 | } | 2006 | } |
2008 | 2007 | ||
2009 | 2008 | ||
@@ -2213,6 +2212,8 @@ more: | |||
2213 | if (con->in_tag == CEPH_MSGR_TAG_READY) | 2212 | if (con->in_tag == CEPH_MSGR_TAG_READY) |
2214 | goto more; | 2213 | goto more; |
2215 | process_message(con); | 2214 | process_message(con); |
2215 | if (con->state == CON_STATE_OPEN) | ||
2216 | prepare_read_tag(con); | ||
2216 | goto more; | 2217 | goto more; |
2217 | } | 2218 | } |
2218 | if (con->in_tag == CEPH_MSGR_TAG_ACK) { | 2219 | if (con->in_tag == CEPH_MSGR_TAG_ACK) { |