[<prev] [next>] [<thread-prev] [day] [month] [year] [list]
Message-ID: <46112763.9070205@us.ibm.com>
Date: Mon, 02 Apr 2007 10:55:15 -0500
From: "Steve French (smfltc)" <smfltc@...ibm.com>
To: Wilhelm Meier <wilhelm.meier@...kl.de>
CC: linux-cifs-client@...ts.samba.org,
linux-kernel <linux-kernel@...r.kernel.org>
Subject: Re: cifs and kthread_run / kernel_thread
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 majordomo@...r.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
Powered by blists - more mailing lists