Commit ba978e83 authored by Shyam Prasad N's avatar Shyam Prasad N Committed by Steve French
Browse files

cifs: cifs_ses_mark_for_reconnect should also update reconnect bits



Recent restructuring of cifs_reconnect introduced a helper func
named cifs_ses_mark_for_reconnect, which updates the state of tcp
session for all the channels of a session for reconnect.

However, this does not update the session state and chans_need_reconnect
bitmask. This change fixes that.

Also, cifs_mark_tcp_sess_for_reconnect should mark set the bitmask
for all channels when the whole session is marked for reconnect.
Fixed that here too.

Signed-off-by: default avatarShyam Prasad N <sprasad@microsoft.com>
Signed-off-by: default avatarSteve French <stfrench@microsoft.com>
parent 47de7606
Loading
Loading
Loading
Loading
+3 −6
Original line number Diff line number Diff line
@@ -396,11 +396,11 @@ static int cifs_swn_resource_state_changed(struct cifs_swn_reg *swnreg, const ch
	switch (state) {
	case CIFS_SWN_RESOURCE_STATE_UNAVAILABLE:
		cifs_dbg(FYI, "%s: resource name '%s' become unavailable\n", __func__, name);
		cifs_ses_mark_for_reconnect(swnreg->tcon->ses);
		cifs_reconnect(swnreg->tcon->ses->server, true);
		break;
	case CIFS_SWN_RESOURCE_STATE_AVAILABLE:
		cifs_dbg(FYI, "%s: resource name '%s' become available\n", __func__, name);
		cifs_ses_mark_for_reconnect(swnreg->tcon->ses);
		cifs_reconnect(swnreg->tcon->ses->server, true);
		break;
	case CIFS_SWN_RESOURCE_STATE_UNKNOWN:
		cifs_dbg(FYI, "%s: resource name '%s' changed to unknown state\n", __func__, name);
@@ -498,10 +498,7 @@ static int cifs_swn_reconnect(struct cifs_tcon *tcon, struct sockaddr_storage *a
		goto unlock;
	}

	spin_lock(&cifs_tcp_ses_lock);
	if (tcon->ses->server->tcpStatus != CifsExiting)
		tcon->ses->server->tcpStatus = CifsNeedReconnect;
	spin_unlock(&cifs_tcp_ses_lock);
	cifs_reconnect(tcon->ses->server, false);

unlock:
	mutex_unlock(&tcon->ses->server->srv_mutex);
+3 −0
Original line number Diff line number Diff line
@@ -131,6 +131,9 @@ extern int SendReceiveBlockingLock(const unsigned int xid,
			struct smb_hdr *in_buf ,
			struct smb_hdr *out_buf,
			int *bytes_returned);
void
cifs_mark_tcp_ses_conns_for_reconnect(struct TCP_Server_Info *server,
				      bool mark_smb_session);
extern int cifs_reconnect(struct TCP_Server_Info *server,
			  bool mark_smb_session);
extern int checkSMB(char *buf, unsigned int len, struct TCP_Server_Info *srvr);
+6 −3
Original line number Diff line number Diff line
@@ -168,7 +168,7 @@ static void cifs_resolve_server(struct work_struct *work)
 * @server needs to be previously set to CifsNeedReconnect.
 *
 */
static void
void
cifs_mark_tcp_ses_conns_for_reconnect(struct TCP_Server_Info *server,
				      bool mark_smb_session)
{
@@ -197,6 +197,9 @@ cifs_mark_tcp_ses_conns_for_reconnect(struct TCP_Server_Info *server,
		if (!mark_smb_session && cifs_chan_needs_reconnect(ses, server))
			goto next_session;

		if (mark_smb_session)
			CIFS_SET_ALL_CHANS_NEED_RECONNECT(ses);
		else
			cifs_chan_set_need_reconnect(ses, server);

		/* If all channels need reconnect, then tcon needs reconnect */
@@ -4396,7 +4399,7 @@ static int tree_connect_dfs_target(const unsigned int xid, struct cifs_tcon *tco
	 */
	if (rc && server->current_fullpath != server->origin_fullpath) {
		server->current_fullpath = server->origin_fullpath;
		cifs_ses_mark_for_reconnect(tcon->ses);
		cifs_reconnect(tcon->ses->server, true);
	}

	dfs_cache_free_tgts(tl);
+1 −1
Original line number Diff line number Diff line
@@ -1355,7 +1355,7 @@ static void mark_for_reconnect_if_needed(struct cifs_tcon *tcon, struct dfs_cach
	}

	cifs_dbg(FYI, "%s: no cached or matched targets. mark dfs share for reconnect.\n", __func__);
	cifs_ses_mark_for_reconnect(tcon->ses);
	cifs_reconnect(tcon->ses->server, true);
}

/* Refresh dfs referral of tcon and mark it for reconnect if needed */
+1 −4
Original line number Diff line number Diff line
@@ -896,10 +896,7 @@ map_and_check_smb_error(struct mid_q_entry *mid, bool logErr)
		if (class == ERRSRV && code == ERRbaduid) {
			cifs_dbg(FYI, "Server returned 0x%x, reconnecting session...\n",
				code);
			spin_lock(&cifs_tcp_ses_lock);
			if (mid->server->tcpStatus != CifsExiting)
				mid->server->tcpStatus = CifsNeedReconnect;
			spin_unlock(&cifs_tcp_ses_lock);
			cifs_reconnect(mid->server, false);
		}
	}

Loading