diff -NurpP --minimal linux-2.6.16-rc4-vs2.1.1-rc9.2/Documentation/vserver/debug.txt linux-2.6.16-rc4-vs2.1.1-rc9.3/Documentation/vserver/debug.txt --- linux-2.6.16-rc4-vs2.1.1-rc9.2/Documentation/vserver/debug.txt 2006-02-17 23:26:32 +0100 +++ linux-2.6.16-rc4-vs2.1.1-rc9.3/Documentation/vserver/debug.txt 2006-02-28 06:36:34 +0100 @@ -92,6 +92,8 @@ debug_xid: "task_get_vx_info(%p)" "vx_migrate_task(%p,%p[#%d.%d])" 6 40 "vx_set_init(%p[#%d],%p[#%d,%d,%d])" + "vx_exit_init(%p[#%d],%p[#%d,%d,%d])" + "vx_set_reaper(%p[#%d],%p[#%d,%d])" 7 80 "vx_parse_xid(»%s«): %d:#%d" "vx_propagate_xid(%p[#%lu.%d]): %d,%d" diff -NurpP --minimal linux-2.6.16-rc4-vs2.1.1-rc9.2/include/linux/vs_context.h linux-2.6.16-rc4-vs2.1.1-rc9.3/include/linux/vs_context.h --- linux-2.6.16-rc4-vs2.1.1-rc9.2/include/linux/vs_context.h 2006-02-27 16:45:55 +0100 +++ linux-2.6.16-rc4-vs2.1.1-rc9.3/include/linux/vs_context.h 2006-02-28 06:48:12 +0100 @@ -214,8 +214,25 @@ static inline void __leave_vx_admin(stru extern void exit_vx_info(struct task_struct *); -#define vx_child_reaper(p) \ - ((p->vx_info) ? p->vx_info->vx_reaper : child_reaper) +static inline +struct task_struct *vx_child_reaper(struct task_struct *p) +{ + struct vx_info *vxi = p->vx_info; + struct task_struct *reaper = child_reaper; + + if (!vxi) + goto out; + + BUG_ON(!p->vx_info->vx_reaper); + + /* child reaper for the guest reaper */ + if (vxi->vx_reaper == p) + goto out; + + reaper = vxi->vx_reaper; +out: + return reaper; +} #else diff -NurpP --minimal linux-2.6.16-rc4-vs2.1.1-rc9.2/kernel/vserver/context.c linux-2.6.16-rc4-vs2.1.1-rc9.3/kernel/vserver/context.c --- linux-2.6.16-rc4-vs2.1.1-rc9.2/kernel/vserver/context.c 2006-02-27 16:53:32 +0100 +++ linux-2.6.16-rc4-vs2.1.1-rc9.3/kernel/vserver/context.c 2006-02-28 06:40:19 +0100 @@ -681,6 +681,8 @@ out: int vx_set_reaper(struct vx_info *vxi, struct task_struct *p) { + struct task_struct *old_reaper; + if (!vxi) return -EINVAL; @@ -688,13 +690,14 @@ int vx_set_reaper(struct vx_info *vxi, s "vx_set_reaper(%p[#%d],%p[#%d,%d])", vxi, vxi->vx_id, p, p->xid, p->pid); - if (vxi->vx_reaper == p) + old_reaper = vxi->vx_reaper; + if (old_reaper == p) return 0; /* set new child reaper */ get_task_struct(p); - xchg(&vxi->vx_reaper, &p); - put_task_struct(p); + vxi->vx_reaper = p; + put_task_struct(old_reaper); return 0; } @@ -912,8 +915,10 @@ int vc_set_cflags(uint32_t id, void __us if (vxi == current->vx_info) { if (trigger & VXF_STATE_SETUP) vx_mask_bcaps(vxi, current); - if (trigger & VXF_STATE_INIT) + if (trigger & VXF_STATE_INIT) { vx_set_init(vxi, current); + vx_set_reaper(vxi, current); + } } vxi->vx_flags = vx_mask_flags(vxi->vx_flags,