diff options
Diffstat (limited to 'fs/cifs')
-rw-r--r-- | fs/cifs/connect.c | 28 |
1 files changed, 14 insertions, 14 deletions
diff --git a/fs/cifs/connect.c b/fs/cifs/connect.c index 965050867599..f428bf3bf1a9 100644 --- a/fs/cifs/connect.c +++ b/fs/cifs/connect.c | |||
@@ -348,7 +348,6 @@ cifs_demultiplex_thread(struct TCP_Server_Info *server) | |||
348 | int reconnect; | 348 | int reconnect; |
349 | 349 | ||
350 | current->flags |= PF_MEMALLOC; | 350 | current->flags |= PF_MEMALLOC; |
351 | server->tsk = current; /* save process info to wake at shutdown */ | ||
352 | cFYI(1, ("Demultiplex PID: %d", task_pid_nr(current))); | 351 | cFYI(1, ("Demultiplex PID: %d", task_pid_nr(current))); |
353 | write_lock(&GlobalSMBSeslock); | 352 | write_lock(&GlobalSMBSeslock); |
354 | atomic_inc(&tcpSesAllocCount); | 353 | atomic_inc(&tcpSesAllocCount); |
@@ -651,10 +650,20 @@ multi_t2_fnd: | |||
651 | 650 | ||
652 | spin_lock(&GlobalMid_Lock); | 651 | spin_lock(&GlobalMid_Lock); |
653 | server->tcpStatus = CifsExiting; | 652 | server->tcpStatus = CifsExiting; |
654 | server->tsk = NULL; | 653 | spin_unlock(&GlobalMid_Lock); |
654 | |||
655 | /* don't exit until kthread_stop is called */ | ||
656 | set_current_state(TASK_UNINTERRUPTIBLE); | ||
657 | while (!kthread_should_stop()) { | ||
658 | schedule(); | ||
659 | set_current_state(TASK_UNINTERRUPTIBLE); | ||
660 | } | ||
661 | set_current_state(TASK_RUNNING); | ||
662 | |||
655 | /* check if we have blocked requests that need to free */ | 663 | /* check if we have blocked requests that need to free */ |
656 | /* Note that cifs_max_pending is normally 50, but | 664 | /* Note that cifs_max_pending is normally 50, but |
657 | can be set at module install time to as little as two */ | 665 | can be set at module install time to as little as two */ |
666 | spin_lock(&GlobalMid_Lock); | ||
658 | if (atomic_read(&server->inFlight) >= cifs_max_pending) | 667 | if (atomic_read(&server->inFlight) >= cifs_max_pending) |
659 | atomic_set(&server->inFlight, cifs_max_pending - 1); | 668 | atomic_set(&server->inFlight, cifs_max_pending - 1); |
660 | /* We do not want to set the max_pending too low or we | 669 | /* We do not want to set the max_pending too low or we |
@@ -2187,15 +2196,12 @@ cifs_mount(struct super_block *sb, struct cifs_sb_info *cifs_sb, | |||
2187 | srvTcp->tcpStatus = CifsExiting; | 2196 | srvTcp->tcpStatus = CifsExiting; |
2188 | spin_unlock(&GlobalMid_Lock); | 2197 | spin_unlock(&GlobalMid_Lock); |
2189 | if (srvTcp->tsk) { | 2198 | if (srvTcp->tsk) { |
2190 | struct task_struct *tsk; | ||
2191 | /* If we could verify that kthread_stop would | 2199 | /* If we could verify that kthread_stop would |
2192 | always wake up processes blocked in | 2200 | always wake up processes blocked in |
2193 | tcp in recv_mesg then we could remove the | 2201 | tcp in recv_mesg then we could remove the |
2194 | send_sig call */ | 2202 | send_sig call */ |
2195 | force_sig(SIGKILL, srvTcp->tsk); | 2203 | force_sig(SIGKILL, srvTcp->tsk); |
2196 | tsk = srvTcp->tsk; | 2204 | kthread_stop(srvTcp->tsk); |
2197 | if (tsk) | ||
2198 | kthread_stop(tsk); | ||
2199 | } | 2205 | } |
2200 | } | 2206 | } |
2201 | /* If find_unc succeeded then rc == 0 so we can not end */ | 2207 | /* If find_unc succeeded then rc == 0 so we can not end */ |
@@ -2211,23 +2217,17 @@ cifs_mount(struct super_block *sb, struct cifs_sb_info *cifs_sb, | |||
2211 | if ((temp_rc == -ESHUTDOWN) && | 2217 | if ((temp_rc == -ESHUTDOWN) && |
2212 | (pSesInfo->server) && | 2218 | (pSesInfo->server) && |
2213 | (pSesInfo->server->tsk)) { | 2219 | (pSesInfo->server->tsk)) { |
2214 | struct task_struct *tsk; | ||
2215 | force_sig(SIGKILL, | 2220 | force_sig(SIGKILL, |
2216 | pSesInfo->server->tsk); | 2221 | pSesInfo->server->tsk); |
2217 | tsk = pSesInfo->server->tsk; | 2222 | kthread_stop(pSesInfo->server->tsk); |
2218 | if (tsk) | ||
2219 | kthread_stop(tsk); | ||
2220 | } | 2223 | } |
2221 | } else { | 2224 | } else { |
2222 | cFYI(1, ("No session or bad tcon")); | 2225 | cFYI(1, ("No session or bad tcon")); |
2223 | if ((pSesInfo->server) && | 2226 | if ((pSesInfo->server) && |
2224 | (pSesInfo->server->tsk)) { | 2227 | (pSesInfo->server->tsk)) { |
2225 | struct task_struct *tsk; | ||
2226 | force_sig(SIGKILL, | 2228 | force_sig(SIGKILL, |
2227 | pSesInfo->server->tsk); | 2229 | pSesInfo->server->tsk); |
2228 | tsk = pSesInfo->server->tsk; | 2230 | kthread_stop(pSesInfo->server->tsk); |
2229 | if (tsk) | ||
2230 | kthread_stop(tsk); | ||
2231 | } | 2231 | } |
2232 | } | 2232 | } |
2233 | sesInfoFree(pSesInfo); | 2233 | sesInfoFree(pSesInfo); |