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: Sage Weil <sage@inktank.com>
This commit is contained in:
Sage Weil 2012-06-27 12:31:02 -07:00
Родитель 735a72ef95
Коммит fbb85a478f
1 изменённых файлов: 13 добавлений и 12 удалений

Просмотреть файл

@ -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);
}