aboutsummaryrefslogtreecommitdiffstats
path: root/kernel
diff options
context:
space:
mode:
authorPavel Emelyanov <xemul@openvz.org>2007-10-19 02:40:01 -0400
committerLinus Torvalds <torvalds@woody.linux-foundation.org>2007-10-19 14:53:38 -0400
commit2e4a707269a409950c3f315010c20f9719c594e2 (patch)
treed25109a6b36bdcb78382d379bdba4c4e83150389 /kernel
parent762a24beed3f3ab93224bd447710e6c36fcf1968 (diff)
pid namespaces: move exit_task_namespaces()
Make task release its namespaces after it has reparented all his children to child_reaper, but before it notifies its parent about its death. The reason to release namespaces after reparenting is that when task exits it may send a signal to its parent (SIGCHLD), but if the parent has already exited its namespaces there will be no way to decide what pid to dever to him - parent can be from different namespace. The reason to release namespace before notifying the parent it that when task sends a SIGCHLD to parent it can call wait() on this taks and release it. But releasing the mnt namespace implies dropping of all the mounts in the mnt namespace and NFS expects the task to have valid sighand pointer. Thanks to Oleg for pointing out some races that can apear and helping with patches and fixes. Signed-off-by: Pavel Emelyanov <xemul@openvz.org> Cc: Oleg Nesterov <oleg@tv-sign.ru> Cc: Sukadev Bhattiprolu <sukadev@us.ibm.com> Cc: Paul Menage <menage@google.com> Cc: "Eric W. Biederman" <ebiederm@xmission.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'kernel')
-rw-r--r--kernel/exit.c2
1 files changed, 1 insertions, 1 deletions
diff --git a/kernel/exit.c b/kernel/exit.c
index 3f2182ccf187..df2eee9c68ce 100644
--- a/kernel/exit.c
+++ b/kernel/exit.c
@@ -774,6 +774,7 @@ static void exit_notify(struct task_struct *tsk)
774 * jobs, send them a SIGHUP and then a SIGCONT. (POSIX 3.2.2.2) 774 * jobs, send them a SIGHUP and then a SIGCONT. (POSIX 3.2.2.2)
775 */ 775 */
776 forget_original_parent(tsk); 776 forget_original_parent(tsk);
777 exit_task_namespaces(tsk);
777 778
778 write_lock_irq(&tasklist_lock); 779 write_lock_irq(&tasklist_lock);
779 /* 780 /*
@@ -984,7 +985,6 @@ fastcall NORET_TYPE void do_exit(long code)
984 module_put(tsk->binfmt->module); 985 module_put(tsk->binfmt->module);
985 986
986 proc_exit_connector(tsk); 987 proc_exit_connector(tsk);
987 exit_task_namespaces(tsk);
988 exit_notify(tsk); 988 exit_notify(tsk);
989#ifdef CONFIG_NUMA 989#ifdef CONFIG_NUMA
990 mpol_free(tsk->mempolicy); 990 mpol_free(tsk->mempolicy);