diff options
| -rw-r--r-- | fs/cifs/connect.c | 37 |
1 files changed, 20 insertions, 17 deletions
diff --git a/fs/cifs/connect.c b/fs/cifs/connect.c index 084756cfdaee..0b3ac8b76d18 100644 --- a/fs/cifs/connect.c +++ b/fs/cifs/connect.c | |||
| @@ -528,6 +528,21 @@ cifs_reconnect(struct TCP_Server_Info *server) | |||
| 528 | /* do not want to be sending data on a socket we are freeing */ | 528 | /* do not want to be sending data on a socket we are freeing */ |
| 529 | cifs_dbg(FYI, "%s: tearing down socket\n", __func__); | 529 | cifs_dbg(FYI, "%s: tearing down socket\n", __func__); |
| 530 | mutex_lock(&server->srv_mutex); | 530 | mutex_lock(&server->srv_mutex); |
| 531 | if (server->ssocket) { | ||
| 532 | cifs_dbg(FYI, "State: 0x%x Flags: 0x%lx\n", | ||
| 533 | server->ssocket->state, server->ssocket->flags); | ||
| 534 | kernel_sock_shutdown(server->ssocket, SHUT_WR); | ||
| 535 | cifs_dbg(FYI, "Post shutdown state: 0x%x Flags: 0x%lx\n", | ||
| 536 | server->ssocket->state, server->ssocket->flags); | ||
| 537 | sock_release(server->ssocket); | ||
| 538 | server->ssocket = NULL; | ||
| 539 | } | ||
| 540 | server->sequence_number = 0; | ||
| 541 | server->session_estab = false; | ||
| 542 | kfree(server->session_key.response); | ||
| 543 | server->session_key.response = NULL; | ||
| 544 | server->session_key.len = 0; | ||
| 545 | server->lstrp = jiffies; | ||
| 531 | 546 | ||
| 532 | /* mark submitted MIDs for retry and issue callback */ | 547 | /* mark submitted MIDs for retry and issue callback */ |
| 533 | INIT_LIST_HEAD(&retry_list); | 548 | INIT_LIST_HEAD(&retry_list); |
| @@ -540,6 +555,7 @@ cifs_reconnect(struct TCP_Server_Info *server) | |||
| 540 | list_move(&mid_entry->qhead, &retry_list); | 555 | list_move(&mid_entry->qhead, &retry_list); |
| 541 | } | 556 | } |
| 542 | spin_unlock(&GlobalMid_Lock); | 557 | spin_unlock(&GlobalMid_Lock); |
| 558 | mutex_unlock(&server->srv_mutex); | ||
| 543 | 559 | ||
| 544 | cifs_dbg(FYI, "%s: issuing mid callbacks\n", __func__); | 560 | cifs_dbg(FYI, "%s: issuing mid callbacks\n", __func__); |
| 545 | list_for_each_safe(tmp, tmp2, &retry_list) { | 561 | list_for_each_safe(tmp, tmp2, &retry_list) { |
| @@ -548,24 +564,11 @@ cifs_reconnect(struct TCP_Server_Info *server) | |||
| 548 | mid_entry->callback(mid_entry); | 564 | mid_entry->callback(mid_entry); |
| 549 | } | 565 | } |
| 550 | 566 | ||
| 551 | if (server->ssocket) { | 567 | if (cifs_rdma_enabled(server)) { |
| 552 | cifs_dbg(FYI, "State: 0x%x Flags: 0x%lx\n", | 568 | mutex_lock(&server->srv_mutex); |
| 553 | server->ssocket->state, server->ssocket->flags); | ||
| 554 | kernel_sock_shutdown(server->ssocket, SHUT_WR); | ||
| 555 | cifs_dbg(FYI, "Post shutdown state: 0x%x Flags: 0x%lx\n", | ||
| 556 | server->ssocket->state, server->ssocket->flags); | ||
| 557 | sock_release(server->ssocket); | ||
| 558 | server->ssocket = NULL; | ||
| 559 | } else if (cifs_rdma_enabled(server)) | ||
| 560 | smbd_destroy(server); | 569 | smbd_destroy(server); |
| 561 | server->sequence_number = 0; | 570 | mutex_unlock(&server->srv_mutex); |
| 562 | server->session_estab = false; | 571 | } |
| 563 | kfree(server->session_key.response); | ||
| 564 | server->session_key.response = NULL; | ||
| 565 | server->session_key.len = 0; | ||
| 566 | server->lstrp = jiffies; | ||
| 567 | |||
| 568 | mutex_unlock(&server->srv_mutex); | ||
| 569 | 572 | ||
| 570 | do { | 573 | do { |
| 571 | try_to_freeze(); | 574 | try_to_freeze(); |
