aboutsummaryrefslogtreecommitdiffstats
path: root/net
diff options
context:
space:
mode:
Diffstat (limited to 'net')
-rw-r--r--net/ceph/messenger.c8
1 files changed, 7 insertions, 1 deletions
diff --git a/net/ceph/messenger.c b/net/ceph/messenger.c
index cebef8560586..cfcca1f5be67 100644
--- a/net/ceph/messenger.c
+++ b/net/ceph/messenger.c
@@ -392,10 +392,16 @@ static int con_close_socket(struct ceph_connection *con)
392 dout("con_close_socket on %p sock %p\n", con, con->sock); 392 dout("con_close_socket on %p sock %p\n", con, con->sock);
393 if (!con->sock) 393 if (!con->sock)
394 return 0; 394 return 0;
395 set_bit(SOCK_CLOSED, &con->flags);
396 rc = con->sock->ops->shutdown(con->sock, SHUT_RDWR); 395 rc = con->sock->ops->shutdown(con->sock, SHUT_RDWR);
397 sock_release(con->sock); 396 sock_release(con->sock);
398 con->sock = NULL; 397 con->sock = NULL;
398
399 /*
400 * Forcibly clear the SOCK_CLOSE flag. It gets set
401 * independent of the connection mutex, and we could have
402 * received a socket close event before we had the chance to
403 * shut the socket down.
404 */
399 clear_bit(SOCK_CLOSED, &con->flags); 405 clear_bit(SOCK_CLOSED, &con->flags);
400 con_sock_state_closed(con); 406 con_sock_state_closed(con);
401 return rc; 407 return rc;