diff --git a/kernel/exit.c b/kernel/exit.c index 29622e468b7f208ceb0481b5cc9a69e020adb0cf..9c6881a0a8b40b71301d74eeeba6aff78327a5a5 100644 --- a/kernel/exit.c +++ b/kernel/exit.c @@ -1576,27 +1576,22 @@ static long do_wait(struct wait_opts *wo) * might later match our criteria, even if we are not able to reap * it yet. */ - retval = wo->notask_error = -ECHILD; + wo->notask_error = -ECHILD; if ((wo->wo_type < PIDTYPE_MAX) && (!wo->wo_pid || hlist_empty(&wo->wo_pid->tasks[wo->wo_type]))) - goto end; + goto notask; current->state = TASK_INTERRUPTIBLE; read_lock(&tasklist_lock); tsk = current; do { - int tsk_result = do_wait_thread(wo, tsk); - - if (!tsk_result) - tsk_result = ptrace_do_wait(wo, tsk); + retval = do_wait_thread(wo, tsk); + if (retval) + goto end; - if (tsk_result) { - /* - * tasklist_lock is unlocked and we have a final result. - */ - retval = tsk_result; + retval = ptrace_do_wait(wo, tsk); + if (retval) goto end; - } if (wo->wo_flags & __WNOTHREAD) break; @@ -1605,6 +1600,7 @@ static long do_wait(struct wait_opts *wo) } while (tsk != current); read_unlock(&tasklist_lock); +notask: retval = wo->notask_error; if (!retval && !(wo->wo_flags & WNOHANG)) { retval = -ERESTARTSYS;