Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit fbb85a47 authored by Sage Weil's avatar Sage Weil
Browse files

libceph: allow sock transition from CONNECTING to CLOSED



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: default avatarSage Weil <sage@inktank.com>
parent 735a72ef
Loading
Loading
Loading
Loading
+13 −12
Original line number Diff line number Diff line
@@ -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);
}