Message ID | 20231229113007.39009-1-sprasad@microsoft.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | cifs: after disabling multichannel, mark tcon for reconnect | expand |
On Fri, Dec 29, 2023 at 5:00 PM <nspmangalore@gmail.com> wrote: > > From: Shyam Prasad N <sprasad@microsoft.com> > > 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@microsoft.com> > --- > 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.
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);