diff options
author | Shyam Prasad N <sprasad@microsoft.com> | 2021-07-19 16:54:16 +0300 |
---|---|---|
committer | Steve French <stfrench@microsoft.com> | 2022-01-03 05:38:46 +0300 |
commit | f486ef8e2003f6c308d0db81ea116c880a760d4f (patch) | |
tree | 2155ed49bc0f7375733c96186fd90a5c99e8201a /fs/cifs/cifssmb.c | |
parent | d1a931ce2e3b7761d293ba8e0bde2b0180f456e9 (diff) | |
download | linux-f486ef8e2003f6c308d0db81ea116c880a760d4f.tar.xz |
cifs: use the chans_need_reconnect bitmap for reconnect status
We use the concept of "binding" when one of the secondary channel
is in the process of connecting/reconnecting to the server. Till this
binding process completes, and the channel is bound to an existing session,
we redirect traffic from other established channels on the binding channel,
effectively blocking all traffic till individual channels get reconnected.
With my last set of commits, we can get rid of this binding serialization.
We now have a bitmap of connection states for each channel. We will use
this bitmap instead for tracking channel status.
Having a bitmap also now enables us to keep the session alive, as long
as even a single channel underneath is alive.
Unfortunately, this also meant that we need to supply the tcp connection
info for the channel during all negotiate and session setup functions.
These changes have resulted in a slightly bigger code churn.
However, I expect perf and robustness improvements in the mchan scenario
after this change.
Signed-off-by: Shyam Prasad N <sprasad@microsoft.com>
Signed-off-by: Steve French <stfrench@microsoft.com>
Diffstat (limited to 'fs/cifs/cifssmb.c')
-rw-r--r-- | fs/cifs/cifssmb.c | 12 |
1 files changed, 7 insertions, 5 deletions
diff --git a/fs/cifs/cifssmb.c b/fs/cifs/cifssmb.c index cbb0d55c1267..8b3e5be483bc 100644 --- a/fs/cifs/cifssmb.c +++ b/fs/cifs/cifssmb.c @@ -199,7 +199,8 @@ cifs_reconnect_tcon(struct cifs_tcon *tcon, int smb_command) spin_lock(&ses->chan_lock); if (!cifs_chan_needs_reconnect(ses, server)) { spin_unlock(&ses->chan_lock); - /* this just means that we only need to tcon */ + + /* this means that we only need to tree connect */ if (tcon->need_reconnect) goto skip_sess_setup; @@ -209,9 +210,9 @@ cifs_reconnect_tcon(struct cifs_tcon *tcon, int smb_command) } spin_unlock(&ses->chan_lock); - rc = cifs_negotiate_protocol(0, ses); + rc = cifs_negotiate_protocol(0, ses, server); if (!rc) - rc = cifs_setup_session(0, ses, nls_codepage); + rc = cifs_setup_session(0, ses, server, nls_codepage); /* do we need to reconnect tcon? */ if (rc || !tcon->need_reconnect) { @@ -503,14 +504,15 @@ should_set_ext_sec_flag(enum securityEnum sectype) } int -CIFSSMBNegotiate(const unsigned int xid, struct cifs_ses *ses) +CIFSSMBNegotiate(const unsigned int xid, + struct cifs_ses *ses, + struct TCP_Server_Info *server) { NEGOTIATE_REQ *pSMB; NEGOTIATE_RSP *pSMBr; int rc = 0; int bytes_returned; int i; - struct TCP_Server_Info *server = ses->server; u16 count; if (!server) { |