* reconnect the same SMB session
         */
        mutex_lock(&ses->session_mutex);
+
+       /*
+        * Recheck after acquire mutex. If another thread is negotiating
+        * and the server never sends an answer the socket will be closed
+        * and tcpStatus set to reconnect.
+        */
+       if (server->tcpStatus == CifsNeedReconnect) {
+               rc = -EHOSTDOWN;
+               mutex_unlock(&ses->session_mutex);
+               goto out;
+       }
+
        rc = cifs_negotiate_protocol(0, ses);
        if (rc == 0 && ses->need_reconnect)
                rc = cifs_setup_session(0, ses, nls_codepage);
 
         * 65s kernel_recvmsg times out, and we see that we haven't gotten
         *     a response in >60s.
         */
-       if (server->tcpStatus == CifsGood &&
+       if ((server->tcpStatus == CifsGood ||
+           server->tcpStatus == CifsNeedNegotiate) &&
            time_after(jiffies, server->lstrp + 2 * server->echo_interval)) {
                cifs_dbg(VFS, "Server %s has not responded in %lu seconds. Reconnecting...\n",
                         server->hostname, (2 * server->echo_interval) / HZ);
 
         * the same SMB session
         */
        mutex_lock(&tcon->ses->session_mutex);
+
+       /*
+        * Recheck after acquire mutex. If another thread is negotiating
+        * and the server never sends an answer the socket will be closed
+        * and tcpStatus set to reconnect.
+        */
+       if (server->tcpStatus == CifsNeedReconnect) {
+               rc = -EHOSTDOWN;
+               mutex_unlock(&tcon->ses->session_mutex);
+               goto out;
+       }
+
        rc = cifs_negotiate_protocol(0, tcon->ses);
        if (!rc && tcon->ses->need_reconnect)
                rc = cifs_setup_session(0, tcon->ses, nls_codepage);