diff options
| author | Eric W. Biederman <ebiederm@xmission.com> | 2013-03-26 05:27:11 -0400 |
|---|---|---|
| committer | Eric W. Biederman <ebiederm@xmission.com> | 2013-03-26 06:41:23 -0400 |
| commit | 751c644b95bb48aaa8825f0c66abbcc184d92051 (patch) | |
| tree | ac5fa98b0281b5c8db1ac5859d15ac5c2b22e5f4 /kernel | |
| parent | 92f28d973cce45ef5823209aab3138eb45d8b349 (diff) | |
pid: Handle the exit of a multi-threaded init.
When a multi-threaded init exits and the initial thread is not the
last thread to exit the initial thread hangs around as a zombie
until the last thread exits. In that case zap_pid_ns_processes
needs to wait until there are only 2 hashed pids in the pid
namespace not one.
v2. Replace thread_pid_vnr(me) == 1 with the test thread_group_leader(me)
as suggested by Oleg.
Cc: stable@vger.kernel.org
Cc: Oleg Nesterov <oleg@redhat.com>
Reported-by: Caj Larsson <caj@omnicloud.com>
Signed-off-by: "Eric W. Biederman" <ebiederm@xmission.com>
Diffstat (limited to 'kernel')
| -rw-r--r-- | kernel/pid_namespace.c | 3 |
1 files changed, 2 insertions, 1 deletions
diff --git a/kernel/pid_namespace.c b/kernel/pid_namespace.c index c1c3dc1c6023..bea15bdf82b0 100644 --- a/kernel/pid_namespace.c +++ b/kernel/pid_namespace.c | |||
| @@ -181,6 +181,7 @@ void zap_pid_ns_processes(struct pid_namespace *pid_ns) | |||
| 181 | int nr; | 181 | int nr; |
| 182 | int rc; | 182 | int rc; |
| 183 | struct task_struct *task, *me = current; | 183 | struct task_struct *task, *me = current; |
| 184 | int init_pids = thread_group_leader(me) ? 1 : 2; | ||
| 184 | 185 | ||
| 185 | /* Don't allow any more processes into the pid namespace */ | 186 | /* Don't allow any more processes into the pid namespace */ |
| 186 | disable_pid_allocation(pid_ns); | 187 | disable_pid_allocation(pid_ns); |
| @@ -230,7 +231,7 @@ void zap_pid_ns_processes(struct pid_namespace *pid_ns) | |||
| 230 | */ | 231 | */ |
| 231 | for (;;) { | 232 | for (;;) { |
| 232 | set_current_state(TASK_UNINTERRUPTIBLE); | 233 | set_current_state(TASK_UNINTERRUPTIBLE); |
| 233 | if (pid_ns->nr_hashed == 1) | 234 | if (pid_ns->nr_hashed == init_pids) |
| 234 | break; | 235 | break; |
| 235 | schedule(); | 236 | schedule(); |
| 236 | } | 237 | } |
