diff options
author | Shyam Prasad N | 2023-10-30 11:00:09 +0000 |
---|---|---|
committer | Greg Kroah-Hartman | 2023-11-28 17:07:15 +0000 |
commit | 5bdf34ca32427fe63a2a05d0fb90a32d416a85ac (patch) | |
tree | fe6ed61edd1432f145971d902aea88c271bcf54a /fs/smb | |
parent | 9eb44db68c5b7f5aa22b8fc7de74a3e2e08d1f29 (diff) |
cifs: reconnect helper should set reconnect for the right channel
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>
Diffstat (limited to 'fs/smb')
-rw-r--r-- | fs/smb/client/connect.c | 9 |
1 files changed, 5 insertions, 4 deletions
diff --git a/fs/smb/client/connect.c b/fs/smb/client/connect.c index acb8951eb757..5b8db0a8ba1b 100644 --- a/fs/smb/client/connect.c +++ b/fs/smb/client/connect.c @@ -205,13 +205,14 @@ cifs_signal_cifsd_for_reconnect(struct TCP_Server_Info *server, /* If server is a channel, select the primary channel */ pserver = CIFS_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) { |