summaryrefslogtreecommitdiffstats
path: root/fs
diff options
context:
space:
mode:
authorShyam Prasad N <sprasad@microsoft.com>2024-02-06 15:00:47 +0000
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2024-03-01 13:41:43 +0100
commit9383a471df1cf42870f684c736a44aee8e49e2b7 (patch)
tree2ebe75d0aa087fb6d8f30aab924cc019f9e06159 /fs
parentdca591b499f90806a95cab6fb75db44b85ce4abe (diff)
downloadlinux-stable-9383a471df1cf42870f684c736a44aee8e49e2b7.tar.gz
linux-stable-9383a471df1cf42870f684c736a44aee8e49e2b7.tar.bz2
linux-stable-9383a471df1cf42870f684c736a44aee8e49e2b7.zip
cifs: handle cases where multiple sessions share connection
[ Upstream commit a39c757bf0596b17482a507f31c3ef0af0d1d2b4 ] 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> Signed-off-by: Sasha Levin <sashal@kernel.org>
Diffstat (limited to 'fs')
-rw-r--r--fs/smb/client/connect.c6
-rw-r--r--fs/smb/client/sess.c1
2 files changed, 6 insertions, 1 deletions
diff --git a/fs/smb/client/connect.c b/fs/smb/client/connect.c
index 35fe70b872b5..c3d805ecb7f1 100644
--- a/fs/smb/client/connect.c
+++ b/fs/smb/client/connect.c
@@ -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);
diff --git a/fs/smb/client/sess.c b/fs/smb/client/sess.c
index 3b07f54a8567..9415bcda1d2c 100644
--- a/fs/smb/client/sess.c
+++ b/fs/smb/client/sess.c
@@ -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;
}