Wilhelm Meier wrote:

m Montag, 2. April 2007 schrieb Wilhelm Meier:
It seems to me that I rewrote cifs_demultiplex_thread to use kthread_run
in DFS patch.
o.k., I found the patch on the list. Will do some testing with it.

o.k., the patch seems to be fine for linux-vserver. cifs-mounting inside the guest is now possible.

Do you see any possiblility to include this part of Igors work (not the whole DFS thing) to the mainline? It fixes the use of the deprecated api.

-
Wilhelm
------------------------------------------------------------------------

Index: connect.c
===================================================================
--- connect.c   (.../2.6.19.1)  (revision 20)
+++ connect.c   (.../kthread_support)   (revision 20)
@@ -30,6 +30,7 @@
#include <linux/mempool.h>
#include <linux/delay.h>
#include <linux/completion.h>
+#include <linux/kthread.h>
#include <linux/pagevec.h>
#include <asm/uaccess.h>
#include <asm/processor.h>
@@ -119,7 +120,7 @@
        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);
@@ -181,7 +182,7 @@
        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) {
@@ -198,7 +199,7 @@
                } 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);                       
@@ -344,7 +345,6 @@
        int isMultiRsp;
        int reconnect;

-       daemonize("cifsd");
        allow_signal(SIGKILL);
        current->flags |= PF_MEMALLOC;
        server->tsk = current;       /* save process info to wake at shutdown */
@@ -360,7 +360,7 @@
                        GFP_KERNEL);
        }

-       while (server->tcpStatus != CifsExiting) {
+       while (!kthread_should_stop()) {
                if (try_to_freeze())
                        continue;
                if (bigbuf == NULL) {
@@ -399,7 +399,7 @@
                    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"));
@@ -523,7 +523,7 @@
                     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;
@@ -756,7 +756,6 @@
                        GFP_KERNEL);
        }
        
-       complete_and_exit(&cifsd_complete, 0);
        return 0;
}

@@ -1779,10 +1778,11 @@
                        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);
@@ -1973,7 +1973,7 @@
                        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 */
@@ -1987,9 +1987,9 @@
                                        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"));
@@ -3273,7 +3273,7 @@
                                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
Yes. I can merge this today in cifs-2.6 development tree after I try it out (and to 2.6.22 when it opens up
soon).

I also plan to merge a somewhat simpler change tothe inet_pton related change that Q made, since that can be pulled out to make the final dfs change smaller to finish review (but it requires an additional change to
fs/cifs/connect.c to recognize ipv6 connections)..
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to