Currently, if a connection is READY in try_read(), and a CLOSE tag is the what is received next, the connection's state changes from CONNECTED to CLOSED and try_read() returns. If this happens, control returns to con_work(), and try_write() is called. If there was queued data to send, try_write() appears to attempt to send it despite the receipt of the CLOSE tag. Eventually, try_write() will return either: - A non-negative value, in which case con_work() will end, and will at some point get triggered to run by an event. - -EAGAIN, in which case control returns to the top of con_work() - Some other error, which will cause con_work() to call ceph_fault(), which will close the socket and force a new connection sequence to be initiated on the next write. At the top of con_work(), if the connection is in CLOSED state, the same fault handling will be done as would happen for any other error. Instead of messing with the connection state deep inside try_read(), just have try_read() return a negative value (an errno), and let the fault handling code in con_work() take care of resetting the connection right away. This will also close the connection before needlessly sending any queued data to the other end. Signed-off-by: Alex Elder <elder@xxxxxxxxxxx> --- net/ceph/messenger.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) Index: b/net/ceph/messenger.c =================================================================== --- a/net/ceph/messenger.c +++ b/net/ceph/messenger.c @@ -2273,8 +2273,7 @@ more: prepare_read_ack(con); break; case CEPH_MSGR_TAG_CLOSE: - clear_bit(CONNECTED, &con->state); - set_bit(CLOSED, &con->state); /* fixme */ + ret = -EIO; goto out; default: goto bad_tag; -- To unsubscribe from this list: send the line "unsubscribe ceph-devel" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html