diff -NurpP linux-2.6.19.3-vs2.2.0-rc12/kernel/exit.c linux-2.6.19.3-vs2.2.0-rc12.1/kernel/exit.c --- linux-2.6.19.3-vs2.2.0-rc12/kernel/exit.c 2007-02-06 02:34:11 +0100 +++ linux-2.6.19.3-vs2.2.0-rc12.1/kernel/exit.c 2007-02-10 02:00:01 +0100 @@ -604,6 +604,15 @@ choose_new_parent(struct task_struct *p, "rogue reaper: %p[%d,#%u] <> %p[%d,#%u]", p, p->pid, p->xid, reaper, reaper->pid, reaper->xid); + if (p == reaper) { + struct task_struct *new = vx_child_reaper(p); + + printk("p=reaper: %p[%d,#%u] replaced with %p[%d,#%u]", + reaper, reaper->pid, reaper->xid, + new, new->pid, new->xid); + reaper = new; + } + /* * Make sure we're not reparenting to ourselves and that * the parent is not a zombie. @@ -717,7 +726,7 @@ forget_original_parent(struct task_struc if (father == p->real_parent) { /* reparent with a reaper, real father it's us */ - choose_new_parent(p, vx_child_reaper(p)); + choose_new_parent(p, reaper); reparent_thread(p, father, 0); } else { /* reparent ptraced task to its real parent */