aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSerge E. Hallyn <serue@us.ibm.com>2007-01-30 16:28:23 -0500
committerLinus Torvalds <torvalds@woody.linux-foundation.org>2007-01-30 16:40:36 -0500
commit0f2452855d86901ba3766826ccb5606ea4e15ab9 (patch)
treeb5a48b7bc49bbfdf97434e4f9cc83607d78eb0de
parent444f378b237a0f728f5c4aba752c08d13c209344 (diff)
[PATCH] namespaces: fix task exit disaster
This is based on a patch by Eric W. Biederman, who pointed out that pid namespaces are still fake, and we only have one ever active. So for the time being, we can modify any code which could access tsk->nsproxy->pid_ns during task exit to just use &init_pid_ns instead, and move the exit_task_namespaces call in do_exit() back above exit_notify(), so that an exiting nfs server has a valid tsk->sighand to work with. Long term, pulling pid_ns out of nsproxy might be the cleanest solution. Signed-off-by: Eric W. Biederman <ebiederm@xmission.com> [ Eric's patch fixed to take care of free_pid() too ] Signed-off-by: Serge E. Hallyn <serue@us.ibm.com> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
-rw-r--r--include/linux/pid_namespace.h2
-rw-r--r--kernel/exit.c2
-rw-r--r--kernel/pid.c2
3 files changed, 3 insertions, 3 deletions
diff --git a/include/linux/pid_namespace.h b/include/linux/pid_namespace.h
index d2a9d419f01f..2833806d42c6 100644
--- a/include/linux/pid_namespace.h
+++ b/include/linux/pid_namespace.h
@@ -39,7 +39,7 @@ static inline void put_pid_ns(struct pid_namespace *ns)
39 39
40static inline struct task_struct *child_reaper(struct task_struct *tsk) 40static inline struct task_struct *child_reaper(struct task_struct *tsk)
41{ 41{
42 return tsk->nsproxy->pid_ns->child_reaper; 42 return init_pid_ns.child_reaper;
43} 43}
44 44
45#endif /* _LINUX_PID_NS_H */ 45#endif /* _LINUX_PID_NS_H */
diff --git a/kernel/exit.c b/kernel/exit.c
index 35401720635b..fec12eb12471 100644
--- a/kernel/exit.c
+++ b/kernel/exit.c
@@ -938,8 +938,8 @@ fastcall NORET_TYPE void do_exit(long code)
938 938
939 tsk->exit_code = code; 939 tsk->exit_code = code;
940 proc_exit_connector(tsk); 940 proc_exit_connector(tsk);
941 exit_notify(tsk);
942 exit_task_namespaces(tsk); 941 exit_task_namespaces(tsk);
942 exit_notify(tsk);
943#ifdef CONFIG_NUMA 943#ifdef CONFIG_NUMA
944 mpol_free(tsk->mempolicy); 944 mpol_free(tsk->mempolicy);
945 tsk->mempolicy = NULL; 945 tsk->mempolicy = NULL;
diff --git a/kernel/pid.c b/kernel/pid.c
index 2efe9d8d367b..78f2aee90f54 100644
--- a/kernel/pid.c
+++ b/kernel/pid.c
@@ -197,7 +197,7 @@ fastcall void free_pid(struct pid *pid)
197 hlist_del_rcu(&pid->pid_chain); 197 hlist_del_rcu(&pid->pid_chain);
198 spin_unlock_irqrestore(&pidmap_lock, flags); 198 spin_unlock_irqrestore(&pidmap_lock, flags);
199 199
200 free_pidmap(current->nsproxy->pid_ns, pid->nr); 200 free_pidmap(&init_pid_ns, pid->nr);
201 call_rcu(&pid->rcu, delayed_put_pid); 201 call_rcu(&pid->rcu, delayed_put_pid);
202} 202}
203 203