diff -NurpP linux-2.6.16-vs2.1.1-rc14.7/include/linux/vs_context.h linux-2.6.16-vs2.1.1-rc14.8/include/linux/vs_context.h --- linux-2.6.16-vs2.1.1-rc14.7/include/linux/vs_context.h 2006-03-20 18:09:05 +0100 +++ linux-2.6.16-vs2.1.1-rc14.8/include/linux/vs_context.h 2006-03-27 17:39:08 +0200 @@ -211,7 +211,7 @@ static inline void __leave_vx_admin(stru current->xid = vxis->xid; } -extern void exit_vx_info(struct task_struct *); +extern void exit_vx_info(struct task_struct *, int); static inline diff -NurpP linux-2.6.16-vs2.1.1-rc14.7/include/linux/vserver/context.h linux-2.6.16-vs2.1.1-rc14.8/include/linux/vserver/context.h --- linux-2.6.16-vs2.1.1-rc14.7/include/linux/vserver/context.h 2006-03-25 04:49:17 +0100 +++ linux-2.6.16-vs2.1.1-rc14.8/include/linux/vserver/context.h 2006-04-01 18:27:05 +0200 @@ -120,8 +120,6 @@ struct vx_info { struct task_struct *vx_reaper; /* guest reaper process */ pid_t vx_initpid; /* PID of guest init */ - wait_queue_head_t vx_wait; /* context exit waitqueue */ - struct _vx_limit limit; /* vserver limits */ struct _vx_sched sched; /* vserver scheduler */ struct _vx_cvirt cvirt; /* virtual/bias stuff */ @@ -133,6 +131,10 @@ struct vx_info { struct _vx_info_pc *ptr_pc; /* per cpu array */ #endif + wait_queue_head_t vx_wait; /* context exit waitqueue */ + int reboot_cmd; /* last sys_reboot() cmd */ + int exit_code; /* last process exit code */ + char vx_name[65]; /* vserver name */ }; diff -NurpP linux-2.6.16-vs2.1.1-rc14.7/include/linux/vserver/signal_cmd.h linux-2.6.16-vs2.1.1-rc14.8/include/linux/vserver/signal_cmd.h --- linux-2.6.16-vs2.1.1-rc14.7/include/linux/vserver/signal_cmd.h 2006-03-20 17:34:50 +0100 +++ linux-2.6.16-vs2.1.1-rc14.8/include/linux/vserver/signal_cmd.h 2006-03-27 17:32:53 +0200 @@ -13,8 +13,8 @@ struct vcmd_ctx_kill_v0 { }; struct vcmd_wait_exit_v0 { - int32_t a; - int32_t b; + int32_t reboot_cmd; + int32_t exit_code; }; #ifdef __KERNEL__ diff -NurpP linux-2.6.16-vs2.1.1-rc14.7/kernel/exit.c linux-2.6.16-vs2.1.1-rc14.8/kernel/exit.c --- linux-2.6.16-vs2.1.1-rc14.7/kernel/exit.c 2006-03-20 18:09:05 +0100 +++ linux-2.6.16-vs2.1.1-rc14.8/kernel/exit.c 2006-03-27 17:28:08 +0200 @@ -869,7 +869,7 @@ fastcall NORET_TYPE void do_exit(long co __exit_files(tsk); __exit_fs(tsk); exit_namespace(tsk); - exit_vx_info(tsk); + exit_vx_info(tsk, code); exit_nx_info(tsk); exit_thread(); cpuset_exit(tsk); diff -NurpP linux-2.6.16-vs2.1.1-rc14.7/kernel/vserver/context.c linux-2.6.16-vs2.1.1-rc14.8/kernel/vserver/context.c --- linux-2.6.16-vs2.1.1-rc14.7/kernel/vserver/context.c 2006-03-24 16:57:24 +0100 +++ linux-2.6.16-vs2.1.1-rc14.8/kernel/vserver/context.c 2006-03-27 17:31:59 +0200 @@ -108,6 +108,9 @@ static struct vx_info *__alloc_vx_info(x new->vx_bcaps = CAP_INIT_EFF_SET; new->vx_ccaps = 0; + new->reboot_cmd = 0; + new->exit_code = 0; + vxdprintk(VXD_CBIT(xid, 0), "alloc_vx_info(%d) = %p", xid, new); vxh_alloc_vx_info(new); @@ -713,12 +716,13 @@ int vx_set_init(struct vx_info *vxi, str return 0; } -void vx_exit_init(struct vx_info *vxi, struct task_struct *p) +void vx_exit_init(struct vx_info *vxi, struct task_struct *p, int code) { vxdprintk(VXD_CBIT(xid, 6), "vx_exit_init(%p[#%d],%p[#%d,%d,%d])", vxi, vxi->vx_id, p, p->xid, p->pid, p->tgid); + vxi->exit_code = code; vxi->vx_initpid = 0; } @@ -739,7 +743,7 @@ void vx_set_persistent(struct vx_info *v /* task must be current or locked */ -void exit_vx_info(struct task_struct *p) +void exit_vx_info(struct task_struct *p, int code) { struct vx_info *vxi = p->vx_info; @@ -747,8 +751,9 @@ void exit_vx_info(struct task_struct *p) atomic_dec(&vxi->cvirt.nr_threads); vx_nproc_dec(p); + vxi->exit_code = code; if (vxi->vx_initpid == p->tgid) - vx_exit_init(vxi, p); + vx_exit_init(vxi, p, code); if (vxi->vx_reaper == p) vx_set_reaper(vxi, child_reaper); release_vx_info(vxi, p); diff -NurpP linux-2.6.16-vs2.1.1-rc14.7/kernel/vserver/signal.c linux-2.6.16-vs2.1.1-rc14.8/kernel/vserver/signal.c --- linux-2.6.16-vs2.1.1-rc14.7/kernel/vserver/signal.c 2006-03-24 17:01:28 +0100 +++ linux-2.6.16-vs2.1.1-rc14.8/kernel/vserver/signal.c 2006-03-27 17:32:22 +0200 @@ -97,7 +97,8 @@ static int __wait_exit(struct vx_info *v set_current_state(TASK_INTERRUPTIBLE); wait: - if (vx_info_state(vxi, VXS_SHUTDOWN|VXS_HASHED) == VXS_SHUTDOWN) + if (vx_info_state(vxi, + VXS_SHUTDOWN|VXS_HASHED|VXS_HELPER) == VXS_SHUTDOWN) goto out; if (signal_pending(current)) { ret = -ERESTARTSYS; @@ -117,6 +118,7 @@ out: int vc_wait_exit(uint32_t id, void __user *data) { struct vx_info *vxi; + struct vcmd_wait_exit_v0 vc_data; int ret; vxi = lookup_vx_info(id); @@ -124,7 +126,12 @@ int vc_wait_exit(uint32_t id, void __use return -ESRCH; ret = __wait_exit(vxi); + vc_data.reboot_cmd = vxi->reboot_cmd; + vc_data.exit_code = vxi->exit_code; put_vx_info(vxi); + + if (copy_to_user (data, &vc_data, sizeof(vc_data))) + ret = -EFAULT; return ret; }