summaryrefslogtreecommitdiff
path: root/net
diff options
context:
space:
mode:
authorSage Weil <sage@inktank.com>2012-06-27 12:31:02 -0700
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2012-11-26 11:38:38 -0800
commitd92d11da1dd8531150823ff429ae29a0cf5e438d (patch)
tree15869cdd857ccb36d8a9d592694daa3a175ce061 /net
parenta5b0662bb814837139bb73249463e199528101b5 (diff)
libceph: allow sock transition from CONNECTING to CLOSED
(cherry picked from commit fbb85a478f6d4cce6942f1c25c6a68ec5b1e7e7f) It is possible to close a socket that is in the OPENING state. For example, it can happen if ceph_con_close() is called on the con before the TCP connection is established. con_work() will come around and shut down the socket. Signed-off-by: Sage Weil <sage@inktank.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'net')
-rw-r--r--net/ceph/messenger.c25
1 files changed, 13 insertions, 12 deletions
diff --git a/net/ceph/messenger.c b/net/ceph/messenger.c
index e7cb279162f4..866645fa857f 100644
--- a/net/ceph/messenger.c
+++ b/net/ceph/messenger.c
@@ -48,17 +48,17 @@
* | ----------------------
* | \
* + con_sock_state_closed() \
- * |\ \
- * | \ \
- * | ----------- \
- * | | CLOSING | socket event; \
- * | ----------- await close \
- * | ^ |
- * | | |
- * | + con_sock_state_closing() |
- * | / \ |
- * | / --------------- |
- * | / \ v
+ * |+--------------------------- \
+ * | \ \ \
+ * | ----------- \ \
+ * | | CLOSING | socket event; \ \
+ * | ----------- await close \ \
+ * | ^ \ |
+ * | | \ |
+ * | + con_sock_state_closing() \ |
+ * | / \ | |
+ * | / --------------- | |
+ * | / \ v v
* | / --------------
* | / -----------------| CONNECTING | socket created, TCP
* | | / -------------- connect initiated
@@ -241,7 +241,8 @@ static void con_sock_state_closed(struct ceph_connection *con)
old_state = atomic_xchg(&con->sock_state, CON_SOCK_STATE_CLOSED);
if (WARN_ON(old_state != CON_SOCK_STATE_CONNECTED &&
- old_state != CON_SOCK_STATE_CLOSING))
+ old_state != CON_SOCK_STATE_CLOSING &&
+ old_state != CON_SOCK_STATE_CONNECTING))
printk("%s: unexpected old state %d\n", __func__, old_state);
}