Skip to content

Commit 214bab4

Browse files
longlimsftsmfrench
authored andcommitted
cifs: Call MID callback before destroying transport
When transport is being destroyed, it's possible that some processes may hold memory registrations that need to be deregistred. Call them first so nobody is using transport resources, and it can be destroyed. Signed-off-by: Long Li <longli@microsoft.com> Signed-off-by: Steve French <stfrench@microsoft.com>
1 parent b797209 commit 214bab4

File tree

1 file changed

+19
-17
lines changed

1 file changed

+19
-17
lines changed

fs/cifs/connect.c

Lines changed: 19 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -528,22 +528,6 @@ cifs_reconnect(struct TCP_Server_Info *server)
528528
/* do not want to be sending data on a socket we are freeing */
529529
cifs_dbg(FYI, "%s: tearing down socket\n", __func__);
530530
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-
} else if (cifs_rdma_enabled(server))
540-
smbd_destroy(server);
541-
server->sequence_number = 0;
542-
server->session_estab = false;
543-
kfree(server->session_key.response);
544-
server->session_key.response = NULL;
545-
server->session_key.len = 0;
546-
server->lstrp = jiffies;
547531

548532
/* mark submitted MIDs for retry and issue callback */
549533
INIT_LIST_HEAD(&retry_list);
@@ -556,7 +540,6 @@ cifs_reconnect(struct TCP_Server_Info *server)
556540
list_move(&mid_entry->qhead, &retry_list);
557541
}
558542
spin_unlock(&GlobalMid_Lock);
559-
mutex_unlock(&server->srv_mutex);
560543

561544
cifs_dbg(FYI, "%s: issuing mid callbacks\n", __func__);
562545
list_for_each_safe(tmp, tmp2, &retry_list) {
@@ -565,6 +548,25 @@ cifs_reconnect(struct TCP_Server_Info *server)
565548
mid_entry->callback(mid_entry);
566549
}
567550

551+
if (server->ssocket) {
552+
cifs_dbg(FYI, "State: 0x%x Flags: 0x%lx\n",
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);
561+
server->sequence_number = 0;
562+
server->session_estab = false;
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+
568570
do {
569571
try_to_freeze();
570572

0 commit comments

Comments
 (0)