diff options
Diffstat (limited to 'fs/cifs/connect.c')
-rw-r--r-- | fs/cifs/connect.c | 29 |
1 files changed, 23 insertions, 6 deletions
diff --git a/fs/cifs/connect.c b/fs/cifs/connect.c index 6740a7c39df3..0a35503b7b46 100644 --- a/fs/cifs/connect.c +++ b/fs/cifs/connect.c @@ -3770,10 +3770,6 @@ CIFSTCon(const unsigned int xid, struct cifs_ses *ses, if (rc == 0) { bool is_unicode; - spin_lock(&cifs_tcp_ses_lock); - tcon->tidStatus = CifsGood; - spin_unlock(&cifs_tcp_ses_lock); - tcon->need_reconnect = false; tcon->tid = smb_buffer_response->Tid; bcc_ptr = pByteArea(smb_buffer_response); bytes_left = get_bcc(smb_buffer_response); @@ -3949,7 +3945,14 @@ cifs_setup_session(const unsigned int xid, struct cifs_ses *ses, spin_lock(&cifs_tcp_ses_lock); if (server->tcpStatus == CifsInSessSetup) server->tcpStatus = CifsGood; + /* Even if one channel is active, session is in good state */ + if (ses->status == CifsInSessSetup) + ses->status = CifsGood; spin_unlock(&cifs_tcp_ses_lock); + + spin_lock(&ses->chan_lock); + cifs_chan_clear_need_reconnect(ses, server); + spin_unlock(&ses->chan_lock); } return rc; @@ -4461,8 +4464,15 @@ out: if (rc) { spin_lock(&cifs_tcp_ses_lock); - tcon->tidStatus = CifsNeedTcon; + if (tcon->tidStatus == CifsInTcon) + tcon->tidStatus = CifsNeedTcon; + spin_unlock(&cifs_tcp_ses_lock); + } else { + spin_lock(&cifs_tcp_ses_lock); + if (tcon->tidStatus == CifsInTcon) + tcon->tidStatus = CifsGood; spin_unlock(&cifs_tcp_ses_lock); + tcon->need_reconnect = false; } return rc; @@ -4487,8 +4497,15 @@ int cifs_tree_connect(const unsigned int xid, struct cifs_tcon *tcon, const stru rc = ops->tree_connect(xid, tcon->ses, tcon->treeName, tcon, nlsc); if (rc) { spin_lock(&cifs_tcp_ses_lock); - tcon->tidStatus = CifsNeedTcon; + if (tcon->tidStatus == CifsInTcon) + tcon->tidStatus = CifsNeedTcon; spin_unlock(&cifs_tcp_ses_lock); + } else { + spin_lock(&cifs_tcp_ses_lock); + if (tcon->tidStatus == CifsInTcon) + tcon->tidStatus = CifsGood; + spin_unlock(&cifs_tcp_ses_lock); + tcon->need_reconnect = false; } return rc; |