• Oleg Nesterov's avatar
    handle the multi-threaded init's exit() properly · 84eb646b
    Oleg Nesterov authored
    With or without this patch, multi-threaded init's are not fully supported,
    but do_exit() is completely wrong.  This becomes a real problem when we
    support pid namespaces.
    
    1. do_exit() panics when the main thread of /sbin/init exits. It should not
       until the whole thread group exits. Move the code below, under the
       "if (group_dead)" check.
    
       Note: this means that forget_original_parent() can use an already dead
       child_reaper()'s task_struct. This is OK for /sbin/init because
    
       	- do_wait() from alive sub-thread still can reap a zombie, we iterate
       	  over all sub-thread's ->children lists
    
       	- do_notify_parent() will wakeup some alive sub-thread because it sends
       	  the group-wide signal
    
       However, we should remove choose_new_parent()->BUG_ON(reaper->exit_state)
       for this.
    
    2. We are playing games with ->nsproxy->pid_ns. This code is bogus today, and
       it has to be changed anyway when we really support pid namespaces, just
       remove it.
    Signed-off-by: default avatarOleg Nesterov <oleg@tv-sign.ru>
    Roland McGrath <roland@redhat.com>
    Cc: "Eric W. Biederman" <ebiederm@xmission.com>
    Cc: Sukadev Bhattiprolu <sukadev@us.ibm.com>
    Cc: Serge Hallyn <serue@us.ibm.com>
    Cc: Cedric Le Goater <clg@fr.ibm.com>
    Cc: Ingo Molnar <mingo@elte.hu>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    84eb646b
exit.c 43.7 KB