diff -NurpP --minimal linux-2.6.16-rc5-vs2.0.2-rc10.2/include/linux/vserver/signal.h linux-2.6.16-rc5-vs2.0.2-rc10.x/include/linux/vserver/signal.h --- linux-2.6.16-rc5-vs2.0.2-rc10.2/include/linux/vserver/signal.h 1970-01-01 01:00:00 +0100 +++ linux-2.6.16-rc5-vs2.0.2-rc10.x/include/linux/vserver/signal.h 2006-03-10 23:00:30 +0100 @@ -0,0 +1,14 @@ +#ifndef _VX_SIGNAL_H +#define _VX_SIGNAL_H + + +#ifdef __KERNEL__ + +struct vx_info; + +int vx_info_kill(struct vx_info *, int, int); + +#endif /* __KERNEL__ */ +#else /* _VX_SIGNAL_H */ +#warning duplicate inclusion +#endif /* _VX_SIGNAL_H */ diff -NurpP --minimal linux-2.6.16-rc5-vs2.0.2-rc10.2/kernel/vserver/signal.c linux-2.6.16-rc5-vs2.0.2-rc10.x/kernel/vserver/signal.c --- linux-2.6.16-rc5-vs2.0.2-rc10.2/kernel/vserver/signal.c 2006-02-17 22:18:51 +0100 +++ linux-2.6.16-rc5-vs2.0.2-rc10.x/kernel/vserver/signal.c 2006-03-10 22:11:58 +0100 @@ -18,37 +18,29 @@ #include -int vc_ctx_kill(uint32_t id, void __user *data) +int vx_info_kill(struct vx_info *vxi, int pid, int sig) { int retval, count=0; - struct vcmd_ctx_kill_v0 vc_data; struct task_struct *p; - struct vx_info *vxi; unsigned long priv = 0; - if (!vx_check(0, VX_ADMIN)) - return -ENOSYS; - if (copy_from_user (&vc_data, data, sizeof(vc_data))) - return -EFAULT; - - vxi = locate_vx_info(id); - if (!vxi) - return -ESRCH; - retval = -ESRCH; + vxdprintk(VXD_CBIT(misc, 4), + "vx_info_kill(%p[#%d],%d,%d)*", + vxi, vxi->vx_id, pid, sig); read_lock(&tasklist_lock); - switch (vc_data.pid) { + switch (pid) { case 0: priv = 1; case -1: for_each_process(p) { int err = 0; - if (vx_task_xid(p) != id || p->pid <= 1 || - (vc_data.pid && vxi->vx_initpid == p->pid)) + if (vx_task_xid(p) != vxi->vx_id || p->pid <= 1 || + (pid && vxi->vx_initpid == p->pid)) continue; - err = group_send_sig_info(vc_data.sig, (void*)priv, p); + err = group_send_sig_info(sig, (void*)priv, p); ++count; if (err != -EPERM) retval = err; @@ -57,20 +49,42 @@ int vc_ctx_kill(uint32_t id, void __user case 1: if (vxi->vx_initpid) { - vc_data.pid = vxi->vx_initpid; + pid = vxi->vx_initpid; priv = 1; } /* fallthrough */ default: - p = find_task_by_real_pid(vc_data.pid); + p = find_task_by_real_pid(pid); if (p) { - if ((id == -1) || (vx_task_xid(p) == id)) - retval = group_send_sig_info(vc_data.sig, + if (vx_task_xid(p) == vxi->vx_id) + retval = group_send_sig_info(sig, (void*)priv, p); } break; } read_unlock(&tasklist_lock); + vxdprintk(VXD_CBIT(misc, 4), + "vx_info_kill(%p[#%d],%d,%d) = %d", + vxi, vxi->vx_id, pid, sig, retval); + return retval; +} + +int vc_ctx_kill(uint32_t id, void __user *data) +{ + int retval; + struct vcmd_ctx_kill_v0 vc_data; + struct vx_info *vxi; + + if (!vx_check(0, VX_ADMIN)) + return -ENOSYS; + if (copy_from_user (&vc_data, data, sizeof(vc_data))) + return -EFAULT; + + vxi = lookup_vx_info(id); + if (!vxi) + return -ESRCH; + + retval = vx_info_kill(vxi, vc_data.pid, vc_data.sig); put_vx_info(vxi); return retval; }