This is the proc-related part of the previous patch.
Since tasks are seen from two proc-s the appropriate
(virtual or global) pid must be shown.

Signed-off-by: Pavel Emelianov <[EMAIL PROTECTED]>

---

diff --git a/fs/proc/array.c b/fs/proc/array.c
index aef7b7b..f65e4c9 100644
--- a/fs/proc/array.c
+++ b/fs/proc/array.c
@@ -75,6 +75,7 @@
 #include <linux/cpuset.h>
 #include <linux/rcupdate.h>
 #include <linux/delayacct.h>
+#include <linux/pid_namespace.h>
 
 #include <asm/uaccess.h>
 #include <asm/pgtable.h>
@@ -161,7 +162,9 @@ static inline char * task_state(struct t
        struct group_info *group_info;
        int g;
        struct fdtable *fdt = NULL;
+       struct pid_namespace *ns;
 
+       ns = current->nsproxy->pid_ns;
        rcu_read_lock();
        buffer += sprintf(buffer,
                "State:\t%s\n"
@@ -174,9 +177,12 @@ static inline char * task_state(struct t
                "Gid:\t%d\t%d\t%d\t%d\n",
                get_task_state(p),
                (p->sleep_avg/1024)*100/(1020000000/1024),
-               p->tgid, p->pid,
-               pid_alive(p) ? rcu_dereference(p->real_parent)->tgid : 0,
-               pid_alive(p) && p->ptrace ? rcu_dereference(p->parent)->pid : 0,
+               __task_tgid_nr_ns(p, ns),
+               __task_pid_nr_ns(p, ns),
+               pid_alive(p) ? task_ppid_nr_ns(p, ns) : 0,
+               pid_alive(p) && p->ptrace ?
+                       __task_tgid_nr_ns(
+                               rcu_dereference(p->parent), ns) : 0,
                p->uid, p->euid, p->suid, p->fsuid,
                p->gid, p->egid, p->sgid, p->fsgid);
 
@@ -349,6 +355,7 @@ static int do_task_stat(struct task_stru
        rcu_read_lock();
        if (lock_task_sighand(task, &flags)) {
                struct signal_struct *sig = task->signal;
+               struct pid_namespace *ns = current->nsproxy->pid_ns;
 
                if (sig->tty) {
                        tty_pgrp = pid_nr(sig->tty->pgrp);
@@ -381,9 +388,9 @@ static int do_task_stat(struct task_stru
                        stime = cputime_add(stime, sig->stime);
                }
 
-               sid = task_session_nr(task);
-               pgid = task_pgrp_nr(task);
-               ppid = rcu_dereference(task->real_parent)->tgid;
+               sid = __task_session_nr_ns(task, ns);
+               pgid = __task_pgrp_nr_ns(task, ns);
+               ppid = task_ppid_nr_ns(task, ns);
 
                unlock_task_sighand(task, &flags);
        }
@@ -414,7 +421,7 @@ static int do_task_stat(struct task_stru
        res = sprintf(buffer,"%d (%s) %c %d %d %d %d %d %u %lu \
 %lu %lu %lu %lu %lu %ld %ld %ld %ld %d 0 %llu %lu %ld %lu %lu %lu %lu %lu \
 %lu %lu %lu %lu %lu %lu %lu %lu %d %d %u %u %llu\n",
-               task->pid,
+               task_pid_nr_ns(task),
                tcomm,
                state,
                ppid,
diff --git a/fs/proc/base.c b/fs/proc/base.c
index 8b426e9..e9811ec 100644
--- a/fs/proc/base.c
+++ b/fs/proc/base.c
@@ -73,6 +73,7 @@
 #include <linux/poll.h>
 #include <linux/nsproxy.h>
 #include <linux/oom.h>
+#include <linux/pid_namespace.h>
 #include "internal.h"
 
 /* NOTE:
@@ -1755,14 +1756,14 @@ static int proc_self_readlink(struct den
                              int buflen)
 {
        char tmp[PROC_NUMBUF];
-       sprintf(tmp, "%d", current->tgid);
+       sprintf(tmp, "%d", task_tgid_vnr(current));
        return vfs_readlink(dentry,buffer,buflen,tmp);
 }
 
 static void *proc_self_follow_link(struct dentry *dentry, struct nameidata *nd)
 {
        char tmp[PROC_NUMBUF];
-       sprintf(tmp, "%d", current->tgid);
+       sprintf(tmp, "%d", task_tgid_vnr(current));
        return ERR_PTR(vfs_follow_link(nd,tmp));
 }
 

_______________________________________________
Devel mailing list
Devel@openvz.org
https://openvz.org/mailman/listinfo/devel

Reply via email to