cifs: take cifs_tcp_ses_lock for status checks
[linux-2.6-microblaze.git] / fs / cifs / smb2transport.c
index 112adf1..b70a49b 100644 (file)
@@ -634,8 +634,12 @@ smb2_sign_rqst(struct smb_rqst *rqst, struct TCP_Server_Info *server)
 
        if (!is_signed)
                return 0;
-       if (server->tcpStatus == CifsNeedNegotiate)
+       spin_lock(&cifs_tcp_ses_lock);
+       if (server->tcpStatus == CifsNeedNegotiate) {
+               spin_unlock(&cifs_tcp_ses_lock);
                return 0;
+       }
+       spin_unlock(&cifs_tcp_ses_lock);
        if (!is_binding && !server->session_estab) {
                strncpy(shdr->Signature, "BSRSPYL", 8);
                return 0;
@@ -751,30 +755,41 @@ static int
 smb2_get_mid_entry(struct cifs_ses *ses, struct TCP_Server_Info *server,
                   struct smb2_hdr *shdr, struct mid_q_entry **mid)
 {
-       if (server->tcpStatus == CifsExiting)
+       spin_lock(&cifs_tcp_ses_lock);
+       if (server->tcpStatus == CifsExiting) {
+               spin_unlock(&cifs_tcp_ses_lock);
                return -ENOENT;
+       }
 
        if (server->tcpStatus == CifsNeedReconnect) {
+               spin_unlock(&cifs_tcp_ses_lock);
                cifs_dbg(FYI, "tcp session dead - return to caller to retry\n");
                return -EAGAIN;
        }
 
        if (server->tcpStatus == CifsNeedNegotiate &&
-          shdr->Command != SMB2_NEGOTIATE)
+          shdr->Command != SMB2_NEGOTIATE) {
+               spin_unlock(&cifs_tcp_ses_lock);
                return -EAGAIN;
+       }
 
        if (ses->status == CifsNew) {
                if ((shdr->Command != SMB2_SESSION_SETUP) &&
-                   (shdr->Command != SMB2_NEGOTIATE))
+                   (shdr->Command != SMB2_NEGOTIATE)) {
+                       spin_unlock(&cifs_tcp_ses_lock);
                        return -EAGAIN;
+               }
                /* else ok - we are setting up session */
        }
 
        if (ses->status == CifsExiting) {
-               if (shdr->Command != SMB2_LOGOFF)
+               if (shdr->Command != SMB2_LOGOFF) {
+                       spin_unlock(&cifs_tcp_ses_lock);
                        return -EAGAIN;
+               }
                /* else ok - we are shutting down the session */
        }
+       spin_unlock(&cifs_tcp_ses_lock);
 
        *mid = smb2_mid_entry_alloc(shdr, server);
        if (*mid == NULL)
@@ -847,9 +862,13 @@ smb2_setup_async_request(struct TCP_Server_Info *server, struct smb_rqst *rqst)
                        (struct smb2_hdr *)rqst->rq_iov[0].iov_base;
        struct mid_q_entry *mid;
 
+       spin_lock(&cifs_tcp_ses_lock);
        if (server->tcpStatus == CifsNeedNegotiate &&
-          shdr->Command != SMB2_NEGOTIATE)
+          shdr->Command != SMB2_NEGOTIATE) {
+               spin_unlock(&cifs_tcp_ses_lock);
                return ERR_PTR(-EAGAIN);
+       }
+       spin_unlock(&cifs_tcp_ses_lock);
 
        smb2_seq_num_into_buf(server, shdr);