diff -NurpP --minimal linux-2.6.11.6-vs1.9.5.6/include/linux/sched.h linux-2.6.11.6-vs1.9.5.8/include/linux/sched.h --- linux-2.6.11.6-vs1.9.5.6/include/linux/sched.h 2005-04-01 01:31:57 +0200 +++ linux-2.6.11.6-vs1.9.5.8/include/linux/sched.h 2005-04-04 03:18:52 +0200 @@ -843,8 +843,10 @@ extern struct mm_struct init_mm; vx_rmap_pid(nr)) extern struct task_struct *find_task_by_pid_type(int type, int pid); -extern void set_special_pids(pid_t session, pid_t pgrp); -extern void __set_special_pids(pid_t session, pid_t pgrp); +extern void set_special_task_pids(struct task_struct *task, + pid_t session, pid_t pgrp); +extern void __set_special_task_pids(struct task_struct *task, + pid_t session, pid_t pgrp); /* per-UID process charging. */ extern struct user_struct * alloc_uid(xid_t, uid_t); diff -NurpP --minimal linux-2.6.11.6-vs1.9.5.6/include/linux/vs_context.h linux-2.6.11.6-vs1.9.5.8/include/linux/vs_context.h --- linux-2.6.11.6-vs1.9.5.6/include/linux/vs_context.h 2005-04-02 08:22:00 +0200 +++ linux-2.6.11.6-vs1.9.5.8/include/linux/vs_context.h 2005-04-03 23:51:13 +0200 @@ -47,14 +47,16 @@ static inline void __put_vx_info(struct static inline void __init_vx_info(struct vx_info **vxp, struct vx_info *vxi, const char *_file, int _line) { - vxlprintk(VXD_CBIT(xid, 3), "init_vx_info(%p[#%d.%d])", - vxi, vxi?vxi->vx_id:0, - vxi?atomic_read(&vxi->vx_usecnt):0, - _file, _line); - vxh_init_vx_info(vxi, vxp); + if (vxi) { + vxlprintk(VXD_CBIT(xid, 3), + "init_vx_info(%p[#%d.%d])", + vxi, vxi?vxi->vx_id:0, + vxi?atomic_read(&vxi->vx_usecnt):0, + _file, _line); + vxh_init_vx_info(vxi, vxp); - if (vxi) atomic_inc(&vxi->vx_usecnt); + } *vxp = vxi; } diff -NurpP --minimal linux-2.6.11.6-vs1.9.5.6/include/linux/vs_cvirt.h linux-2.6.11.6-vs1.9.5.8/include/linux/vs_cvirt.h --- linux-2.6.11.6-vs1.9.5.6/include/linux/vs_cvirt.h 2005-04-01 01:31:57 +0200 +++ linux-2.6.11.6-vs1.9.5.8/include/linux/vs_cvirt.h 2005-04-04 05:31:00 +0200 @@ -62,6 +62,7 @@ static inline int __vx_info_rmap_pid(str return vxi->vx_initpid; if (pid == vxi->vx_initpid) return ~0U; + // return 0U; } return pid; } diff -NurpP --minimal linux-2.6.11.6-vs1.9.5.6/kernel/exit.c linux-2.6.11.6-vs1.9.5.8/kernel/exit.c --- linux-2.6.11.6-vs1.9.5.6/kernel/exit.c 2005-04-01 01:31:57 +0200 +++ linux-2.6.11.6-vs1.9.5.8/kernel/exit.c 2005-04-04 02:58:59 +0200 @@ -255,26 +255,26 @@ void reparent_to_init(void) switch_uid(INIT_USER); } -void __set_special_pids(pid_t session, pid_t pgrp) +void __set_special_task_pids(struct task_struct *task, + pid_t session, pid_t pgrp) { - struct task_struct *curr = current; - - if (curr->signal->session != session) { - detach_pid(curr, PIDTYPE_SID); - curr->signal->session = session; - attach_pid(curr, PIDTYPE_SID, session); + if (task->signal->session != session) { + detach_pid(task, PIDTYPE_SID); + task->signal->session = session; + attach_pid(task, PIDTYPE_SID, session); } - if (process_group(curr) != pgrp) { - detach_pid(curr, PIDTYPE_PGID); - curr->signal->pgrp = pgrp; - attach_pid(curr, PIDTYPE_PGID, pgrp); + if (process_group(task) != pgrp) { + detach_pid(task, PIDTYPE_PGID); + task->signal->pgrp = pgrp; + attach_pid(task, PIDTYPE_PGID, pgrp); } } -void set_special_pids(pid_t session, pid_t pgrp) +void set_special_task_pids(struct task_struct *task, + pid_t session, pid_t pgrp) { write_lock_irq(&tasklist_lock); - __set_special_pids(session, pgrp); + __set_special_task_pids(task, session, pgrp); write_unlock_irq(&tasklist_lock); } @@ -340,7 +340,7 @@ void daemonize(const char *name, ...) */ exit_mm(current); - set_special_pids(1, 1); + set_special_task_pids(current, 1, 1); down(&tty_sem); current->signal->tty = NULL; up(&tty_sem); diff -NurpP --minimal linux-2.6.11.6-vs1.9.5.6/kernel/pid.c linux-2.6.11.6-vs1.9.5.8/kernel/pid.c --- linux-2.6.11.6-vs1.9.5.6/kernel/pid.c 2005-03-02 12:39:08 +0100 +++ linux-2.6.11.6-vs1.9.5.8/kernel/pid.c 2005-04-04 05:09:55 +0200 @@ -26,6 +26,7 @@ #include #include #include +#include #define pid_hashfn(nr) hash_long((unsigned long)nr, pidhash_shift) static struct hlist_head *pid_hash[PIDTYPE_MAX]; diff -NurpP --minimal linux-2.6.11.6-vs1.9.5.6/kernel/sys.c linux-2.6.11.6-vs1.9.5.8/kernel/sys.c --- linux-2.6.11.6-vs1.9.5.6/kernel/sys.c 2005-04-01 01:31:57 +0200 +++ linux-2.6.11.6-vs1.9.5.8/kernel/sys.c 2005-04-04 05:14:16 +0200 @@ -1094,11 +1094,11 @@ asmlinkage long sys_setsid(void) write_lock_irq(&tasklist_lock); pid = find_pid(PIDTYPE_PGID, current->pid); - if (pid) + if (pid || vx_current_initpid(current->pid)) goto out; current->signal->leader = 1; - __set_special_pids(current->pid, current->pid); + __set_special_task_pids(current, current->pid, current->pid); current->signal->tty = NULL; current->signal->tty_old_pgrp = 0; err = process_group(current); diff -NurpP --minimal linux-2.6.11.6-vs1.9.5.6/kernel/vserver/context.c linux-2.6.11.6-vs1.9.5.8/kernel/vserver/context.c --- linux-2.6.11.6-vs1.9.5.6/kernel/vserver/context.c 2005-04-01 01:31:57 +0200 +++ linux-2.6.11.6-vs1.9.5.8/kernel/vserver/context.c 2005-04-04 02:59:39 +0200 @@ -590,6 +590,7 @@ int vx_set_init(struct vx_info *vxi, str vxi, vxi->vx_id, p, p->xid, p->pid, p->tgid); vxi->vx_initpid = p->tgid; + set_special_task_pids(p, 0, 0); return 0; }