@@ -467,9 +467,12 @@ reconnect_dfs_server(struct TCP_Server_Info *server,
467467 dfs_cache_free_tgts (& tl );
468468
469469 /* Need to set up echo worker again once connection has been established */
470+ spin_lock (& cifs_tcp_ses_lock );
470471 if (server -> tcpStatus == CifsNeedNegotiate )
471472 mod_delayed_work (cifsiod_wq , & server -> echo , 0 );
472473
474+ spin_unlock (& cifs_tcp_ses_lock );
475+
473476 wake_up (& server -> response_q );
474477 return rc ;
475478}
@@ -571,15 +574,18 @@ server_unresponsive(struct TCP_Server_Info *server)
571574 * 65s kernel_recvmsg times out, and we see that we haven't gotten
572575 * a response in >60s.
573576 */
577+ spin_lock (& cifs_tcp_ses_lock );
574578 if ((server -> tcpStatus == CifsGood ||
575579 server -> tcpStatus == CifsNeedNegotiate ) &&
576580 (!server -> ops -> can_echo || server -> ops -> can_echo (server )) &&
577581 time_after (jiffies , server -> lstrp + 3 * server -> echo_interval )) {
582+ spin_unlock (& cifs_tcp_ses_lock );
578583 cifs_server_dbg (VFS , "has not responded in %lu seconds. Reconnecting...\n" ,
579584 (3 * server -> echo_interval ) / HZ );
580585 cifs_reconnect (server , false);
581586 return true;
582587 }
588+ spin_unlock (& cifs_tcp_ses_lock );
583589
584590 return false;
585591}
@@ -624,13 +630,18 @@ cifs_readv_from_socket(struct TCP_Server_Info *server, struct msghdr *smb_msg)
624630 else
625631 length = sock_recvmsg (server -> ssocket , smb_msg , 0 );
626632
627- if (server -> tcpStatus == CifsExiting )
633+ spin_lock (& cifs_tcp_ses_lock );
634+ if (server -> tcpStatus == CifsExiting ) {
635+ spin_unlock (& cifs_tcp_ses_lock );
628636 return - ESHUTDOWN ;
637+ }
629638
630639 if (server -> tcpStatus == CifsNeedReconnect ) {
640+ spin_unlock (& cifs_tcp_ses_lock );
631641 cifs_reconnect (server , false);
632642 return - ECONNABORTED ;
633643 }
644+ spin_unlock (& cifs_tcp_ses_lock );
634645
635646 if (length == - ERESTARTSYS ||
636647 length == - EAGAIN ||
@@ -808,9 +819,9 @@ static void clean_demultiplex_info(struct TCP_Server_Info *server)
808819 cancel_delayed_work_sync (& server -> echo );
809820 cancel_delayed_work_sync (& server -> resolve );
810821
811- spin_lock (& GlobalMid_Lock );
822+ spin_lock (& cifs_tcp_ses_lock );
812823 server -> tcpStatus = CifsExiting ;
813- spin_unlock (& GlobalMid_Lock );
824+ spin_unlock (& cifs_tcp_ses_lock );
814825 wake_up_all (& server -> response_q );
815826
816827 /* check if we have blocked requests that need to free */
@@ -1427,9 +1438,9 @@ cifs_put_tcp_session(struct TCP_Server_Info *server, int from_reconnect)
14271438 else
14281439 cancel_delayed_work_sync (& server -> reconnect );
14291440
1430- spin_lock (& GlobalMid_Lock );
1441+ spin_lock (& cifs_tcp_ses_lock );
14311442 server -> tcpStatus = CifsExiting ;
1432- spin_unlock (& GlobalMid_Lock );
1443+ spin_unlock (& cifs_tcp_ses_lock );
14331444
14341445 cifs_crypto_secmech_release (server );
14351446
@@ -1582,7 +1593,9 @@ cifs_get_tcp_session(struct smb3_fs_context *ctx,
15821593 * to the struct since the kernel thread not created yet
15831594 * no need to spinlock this update of tcpStatus
15841595 */
1596+ spin_lock (& cifs_tcp_ses_lock );
15851597 tcp_ses -> tcpStatus = CifsNeedNegotiate ;
1598+ spin_unlock (& cifs_tcp_ses_lock );
15861599
15871600 if ((ctx -> max_credits < 20 ) || (ctx -> max_credits > 60000 ))
15881601 tcp_ses -> max_credits = SMB2_MAX_CREDITS_AVAILABLE ;
@@ -1799,15 +1812,13 @@ void cifs_put_smb_ses(struct cifs_ses *ses)
17991812 spin_unlock (& cifs_tcp_ses_lock );
18001813 return ;
18011814 }
1802- spin_unlock (& cifs_tcp_ses_lock );
18031815
18041816 /* ses_count can never go negative */
18051817 WARN_ON (ses -> ses_count < 0 );
18061818
1807- spin_lock (& GlobalMid_Lock );
18081819 if (ses -> status == CifsGood )
18091820 ses -> status = CifsExiting ;
1810- spin_unlock (& GlobalMid_Lock );
1821+ spin_unlock (& cifs_tcp_ses_lock );
18111822
18121823 cifs_free_ipc (ses );
18131824
@@ -3075,12 +3086,15 @@ static int mount_get_conns(struct mount_ctx *mnt_ctx)
30753086 * for just this mount.
30763087 */
30773088 reset_cifs_unix_caps (xid , tcon , cifs_sb , ctx );
3089+ spin_lock (& cifs_tcp_ses_lock );
30783090 if ((tcon -> ses -> server -> tcpStatus == CifsNeedReconnect ) &&
30793091 (le64_to_cpu (tcon -> fsUnixInfo .Capability ) &
30803092 CIFS_UNIX_TRANSPORT_ENCRYPTION_MANDATORY_CAP )) {
3093+ spin_unlock (& cifs_tcp_ses_lock );
30813094 rc = - EACCES ;
30823095 goto out ;
30833096 }
3097+ spin_unlock (& cifs_tcp_ses_lock );
30843098 } else
30853099 tcon -> unix_ext = 0 ; /* server does not support them */
30863100
@@ -3755,7 +3769,9 @@ CIFSTCon(const unsigned int xid, struct cifs_ses *ses,
37553769 if (rc == 0 ) {
37563770 bool is_unicode ;
37573771
3772+ spin_lock (& cifs_tcp_ses_lock );
37583773 tcon -> tidStatus = CifsGood ;
3774+ spin_unlock (& cifs_tcp_ses_lock );
37593775 tcon -> need_reconnect = false;
37603776 tcon -> tid = smb_buffer_response -> Tid ;
37613777 bcc_ptr = pByteArea (smb_buffer_response );
@@ -3859,12 +3875,12 @@ cifs_negotiate_protocol(const unsigned int xid, struct cifs_ses *ses,
38593875
38603876 rc = server -> ops -> negotiate (xid , ses , server );
38613877 if (rc == 0 ) {
3862- spin_lock (& GlobalMid_Lock );
3878+ spin_lock (& cifs_tcp_ses_lock );
38633879 if (server -> tcpStatus == CifsNeedNegotiate )
38643880 server -> tcpStatus = CifsGood ;
38653881 else
38663882 rc = - EHOSTDOWN ;
3867- spin_unlock (& GlobalMid_Lock );
3883+ spin_unlock (& cifs_tcp_ses_lock );
38683884 }
38693885
38703886 return rc ;
0 commit comments