]> git.ipfire.org Git - people/ms/linux.git/commitdiff
cifs: make status checks in version independent callers
authorShyam Prasad N <sprasad@microsoft.com>
Sun, 16 Jan 2022 13:38:14 +0000 (13:38 +0000)
committerSteve French <stfrench@microsoft.com>
Wed, 19 Jan 2022 17:10:55 +0000 (11:10 -0600)
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>
fs/cifs/connect.c
fs/cifs/sess.c
fs/cifs/smb2pdu.c

index 6740a7c39df391820144c078818d6114effb720f..0a35503b7b461a9255a1ab66ee30692895a99994 100644 (file)
@@ -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;
index f7de57f6f04750c09bf14e700df4e70ef0e60df7..97fba1f28e4b096c3c4a2b74cc9a811bb4d3839b 100644 (file)
@@ -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;
 }
 
index 202ddbafe939dc0cf6d047e784a6bf8b33a0bcfe..1e670e56b07adcb82117ad75ff1f7035696bf303 100644 (file)
@@ -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;
 }
 
@@ -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));