diff -NurpP --minimal linux-2.6.8.1-vs1.9.2.x7/fs/proc/base.c linux-2.6.8.1-vs1.9.2.x9/fs/proc/base.c --- linux-2.6.8.1-vs1.9.2.x7/fs/proc/base.c 2004-08-25 18:49:35.000000000 +0200 +++ linux-2.6.8.1-vs1.9.2.x9/fs/proc/base.c 2004-08-31 02:40:41.000000000 +0200 @@ -798,7 +798,7 @@ static int proc_readfd(struct file * fil if (!pid_alive(p)) goto out; retval = 0; - tid = p->pid; + tid = vx_map_tgid(current->vx_info, p->pid); fd = filp->f_pos; switch (fd) { @@ -864,7 +864,7 @@ static int proc_pident_readdir(struct fi goto out; ret = 0; - pid = proc_task(inode)->pid; + pid = vx_map_tgid(current->vx_info, proc_task(inode)->pid); i = filp->f_pos; switch (i) { case 0: @@ -947,7 +947,7 @@ static struct inode *proc_pid_make_inode ei = PROC_I(inode); ei->task = NULL; inode->i_mtime = inode->i_atime = inode->i_ctime = CURRENT_TIME; - inode->i_ino = fake_ino(task->pid, ino); + inode->i_ino = fake_ino(vx_map_tgid(current->vx_info, task->pid), ino); if (!pid_alive(task)) goto out_unlock; @@ -1588,21 +1588,20 @@ struct dentry *proc_pid_lookup(struct in goto out; read_lock(&tasklist_lock); - task = find_task_by_pid(tgid); + task = find_task_by_pid(vx_map_tgid(current->vx_info, tgid)); if (task) get_task_struct(task); read_unlock(&tasklist_lock); if (!task) goto out; - inode = NULL; - if (vx_check(vx_task_xid(task), VX_WATCH|VX_IDENT)) - inode = proc_pid_make_inode(dir->i_sb, task, PROC_TGID_INO); + if (!vx_check(vx_task_xid(task), VX_WATCH|VX_IDENT)) + goto out_drop_task; + + inode = proc_pid_make_inode(dir->i_sb, task, PROC_TGID_INO); + if (!inode) + goto out_drop_task; - if (!inode) { - put_task_struct(task); - goto out; - } inode->i_mode = S_IFDIR|S_IRUGO|S_IXUGO; inode->i_op = &proc_tgid_base_inode_operations; inode->i_fop = &proc_tgid_base_operations; @@ -1627,6 +1626,8 @@ struct dentry *proc_pid_lookup(struct in goto out; } return NULL; +out_drop_task: + put_task_struct(task); out: return ERR_PTR(-ENOENT); } @@ -1643,10 +1644,8 @@ static struct dentry *proc_task_lookup(s if (tid == ~0U) goto out; -/* handle fakeinit */ - read_lock(&tasklist_lock); - task = find_task_by_pid(tid); + task = find_task_by_pid(vx_map_tgid(current->vx_info, tid)); if (task) get_task_struct(task); read_unlock(&tasklist_lock); @@ -1655,12 +1654,13 @@ static struct dentry *proc_task_lookup(s if (leader->tgid != task->tgid) goto out_drop_task; - inode = NULL; - if (vx_check(vx_task_xid(task), VX_WATCH|VX_IDENT)) - inode = proc_pid_make_inode(dir->i_sb, task, PROC_TID_INO); + if (!vx_check(vx_task_xid(task), VX_WATCH|VX_IDENT)) + goto out_drop_task; + inode = proc_pid_make_inode(dir->i_sb, task, PROC_TID_INO); if (!inode) goto out_drop_task; + inode->i_mode = S_IFDIR|S_IRUGO|S_IXUGO; inode->i_op = &proc_tid_base_inode_operations; inode->i_fop = &proc_tid_base_operations; diff -NurpP --minimal linux-2.6.8.1-vs1.9.2.x7/include/linux/vs_base.h linux-2.6.8.1-vs1.9.2.x9/include/linux/vs_base.h --- linux-2.6.8.1-vs1.9.2.x7/include/linux/vs_base.h 2004-08-25 18:49:35.000000000 +0200 +++ linux-2.6.8.1-vs1.9.2.x9/include/linux/vs_base.h 2004-08-31 01:05:43.000000000 +0200 @@ -66,4 +66,10 @@ static __inline__ int __vx_check(xid_t c #define vx_mask_mask(v,f,m) (((v) & ~(m)) | ((v) & (f) & (m))) + +#define vx_current_initpid(n) \ + (vx_flags(VXF_INFO_INIT, 0) && \ + (current->vx_info->vx_initpid == (n))) + + #endif diff -NurpP --minimal linux-2.6.8.1-vs1.9.2.x7/include/linux/vs_cvirt.h linux-2.6.8.1-vs1.9.2.x9/include/linux/vs_cvirt.h --- linux-2.6.8.1-vs1.9.2.x7/include/linux/vs_cvirt.h 2004-08-25 18:49:35.000000000 +0200 +++ linux-2.6.8.1-vs1.9.2.x9/include/linux/vs_cvirt.h 2004-08-31 01:40:42.000000000 +0200 @@ -53,6 +53,8 @@ static inline int __vx_rmap_tgid(struct file, line); if ((pid == 1) && vxi->vx_initpid) return vxi->vx_initpid; + if (pid == vxi->vx_initpid) + return ~0U; } return pid; }