struct mid_q_entry *mid_entry;
 
        spin_lock(&GlobalMid_Lock);
-       if (kthread_should_stop()) {
+       if (server->tcpStatus == CifsExiting) {
                /* the demux thread will exit normally
                next time through the loop */
                spin_unlock(&GlobalMid_Lock);
        spin_unlock(&GlobalMid_Lock);
        up(&server->tcpSem);
 
-       while ((!kthread_should_stop()) && (server->tcpStatus != CifsGood)) {
+       while ((server->tcpStatus != CifsExiting) &&
+              (server->tcpStatus != CifsGood)) {
                try_to_freeze();
                if (server->protocolType == IPV6) {
                        rc = ipv6_connect(&server->addr.sockAddr6,
                } else {
                        atomic_inc(&tcpSesReconnectCount);
                        spin_lock(&GlobalMid_Lock);
-                       if (!kthread_should_stop())
+                       if (server->tcpStatus != CifsExiting)
                                server->tcpStatus = CifsGood;
                        server->sequence_number = 0;
                        spin_unlock(&GlobalMid_Lock);
                                GFP_KERNEL);
 
        set_freezable();
-       while (!kthread_should_stop()) {
+       while (server->tcpStatus != CifsExiting) {
                if (try_to_freeze())
                        continue;
                if (bigbuf == NULL) {
                    kernel_recvmsg(csocket, &smb_msg,
                                &iov, 1, pdu_length, 0 /* BB other flags? */);
 
-               if (kthread_should_stop()) {
+               if (server->tcpStatus == CifsExiting) {
                        break;
                } else if (server->tcpStatus == CifsNeedReconnect) {
                        cFYI(1, ("Reconnect after server stopped responding"));
                     total_read += length) {
                        length = kernel_recvmsg(csocket, &smb_msg, &iov, 1,
                                                pdu_length - total_read, 0);
-                       if (kthread_should_stop() ||
+                       if ((server->tcpStatus == CifsExiting) ||
                            (length == -EINTR)) {
                                /* then will exit */
                                reconnect = 2;
        spin_unlock(&GlobalMid_Lock);
        wake_up_all(&server->response_q);
 
-       /* don't exit until kthread_stop is called */
-       set_current_state(TASK_UNINTERRUPTIBLE);
-       while (!kthread_should_stop()) {
-               schedule();
-               set_current_state(TASK_UNINTERRUPTIBLE);
-       }
-       set_current_state(TASK_RUNNING);
-
        /* check if we have blocked requests that need to free */
        /* Note that cifs_max_pending is normally 50, but
        can be set at module install time to as little as two */
                        spin_lock(&GlobalMid_Lock);
                        srvTcp->tcpStatus = CifsExiting;
                        spin_unlock(&GlobalMid_Lock);
-                       if (srvTcp->tsk) {
-                               /* If we could verify that kthread_stop would
-                                  always wake up processes blocked in
-                                  tcp in recv_mesg then we could remove the
-                                  send_sig call */
-                               force_sig(SIGKILL, srvTcp->tsk);
-                               kthread_stop(srvTcp->tsk);
-                       }
+                       force_sig(SIGKILL, srvTcp->tsk);
                }
                 /* If find_unc succeeded then rc == 0 so we can not end */
                if (tcon)  /* up accidently freeing someone elses tcon struct */
                                        /* if the socketUseCount is now zero */
                                        if ((temp_rc == -ESHUTDOWN) &&
                                            (pSesInfo->server) &&
-                                           (pSesInfo->server->tsk)) {
+                                           (pSesInfo->server->tsk))
                                                force_sig(SIGKILL,
                                                        pSesInfo->server->tsk);
-                                               kthread_stop(pSesInfo->server->tsk);
-                                       }
                                } else {
                                        cFYI(1, ("No session or bad tcon"));
                                        if ((pSesInfo->server) &&
                                            (pSesInfo->server->tsk)) {
+                                               spin_lock(&GlobalMid_Lock);
+                                               srvTcp->tcpStatus = CifsExiting;
+                                               spin_unlock(&GlobalMid_Lock);
                                                force_sig(SIGKILL,
                                                        pSesInfo->server->tsk);
-                                               kthread_stop(pSesInfo->server->tsk);
                                        }
                                }
                                sesInfoFree(pSesInfo);
                                return 0;
                        } else if (rc == -ESHUTDOWN) {
                                cFYI(1, ("Waking up socket by sending signal"));
-                               if (cifsd_task) {
+                               if (cifsd_task)
                                        force_sig(SIGKILL, cifsd_task);
-                                       kthread_stop(cifsd_task);
-                               }
                                rc = 0;
                        } /* else - we have an smb session
                                left on this socket do not kill cifsd */
                cERROR(1, ("Send error in SessSetup = %d", rc));
        } else {
                cFYI(1, ("CIFS Session Established successfully"));
+                       spin_lock(&GlobalMid_Lock);
                        pSesInfo->status = CifsGood;
+                       spin_unlock(&GlobalMid_Lock);
        }
 
 ss_err_exit: