Skip to content

Commit

Permalink
cifs: make status checks in version independent callers
Browse files Browse the repository at this point in the history
The status of tcp session, smb session and tcon have the
same flow, irrespective of the SMB version used. Hence
these status checks and updates should happen in the
version independent callers of these commands.

Signed-off-by: Shyam Prasad N <sprasad@microsoft.com>
Signed-off-by: Steve French <stfrench@microsoft.com>
  • Loading branch information
Shyam Prasad N authored and Steve French committed Jan 19, 2022
1 parent ece0767 commit c1604da
Show file tree
Hide file tree
Showing 3 changed files with 23 additions and 29 deletions.
29 changes: 23 additions & 6 deletions fs/cifs/connect.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -4461,8 +4464,15 @@ int cifs_tree_connect(const unsigned int xid, struct cifs_tcon *tcon, const stru

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;
Expand All @@ -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;
Expand Down
9 changes: 0 additions & 9 deletions fs/cifs/sess.c
Original file line number Diff line number Diff line change
Expand Up @@ -1052,15 +1052,6 @@ sess_establish_session(struct sess_data *sess_data)
mutex_unlock(&server->srv_mutex);

cifs_dbg(FYI, "CIFS session established successfully\n");
spin_lock(&ses->chan_lock);
cifs_chan_clear_need_reconnect(ses, server);
spin_unlock(&ses->chan_lock);

/* Even if one channel is active, session is in good state */
spin_lock(&cifs_tcp_ses_lock);
ses->status = CifsGood;
spin_unlock(&cifs_tcp_ses_lock);

return 0;
}

Expand Down
14 changes: 0 additions & 14 deletions fs/cifs/smb2pdu.c
Original file line number Diff line number Diff line change
Expand Up @@ -1386,16 +1386,6 @@ SMB2_sess_establish_session(struct SMB2_sess_data *sess_data)
mutex_unlock(&server->srv_mutex);

cifs_dbg(FYI, "SMB2/3 session established successfully\n");

spin_lock(&ses->chan_lock);
cifs_chan_clear_need_reconnect(ses, server);
spin_unlock(&ses->chan_lock);

/* Even if one channel is active, session is in good state */
spin_lock(&cifs_tcp_ses_lock);
ses->status = CifsGood;
spin_unlock(&cifs_tcp_ses_lock);

return rc;
}

Expand Down Expand Up @@ -1923,10 +1913,6 @@ SMB2_tcon(const unsigned int xid, struct cifs_ses *ses, const char *tree,
tcon->share_flags = le32_to_cpu(rsp->ShareFlags);
tcon->capabilities = rsp->Capabilities; /* we keep caps little endian */
tcon->maximal_access = le32_to_cpu(rsp->MaximalAccess);
spin_lock(&cifs_tcp_ses_lock);
tcon->tidStatus = CifsGood;
spin_unlock(&cifs_tcp_ses_lock);
tcon->need_reconnect = false;
tcon->tid = le32_to_cpu(rsp->hdr.Id.SyncId.TreeId);
strlcpy(tcon->treeName, tree, sizeof(tcon->treeName));

Expand Down

0 comments on commit c1604da

Please sign in to comment.