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

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
Loading
Loading
Loading
Loading
+12 −3
Original line number Diff line number Diff line
@@ -1030,6 +1030,7 @@ struct cifs_ses {

#define CIFS_MAX_CHANNELS 16
	struct cifs_chan chans[CIFS_MAX_CHANNELS];
	struct cifs_chan *binding_chan;
	size_t chan_count;
	size_t chan_max;
	atomic_t chan_seq; /* round robin state */
@@ -1037,23 +1038,31 @@ struct cifs_ses {

/*
 * 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
struct cifs_chan *cifs_ses_binding_channel(struct cifs_ses *ses)
{
	if (ses->binding)
		return &ses->chans[ses->chan_count];
		return ses->binding_chan;
	else
		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
struct TCP_Server_Info *cifs_ses_server(struct cifs_ses *ses)
{
	if (ses->binding)
		return ses->chans[ses->chan_count].server;
		return ses->binding_chan->server;
	else
		return ses->server;
}
+2 −1
Original line number Diff line number Diff line
@@ -231,7 +231,7 @@ cifs_ses_add_channel(struct cifs_ses *ses, struct cifs_server_iface *iface)

	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);
	if (IS_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)
	atomic_set(&ses->chan_seq, 0);
out:
	ses->binding = false;
	ses->binding_chan = NULL;
	mutex_unlock(&ses->session_mutex);

	if (rc && chan->server)