summaryrefslogtreecommitdiffstats
path: root/kernel/exit.c
diff options
context:
space:
mode:
authorOleg Nesterov <oleg@redhat.com>2011-07-07 21:33:54 +0200
committerOleg Nesterov <oleg@redhat.com>2011-07-17 20:23:50 +0200
commit961c4675c75112717705fa5c0c53cb9664051479 (patch)
treed424199346b5dc1c5d27fe920a66a6ea11989d89 /kernel/exit.c
parentbb188d7e64deb0e9cf13a99f44ae0065de5352d6 (diff)
downloadlinux-stable-961c4675c75112717705fa5c0c53cb9664051479.tar.gz
linux-stable-961c4675c75112717705fa5c0c53cb9664051479.tar.bz2
linux-stable-961c4675c75112717705fa5c0c53cb9664051479.zip
has_stopped_jobs: s/task_is_stopped/SIGNAL_STOP_STOPPED/
has_stopped_jobs() naively checks task_is_stopped(group_leader). This was always wrong even without ptrace, group_leader can be dead. And given that ptrace can change the state to TRACED this is wrong even in the single-threaded case. Change the code to check SIGNAL_STOP_STOPPED and simplify the code, retval + break/continue doesn't make this trivial code more readable. We could probably add the usual "|| signal->group_stop_count" check but I don't think this makes sense, the task can start the group-stop right after the check anyway. Signed-off-by: Oleg Nesterov <oleg@redhat.com> Acked-by: Tejun Heo <tj@kernel.org>
Diffstat (limited to 'kernel/exit.c')
-rw-r--r--kernel/exit.c12
1 files changed, 5 insertions, 7 deletions
diff --git a/kernel/exit.c b/kernel/exit.c
index b8d3b47bb881..6c7fbbe7d86f 100644
--- a/kernel/exit.c
+++ b/kernel/exit.c
@@ -266,18 +266,16 @@ int is_current_pgrp_orphaned(void)
return retval;
}
-static int has_stopped_jobs(struct pid *pgrp)
+static bool has_stopped_jobs(struct pid *pgrp)
{
- int retval = 0;
struct task_struct *p;
do_each_pid_task(pgrp, PIDTYPE_PGID, p) {
- if (!task_is_stopped(p))
- continue;
- retval = 1;
- break;
+ if (p->signal->flags & SIGNAL_STOP_STOPPED)
+ return true;
} while_each_pid_task(pgrp, PIDTYPE_PGID, p);
- return retval;
+
+ return false;
}
/*