Re: [PATCH] cifs: after disabling multichannel, mark tcon for reconnect

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Fri, Dec 29, 2023 at 5:00 PM <nspmangalore@xxxxxxxxx> wrote:
>
> From: Shyam Prasad N <sprasad@xxxxxxxxxxxxx>
>
> Once the server disables multichannel for an active multichannel
> session, on the following reconnect, the client would reduce
> the number of channels to 1. However, it could be the case that
> the tree connect was active on one of these disabled channels.
> This results in an unrecoverable state.
>
> This change fixes that by making sure that whenever a channel
> is being terminated, the session and tcon are marked for
> reconnect too. This could mean a few redundant tree connect
> calls to the server, but considering that this is not a frequent
> event, we should be okay.
>
> Fixes: ee1d21794e55 ("cifs: handle when server stops supporting multichannel")
> Signed-off-by: Shyam Prasad N <sprasad@xxxxxxxxxxxxx>
> ---
>  fs/smb/client/connect.c | 20 ++++++++++++--------
>  1 file changed, 12 insertions(+), 8 deletions(-)
>
> diff --git a/fs/smb/client/connect.c b/fs/smb/client/connect.c
> index 44bfdd88a906..8b7cffba1ad5 100644
> --- a/fs/smb/client/connect.c
> +++ b/fs/smb/client/connect.c
> @@ -216,17 +216,21 @@ cifs_mark_tcp_ses_conns_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;
>
> +       /*
> +        * if the server has been marked for termination, there is a
> +        * chance that the remaining channels all need reconnect. To be
> +        * on the safer side, mark the session and trees for reconnect
> +        * for this scenario. This might cause a few redundant session
> +        * setup and tree connect requests, but it is better than not doing
> +        * a tree connect when needed, and all following requests failing
> +        */
> +       if (server->terminate) {
> +               mark_smb_session = true;
> +               server = pserver;
> +       }
>
>         spin_lock(&cifs_tcp_ses_lock);
>         list_for_each_entry_safe(ses, nses, &pserver->smb_ses_list, smb_ses_list) {
> -               /*
> -                * if channel has been marked for termination, nothing to do
> -                * for the channel. in fact, we cannot find the channel for the
> -                * server. So safe to exit here
> -                */
> -               if (server->terminate)
> -                       break;
> -
>                 /* check if iface is still active */
>                 if (!cifs_chan_is_iface_active(ses, server))
>                         cifs_chan_update_iface(ses, server);
> --
> 2.34.1
>

Sorry I missed sending out this patch before the other four.
This one needs to be applied first. Then the other four.

-- 
Regards,
Shyam





[Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux