cifs: handle cases where multiple sessions share connection
authorShyam Prasad N <sprasad@microsoft.com>
Tue, 6 Feb 2024 15:00:47 +0000 (15:00 +0000)
committerSteve French <stfrench@microsoft.com>
Fri, 9 Feb 2024 20:43:25 +0000 (14:43 -0600)
Based on our implementation of multichannel, it is entirely
possible that a server struct may not be found in any channel
of an SMB session.

In such cases, we should be prepared to move on and search for
the server struct in the next session.

Signed-off-by: Shyam Prasad N <sprasad@microsoft.com>
Signed-off-by: Steve French <stfrench@microsoft.com>
fs/smb/client/connect.c
fs/smb/client/sess.c

index 01c49b2..d03253f 100644 (file)
@@ -233,6 +233,12 @@ cifs_mark_tcp_ses_conns_for_reconnect(struct TCP_Server_Info *server,
        list_for_each_entry_safe(ses, nses, &pserver->smb_ses_list, smb_ses_list) {
                /* check if iface is still active */
                spin_lock(&ses->chan_lock);
+               if (cifs_ses_get_chan_index(ses, server) ==
+                   CIFS_INVAL_CHAN_INDEX) {
+                       spin_unlock(&ses->chan_lock);
+                       continue;
+               }
+
                if (!cifs_chan_is_iface_active(ses, server)) {
                        spin_unlock(&ses->chan_lock);
                        cifs_chan_update_iface(ses, server);
index 476d54f..8f37373 100644 (file)
@@ -88,7 +88,6 @@ cifs_ses_get_chan_index(struct cifs_ses *ses,
        if (server)
                cifs_dbg(VFS, "unable to get chan index for server: 0x%llx",
                         server->conn_id);
-       WARN_ON(1);
        return CIFS_INVAL_CHAN_INDEX;
 }