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

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
...@@ -396,11 +396,11 @@ static int cifs_swn_resource_state_changed(struct cifs_swn_reg *swnreg, const ch ...@@ -396,11 +396,11 @@ static int cifs_swn_resource_state_changed(struct cifs_swn_reg *swnreg, const ch
switch (state) { switch (state) {
case CIFS_SWN_RESOURCE_STATE_UNAVAILABLE: case CIFS_SWN_RESOURCE_STATE_UNAVAILABLE:
cifs_dbg(FYI, "%s: resource name '%s' become unavailable\n", __func__, name); 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; break;
case CIFS_SWN_RESOURCE_STATE_AVAILABLE: case CIFS_SWN_RESOURCE_STATE_AVAILABLE:
cifs_dbg(FYI, "%s: resource name '%s' become available\n", __func__, name); 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; break;
case CIFS_SWN_RESOURCE_STATE_UNKNOWN: case CIFS_SWN_RESOURCE_STATE_UNKNOWN:
cifs_dbg(FYI, "%s: resource name '%s' changed to unknown state\n", __func__, name); 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 ...@@ -498,10 +498,7 @@ static int cifs_swn_reconnect(struct cifs_tcon *tcon, struct sockaddr_storage *a
goto unlock; goto unlock;
} }
spin_lock(&cifs_tcp_ses_lock); cifs_reconnect(tcon->ses->server, false);
if (tcon->ses->server->tcpStatus != CifsExiting)
tcon->ses->server->tcpStatus = CifsNeedReconnect;
spin_unlock(&cifs_tcp_ses_lock);
unlock: unlock:
mutex_unlock(&tcon->ses->server->srv_mutex); mutex_unlock(&tcon->ses->server->srv_mutex);
......
...@@ -131,6 +131,9 @@ extern int SendReceiveBlockingLock(const unsigned int xid, ...@@ -131,6 +131,9 @@ extern int SendReceiveBlockingLock(const unsigned int xid,
struct smb_hdr *in_buf , struct smb_hdr *in_buf ,
struct smb_hdr *out_buf, struct smb_hdr *out_buf,
int *bytes_returned); 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, extern int cifs_reconnect(struct TCP_Server_Info *server,
bool mark_smb_session); bool mark_smb_session);
extern int checkSMB(char *buf, unsigned int len, struct TCP_Server_Info *srvr); extern int checkSMB(char *buf, unsigned int len, struct TCP_Server_Info *srvr);
......
...@@ -168,7 +168,7 @@ static void cifs_resolve_server(struct work_struct *work) ...@@ -168,7 +168,7 @@ static void cifs_resolve_server(struct work_struct *work)
* @server needs to be previously set to CifsNeedReconnect. * @server needs to be previously set to CifsNeedReconnect.
* *
*/ */
static void void
cifs_mark_tcp_ses_conns_for_reconnect(struct TCP_Server_Info *server, cifs_mark_tcp_ses_conns_for_reconnect(struct TCP_Server_Info *server,
bool mark_smb_session) bool mark_smb_session)
{ {
...@@ -197,7 +197,10 @@ cifs_mark_tcp_ses_conns_for_reconnect(struct TCP_Server_Info *server, ...@@ -197,7 +197,10 @@ cifs_mark_tcp_ses_conns_for_reconnect(struct TCP_Server_Info *server,
if (!mark_smb_session && cifs_chan_needs_reconnect(ses, server)) if (!mark_smb_session && cifs_chan_needs_reconnect(ses, server))
goto next_session; goto next_session;
cifs_chan_set_need_reconnect(ses, server); 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 */ /* If all channels need reconnect, then tcon needs reconnect */
if (!mark_smb_session && !CIFS_ALL_CHANS_NEED_RECONNECT(ses)) if (!mark_smb_session && !CIFS_ALL_CHANS_NEED_RECONNECT(ses))
...@@ -4396,7 +4399,7 @@ static int tree_connect_dfs_target(const unsigned int xid, struct cifs_tcon *tco ...@@ -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) { if (rc && server->current_fullpath != server->origin_fullpath) {
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); dfs_cache_free_tgts(tl);
......
...@@ -1355,7 +1355,7 @@ static void mark_for_reconnect_if_needed(struct cifs_tcon *tcon, struct dfs_cach ...@@ -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_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 */ /* Refresh dfs referral of tcon and mark it for reconnect if needed */
......
...@@ -896,10 +896,7 @@ map_and_check_smb_error(struct mid_q_entry *mid, bool logErr) ...@@ -896,10 +896,7 @@ map_and_check_smb_error(struct mid_q_entry *mid, bool logErr)
if (class == ERRSRV && code == ERRbaduid) { if (class == ERRSRV && code == ERRbaduid) {
cifs_dbg(FYI, "Server returned 0x%x, reconnecting session...\n", cifs_dbg(FYI, "Server returned 0x%x, reconnecting session...\n",
code); code);
spin_lock(&cifs_tcp_ses_lock); cifs_reconnect(mid->server, false);
if (mid->server->tcpStatus != CifsExiting)
mid->server->tcpStatus = CifsNeedReconnect;
spin_unlock(&cifs_tcp_ses_lock);
} }
} }
......
...@@ -366,21 +366,6 @@ cifs_ses_add_channel(struct cifs_sb_info *cifs_sb, struct cifs_ses *ses, ...@@ -366,21 +366,6 @@ cifs_ses_add_channel(struct cifs_sb_info *cifs_sb, struct cifs_ses *ses,
return rc; return rc;
} }
/* Mark all session channels for reconnect */
void cifs_ses_mark_for_reconnect(struct cifs_ses *ses)
{
int i;
spin_lock(&cifs_tcp_ses_lock);
spin_lock(&ses->chan_lock);
for (i = 0; i < ses->chan_count; i++) {
if (ses->chans[i].server->tcpStatus != CifsExiting)
ses->chans[i].server->tcpStatus = CifsNeedReconnect;
}
spin_unlock(&ses->chan_lock);
spin_unlock(&cifs_tcp_ses_lock);
}
static __u32 cifs_ssetup_hdr(struct cifs_ses *ses, static __u32 cifs_ssetup_hdr(struct cifs_ses *ses,
struct TCP_Server_Info *server, struct TCP_Server_Info *server,
SESSION_SETUP_ANDX *pSMB) SESSION_SETUP_ANDX *pSMB)
......
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