[PATCH] remove add_parent()'s parent argument
[pandora-kernel.git] / kernel / exit.c
index 8037405..df26c33 100644 (file)
@@ -31,6 +31,8 @@
 #include <linux/signal.h>
 #include <linux/cn_proc.h>
 #include <linux/mutex.h>
+#include <linux/futex.h>
+#include <linux/compat.h>
 
 #include <asm/uaccess.h>
 #include <asm/unistd.h>
@@ -536,13 +538,13 @@ static void exit_mm(struct task_struct * tsk)
        mmput(mm);
 }
 
-static inline void choose_new_parent(task_t *p, task_t *reaper, task_t *child_reaper)
+static inline void choose_new_parent(task_t *p, task_t *reaper)
 {
        /*
         * Make sure we're not reparenting to ourselves and that
         * the parent is not a zombie.
         */
-       BUG_ON(p == reaper || reaper->exit_state >= EXIT_ZOMBIE);
+       BUG_ON(p == reaper || reaper->exit_state);
        p->real_parent = reaper;
 }
 
@@ -643,7 +645,7 @@ static void forget_original_parent(struct task_struct * father,
 
                if (father == p->real_parent) {
                        /* reparent with a reaper, real father it's us */
-                       choose_new_parent(p, reaper, child_reaper);
+                       choose_new_parent(p, reaper);
                        reparent_thread(p, father, 0);
                } else {
                        /* reparent ptraced task to its real parent */
@@ -664,7 +666,7 @@ static void forget_original_parent(struct task_struct * father,
        }
        list_for_each_safe(_p, _n, &father->ptrace_children) {
                p = list_entry(_p,struct task_struct,ptrace_list);
-               choose_new_parent(p, reaper, child_reaper);
+               choose_new_parent(p, reaper);
                reparent_thread(p, father, 1);
        }
 }
@@ -805,7 +807,7 @@ fastcall NORET_TYPE void do_exit(long code)
                panic("Aiee, killing interrupt handler!");
        if (unlikely(!tsk->pid))
                panic("Attempted to kill the idle task!");
-       if (unlikely(tsk->pid == 1))
+       if (unlikely(tsk == child_reaper))
                panic("Attempted to kill init!");
 
        if (unlikely(current->ptrace & PT_TRACE_EXIT)) {
@@ -852,6 +854,12 @@ fastcall NORET_TYPE void do_exit(long code)
                exit_itimers(tsk->signal);
                acct_process(code);
        }
+       if (unlikely(tsk->robust_list))
+               exit_robust_list(tsk);
+#ifdef CONFIG_COMPAT
+       if (unlikely(tsk->compat_robust_list))
+               compat_exit_robust_list(tsk);
+#endif
        exit_mm(tsk);
 
        exit_sem(tsk);
@@ -1273,7 +1281,7 @@ bail_ref:
 
        /* move to end of parent's list to avoid starvation */
        remove_parent(p);
-       add_parent(p, p->parent);
+       add_parent(p);
 
        write_unlock_irq(&tasklist_lock);