diff options
Diffstat (limited to 'net')
-rw-r--r-- | net/ceph/messenger.c | 8 |
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; |