[138/270] libceph: verify state after retaking con lock after dispatch

Message ID 1353949160-26803-139-git-send-email-herton.krzesinski@canonical.com
State New
Headers show

Commit Message

Herton Ronaldo Krzesinski Nov. 26, 2012, 4:57 p.m.
3.5.7u1 -stable review patch.  If anyone has any objections, please let me know.


From: Sage Weil <sage@inktank.com>

commit 7b862e07b1a4d5c963d19027f10ea78085f27f9b upstream.

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>
Signed-off-by: Herton Ronaldo Krzesinski <herton.krzesinski@canonical.com>
 net/ceph/messenger.c |    3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)


diff --git a/net/ceph/messenger.c b/net/ceph/messenger.c
index a6a0c7a..feb5a2a 100644
--- a/net/ceph/messenger.c
+++ b/net/ceph/messenger.c
@@ -2003,7 +2003,6 @@  static void process_message(struct ceph_connection *con)
 	con->ops->dispatch(con, msg);
-	prepare_read_tag(con);
@@ -2213,6 +2212,8 @@  more:
 		if (con->in_tag == CEPH_MSGR_TAG_READY)
 			goto more;
+		if (con->state == CON_STATE_OPEN)
+			prepare_read_tag(con);
 		goto more;
 	if (con->in_tag == CEPH_MSGR_TAG_ACK) {