libceph: verify state after retaking con lock after dispatch
authorSage Weil <sage@inktank.com>
Tue, 31 Jul 2012 01:16:56 +0000 (18:16 -0700)
committerSage Weil <sage@inktank.com>
Tue, 31 Jul 2012 01:16:56 +0000 (18:16 -0700)
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>
net/ceph/messenger.c

index a6a0c7a0a979a3a951370321d9985d86234b8305..feb5a2ac724ce7dba4af79cf293aba5e4c9ba35d 100644 (file)
@@ -2003,7 +2003,6 @@ static void process_message(struct ceph_connection *con)
        con->ops->dispatch(con, msg);
 
        mutex_lock(&con->mutex);
-       prepare_read_tag(con);
 }
 
 
@@ -2213,6 +2212,8 @@ more:
                if (con->in_tag == CEPH_MSGR_TAG_READY)
                        goto more;
                process_message(con);
+               if (con->state == CON_STATE_OPEN)
+                       prepare_read_tag(con);
                goto more;
        }
        if (con->in_tag == CEPH_MSGR_TAG_ACK) {