#include <linux/mempool.h>
 #include <linux/delay.h>
 #include <linux/completion.h>
+#include <linux/kthread.h>
 #include <linux/pagevec.h>
 #include <linux/freezer.h>
 #include <asm/uaccess.h>
        struct mid_q_entry * mid_entry;
        
        spin_lock(&GlobalMid_Lock);
-       if(server->tcpStatus == CifsExiting) {
+       if( kthread_should_stop() ) {
                /* the demux thread will exit normally 
                next time through the loop */
                spin_unlock(&GlobalMid_Lock);
        spin_unlock(&GlobalMid_Lock);
        up(&server->tcpSem); 
 
-       while ((server->tcpStatus != CifsExiting) && (server->tcpStatus != CifsGood))
+       while ( (!kthread_should_stop()) && (server->tcpStatus != CifsGood))
        {
                try_to_freeze();
                if(server->protocolType == IPV6) {
                } else {
                        atomic_inc(&tcpSesReconnectCount);
                        spin_lock(&GlobalMid_Lock);
-                       if(server->tcpStatus != CifsExiting)
+                       if( !kthread_should_stop() )
                                server->tcpStatus = CifsGood;
                        server->sequence_number = 0;
                        spin_unlock(&GlobalMid_Lock);                   
        int isMultiRsp;
        int reconnect;
 
-       daemonize("cifsd");
        allow_signal(SIGKILL);
        current->flags |= PF_MEMALLOC;
        server->tsk = current;  /* save process info to wake at shutdown */
                        GFP_KERNEL);
        }
 
-       while (server->tcpStatus != CifsExiting) {
+       while (!kthread_should_stop()) {
                if (try_to_freeze())
                        continue;
                if (bigbuf == NULL) {
                    kernel_recvmsg(csocket, &smb_msg,
                                 &iov, 1, 4, 0 /* BB see socket.h flags */);
 
-               if (server->tcpStatus == CifsExiting) {
+               if ( kthread_should_stop() ) {
                        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((server->tcpStatus == CifsExiting) ||
+                       if( kthread_should_stop() ||
                            (length == -EINTR)) {
                                /* then will exit */
                                reconnect = 2;
                        GFP_KERNEL);
        }
        
-       complete_and_exit(&cifsd_complete, 0);
        return 0;
 }
 
                        so no need to spinlock this init of tcpStatus */
                        srvTcp->tcpStatus = CifsNew;
                        init_MUTEX(&srvTcp->tcpSem);
-                       rc = (int)kernel_thread((void *)(void *)cifs_demultiplex_thread, srvTcp,
-                                     CLONE_FS | CLONE_FILES | CLONE_VM);
-                       if(rc < 0) {
-                               rc = -ENOMEM;
+                       srvTcp->tsk = kthread_run((void *)(void *)cifs_demultiplex_thread, srvTcp, "cifsd");
+                       if( IS_ERR(srvTcp->tsk) ) {
+                               rc = PTR_ERR(srvTcp->tsk);
+                               cERROR(1,("error %d create cifsd thread", rc));
+                               srvTcp->tsk = NULL;
                                sock_release(csocket);
                                kfree(volume_info.UNC);
                                kfree(volume_info.password);
                        spin_unlock(&GlobalMid_Lock);
                        if(srvTcp->tsk) {
                                send_sig(SIGKILL,srvTcp->tsk,1);
-                               wait_for_completion(&cifsd_complete);
+                               kthread_stop(srvTcp->tsk);
                        }
                }
                 /* If find_unc succeeded then rc == 0 so we can not end */
                                        temp_rc = CIFSSMBLogoff(xid, pSesInfo);
                                        /* if the socketUseCount is now zero */
                                        if((temp_rc == -ESHUTDOWN) &&
-                                          (pSesInfo->server->tsk)) {
+                                          (pSesInfo->server) && (pSesInfo->server->tsk)) {
                                                send_sig(SIGKILL,pSesInfo->server->tsk,1);
-                                               wait_for_completion(&cifsd_complete);
+                                               kthread_stop(pSesInfo->server->tsk);
                                        }
                                } else
                                        cFYI(1, ("No session or bad tcon"));
                                cFYI(1,("Waking up socket by sending it signal"));
                                if(cifsd_task) {
                                        send_sig(SIGKILL,cifsd_task,1);
-                                       wait_for_completion(&cifsd_complete);
+                                       kthread_stop(cifsd_task);
                                }
                                rc = 0;
                        } /* else - we have an smb session