Commit 8eec7954 authored by Aurelien Aptel's avatar Aurelien Aptel Committed by Steve French

cifs: multichannel: use pointer for binding channel

Add a cifs_chan pointer in struct cifs_ses that points to the channel
currently being bound if ses->binding is true.

Previously it was always the channel past the established count.

This will make reconnecting (and rebinding) a channel easier later on.
Signed-off-by: default avatarAurelien Aptel <aaptel@suse.com>
Signed-off-by: default avatarSteve French <stfrench@microsoft.com>
parent edb16135
...@@ -1030,6 +1030,7 @@ struct cifs_ses { ...@@ -1030,6 +1030,7 @@ struct cifs_ses {
#define CIFS_MAX_CHANNELS 16 #define CIFS_MAX_CHANNELS 16
struct cifs_chan chans[CIFS_MAX_CHANNELS]; struct cifs_chan chans[CIFS_MAX_CHANNELS];
struct cifs_chan *binding_chan;
size_t chan_count; size_t chan_count;
size_t chan_max; size_t chan_max;
atomic_t chan_seq; /* round robin state */ atomic_t chan_seq; /* round robin state */
...@@ -1037,23 +1038,31 @@ struct cifs_ses { ...@@ -1037,23 +1038,31 @@ struct cifs_ses {
/* /*
* When binding a new channel, we need to access the channel which isn't fully * When binding a new channel, we need to access the channel which isn't fully
* established yet (one past the established count) * established yet.
*/ */
static inline static inline
struct cifs_chan *cifs_ses_binding_channel(struct cifs_ses *ses) struct cifs_chan *cifs_ses_binding_channel(struct cifs_ses *ses)
{ {
if (ses->binding) if (ses->binding)
return &ses->chans[ses->chan_count]; return ses->binding_chan;
else else
return NULL; return NULL;
} }
/*
* Returns the server pointer of the session. When binding a new
* channel this returns the last channel which isn't fully established
* yet.
*
* This function should be use for negprot/sess.setup codepaths. For
* the other requests see cifs_pick_channel().
*/
static inline static inline
struct TCP_Server_Info *cifs_ses_server(struct cifs_ses *ses) struct TCP_Server_Info *cifs_ses_server(struct cifs_ses *ses)
{ {
if (ses->binding) if (ses->binding)
return ses->chans[ses->chan_count].server; return ses->binding_chan->server;
else else
return ses->server; return ses->server;
} }
......
...@@ -231,7 +231,7 @@ cifs_ses_add_channel(struct cifs_ses *ses, struct cifs_server_iface *iface) ...@@ -231,7 +231,7 @@ cifs_ses_add_channel(struct cifs_ses *ses, struct cifs_server_iface *iface)
mutex_lock(&ses->session_mutex); mutex_lock(&ses->session_mutex);
chan = &ses->chans[ses->chan_count]; chan = ses->binding_chan = &ses->chans[ses->chan_count];
chan->server = cifs_get_tcp_session(&vol); chan->server = cifs_get_tcp_session(&vol);
if (IS_ERR(chan->server)) { if (IS_ERR(chan->server)) {
rc = PTR_ERR(chan->server); rc = PTR_ERR(chan->server);
...@@ -276,6 +276,7 @@ cifs_ses_add_channel(struct cifs_ses *ses, struct cifs_server_iface *iface) ...@@ -276,6 +276,7 @@ cifs_ses_add_channel(struct cifs_ses *ses, struct cifs_server_iface *iface)
atomic_set(&ses->chan_seq, 0); atomic_set(&ses->chan_seq, 0);
out: out:
ses->binding = false; ses->binding = false;
ses->binding_chan = NULL;
mutex_unlock(&ses->session_mutex); mutex_unlock(&ses->session_mutex);
if (rc && chan->server) if (rc && chan->server)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment