From a7d320c6ac2f67d36019a8b97e43d6d1f4bd781e Mon Sep 17 00:00:00 2001 From: Vitaly Mayatskikh Date: Wed, 23 Sep 2009 15:56:51 -0700 Subject: [PATCH] --- yaml --- r: 165679 b: refs/heads/master c: dfe16dfa4ac178d9a10b489a73d535c6976e48d2 h: refs/heads/master i: 165677: 20434df54d73ea2dd53e78fd88ca31591dc8b440 165675: 6d581f6354a33d6d36f04ce0c2b9af15bab39f72 165671: 7256f45b0eb7cd6eb02f9f9ef9886b42bbc7d8c5 165663: 543aa28e6d3fd29845dcf5a4d870ba5a3620274e v: v3 --- [refs] | 2 +- trunk/kernel/exit.c | 49 +++++++++++++++++++++------------------------ 2 files changed, 24 insertions(+), 27 deletions(-) diff --git a/[refs] b/[refs] index 6ce950828e1a..72f717ab12e6 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: b6e763f07fba6243d2a553ed9a4f3e10a789932a +refs/heads/master: dfe16dfa4ac178d9a10b489a73d535c6976e48d2 diff --git a/trunk/kernel/exit.c b/trunk/kernel/exit.c index 1daa7f46bccd..2cc69eb8db2a 100644 --- a/trunk/kernel/exit.c +++ b/trunk/kernel/exit.c @@ -1645,32 +1645,6 @@ static long do_wait(struct wait_opts *wo) end: __set_current_state(TASK_RUNNING); remove_wait_queue(¤t->signal->wait_chldexit, &wo->child_wait); - - if (wo->wo_info) { - struct siginfo __user *infop = wo->wo_info; - - if (retval > 0) - retval = 0; - else { - /* - * For a WNOHANG return, clear out all the fields - * we would set so the user can easily tell the - * difference. - */ - if (!retval) - retval = put_user(0, &infop->si_signo); - if (!retval) - retval = put_user(0, &infop->si_errno); - if (!retval) - retval = put_user(0, &infop->si_code); - if (!retval) - retval = put_user(0, &infop->si_pid); - if (!retval) - retval = put_user(0, &infop->si_uid); - if (!retval) - retval = put_user(0, &infop->si_status); - } - } return retval; } @@ -1715,6 +1689,29 @@ SYSCALL_DEFINE5(waitid, int, which, pid_t, upid, struct siginfo __user *, wo.wo_stat = NULL; wo.wo_rusage = ru; ret = do_wait(&wo); + + if (ret > 0) { + ret = 0; + } else if (infop) { + /* + * For a WNOHANG return, clear out all the fields + * we would set so the user can easily tell the + * difference. + */ + if (!ret) + ret = put_user(0, &infop->si_signo); + if (!ret) + ret = put_user(0, &infop->si_errno); + if (!ret) + ret = put_user(0, &infop->si_code); + if (!ret) + ret = put_user(0, &infop->si_pid); + if (!ret) + ret = put_user(0, &infop->si_uid); + if (!ret) + ret = put_user(0, &infop->si_status); + } + put_pid(pid); /* avoid REGPARM breakage on x86: */