mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-29 15:14:18 +08:00
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: Shyam Prasad N <sprasad@microsoft.com> Signed-off-by: Steve French <stfrench@microsoft.com>
This commit is contained in:
parent
47de760655
commit
ba978e8325
@ -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);
|
||||
|
@ -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);
|
||||
|
@ -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,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))
|
||||
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 (!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
|
||||
*/
|
||||
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);
|
||||
|
@ -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 */
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -366,21 +366,6 @@ out:
|
||||
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,
|
||||
struct TCP_Server_Info *server,
|
||||
SESSION_SETUP_ANDX *pSMB)
|
||||
|
Loading…
Reference in New Issue
Block a user