]> www.pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - fs/cifs/connect.c
[CIFS] eliminate usage of kthread_stop for cifsd
[linux-2.6-omap-h63xx.git] / fs / cifs / connect.c
index 17ca8ce81bb78de0e14cc91259b2c4bb3ac0f02b..1126f7ab4606083635546ba8f485b7ae7940615b 100644 (file)
@@ -125,7 +125,7 @@ cifs_reconnect(struct TCP_Server_Info *server)
        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);
@@ -185,7 +185,8 @@ cifs_reconnect(struct TCP_Server_Info *server)
        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,
@@ -202,7 +203,7 @@ cifs_reconnect(struct TCP_Server_Info *server)
                } 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);
@@ -357,7 +358,7 @@ cifs_demultiplex_thread(struct TCP_Server_Info *server)
                                GFP_KERNEL);
 
        set_freezable();
-       while (!kthread_should_stop()) {
+       while (server->tcpStatus != CifsExiting) {
                if (try_to_freeze())
                        continue;
                if (bigbuf == NULL) {
@@ -398,7 +399,7 @@ incomplete_rcv:
                    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"));
@@ -523,7 +524,7 @@ incomplete_rcv:
                     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;
@@ -652,14 +653,6 @@ multi_t2_fnd:
        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 */
@@ -2234,14 +2227,7 @@ cifs_mount(struct super_block *sb, struct cifs_sb_info *cifs_sb,
                        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 */
@@ -2255,18 +2241,18 @@ cifs_mount(struct super_block *sb, struct cifs_sb_info *cifs_sb,
                                        /* 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);
@@ -3577,10 +3563,8 @@ cifs_umount(struct super_block *sb, struct cifs_sb_info *cifs_sb)
                                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 */
@@ -3710,7 +3694,9 @@ int cifs_setup_session(unsigned int xid, struct cifsSesInfo *pSesInfo,
                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: