diff -NurpP --minimal linux-3.2.21-vs2.3.2.11/kernel/exit.c linux-3.2.21-vs2.3.2.12/kernel/exit.c --- linux-3.2.21-vs2.3.2.11/kernel/exit.c 2012-05-15 18:16:52.000000000 +0200 +++ linux-3.2.21-vs2.3.2.12/kernel/exit.c 2012-06-27 04:33:23.000000000 +0200 @@ -993,6 +993,9 @@ NORET_TYPE void do_exit(long code) */ ptrace_put_breakpoints(tsk); + /* needs to stay before exit_notify() */ + exit_vx_info_early(tsk, code); + exit_notify(tsk, group_dead); #ifdef CONFIG_NUMA task_lock(tsk); diff -NurpP --minimal linux-3.2.21-vs2.3.2.11/kernel/vserver/context.c linux-3.2.21-vs2.3.2.12/kernel/vserver/context.c --- linux-3.2.21-vs2.3.2.11/kernel/vserver/context.c 2011-12-05 19:33:02.000000000 +0100 +++ linux-3.2.21-vs2.3.2.12/kernel/vserver/context.c 2012-06-27 05:01:29.000000000 +0200 @@ -669,6 +669,7 @@ out: int vx_set_reaper(struct vx_info *vxi, struct task_struct *p) { struct task_struct *old_reaper; + struct vx_info *reaper_vxi; if (!vxi) return -EINVAL; @@ -681,10 +682,21 @@ int vx_set_reaper(struct vx_info *vxi, s if (old_reaper == p) return 0; + reaper_vxi = task_get_vx_info(p); + if (reaper_vxi && reaper_vxi != vxi) { + vxwprintk(1, + "Unsuitable reaper [" VS_Q("%s") ",%u:#%u] " + "for [xid #%u]", + p->comm, p->pid, p->xid, vx_current_xid()); + goto out; + } + /* set new child reaper */ get_task_struct(p); vxi->vx_reaper = p; put_task_struct(old_reaper); +out: + put_vx_info(reaper_vxi); return 0; }