cifs: reconnect helper should set reconnect for the right channel
authorShyam Prasad N <sprasad@microsoft.com>
Mon, 30 Oct 2023 11:00:09 +0000 (11:00 +0000)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 28 Nov 2023 17:20:09 +0000 (17:20 +0000)
commit c3326a61cdbf3ce1273d9198b6cbf90965d7e029 upstream.

We introduced a helper function to be used by non-cifsd threads to
mark the connection for reconnect. For multichannel, when only
a particular channel needs to be reconnected, this had a bug.

This change fixes that by marking that particular channel
for reconnect.

Fixes: dca65818c80c ("cifs: use a different reconnect helper for non-cifsd threads")
Cc: stable@vger.kernel.org
Signed-off-by: Shyam Prasad N <sprasad@microsoft.com>
Reviewed-by: Paulo Alcantara (SUSE) <pc@manguebit.com>
Signed-off-by: Steve French <stfrench@microsoft.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
fs/smb/client/connect.c

index 7b923e36501b0bb09f7a1339004ab23f335510e0..a549cae607f6c77b44ea6b6a440c1a5e57940609 100644 (file)
@@ -156,13 +156,14 @@ cifs_signal_cifsd_for_reconnect(struct TCP_Server_Info *server,
        /* If server is a channel, select the primary channel */
        pserver = SERVER_IS_CHAN(server) ? server->primary_server : server;
 
-       spin_lock(&pserver->srv_lock);
+       /* if we need to signal just this channel */
        if (!all_channels) {
-               pserver->tcpStatus = CifsNeedReconnect;
-               spin_unlock(&pserver->srv_lock);
+               spin_lock(&server->srv_lock);
+               if (server->tcpStatus != CifsExiting)
+                       server->tcpStatus = CifsNeedReconnect;
+               spin_unlock(&server->srv_lock);
                return;
        }
-       spin_unlock(&pserver->srv_lock);
 
        spin_lock(&cifs_tcp_ses_lock);
        list_for_each_entry(ses, &pserver->smb_ses_list, smb_ses_list) {