proc/array.c: Use TASK_REPORT
[pandora-kernel.git] / fs / proc / array.c
index 27b59f5..5be663e 100644 (file)
@@ -77,6 +77,7 @@
 #include <linux/cpuset.h>
 #include <linux/rcupdate.h>
 #include <linux/delayacct.h>
+#include <linux/pid_namespace.h>
 
 #include <asm/pgtable.h>
 #include <asm/processor.h>
@@ -140,13 +141,7 @@ static const char *task_state_array[] = {
 
 static inline const char *get_task_state(struct task_struct *tsk)
 {
-       unsigned int state = (tsk->state & (TASK_RUNNING |
-                                           TASK_INTERRUPTIBLE |
-                                           TASK_UNINTERRUPTIBLE |
-                                           TASK_STOPPED |
-                                           TASK_TRACED)) |
-                       (tsk->exit_state & (EXIT_ZOMBIE |
-                                           EXIT_DEAD));
+       unsigned int state = (tsk->state & TASK_REPORT) | tsk->exit_state;
        const char **p = &task_state_array[0];
 
        while (state) {
@@ -161,8 +156,15 @@ static inline char *task_state(struct task_struct *p, char *buffer)
        struct group_info *group_info;
        int g;
        struct fdtable *fdt = NULL;
+       struct pid_namespace *ns;
+       pid_t ppid, tpid;
 
+       ns = current->nsproxy->pid_ns;
        rcu_read_lock();
+       ppid = pid_alive(p) ?
+               task_tgid_nr_ns(rcu_dereference(p->real_parent), ns) : 0;
+       tpid = pid_alive(p) && p->ptrace ?
+               task_ppid_nr_ns(rcu_dereference(p->parent), ns) : 0;
        buffer += sprintf(buffer,
                "State:\t%s\n"
                "Tgid:\t%d\n"
@@ -172,9 +174,9 @@ static inline char *task_state(struct task_struct *p, char *buffer)
                "Uid:\t%d\t%d\t%d\t%d\n"
                "Gid:\t%d\t%d\t%d\t%d\n",
                get_task_state(p),
-               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),
+               ppid, tpid,
                p->uid, p->euid, p->suid, p->fsuid,
                p->gid, p->egid, p->sgid, p->fsgid);
 
@@ -351,7 +353,8 @@ static cputime_t task_utime(struct task_struct *p)
        }
        utime = (clock_t)temp;
 
-       return clock_t_to_cputime(utime);
+       p->prev_utime = max(p->prev_utime, clock_t_to_cputime(utime));
+       return p->prev_utime;
 }
 
 static cputime_t task_stime(struct task_struct *p)
@@ -366,7 +369,10 @@ static cputime_t task_stime(struct task_struct *p)
        stime = nsec_to_clock_t(p->se.sum_exec_runtime) -
                        cputime_to_clock_t(task_utime(p));
 
-       return clock_t_to_cputime(stime);
+       if (stime >= 0)
+               p->prev_stime = max(p->prev_stime, clock_t_to_cputime(stime));
+
+       return p->prev_stime;
 }
 #endif
 
@@ -394,6 +400,9 @@ static int do_task_stat(struct task_struct *task, char *buffer, int whole)
        unsigned long rsslim = 0;
        char tcomm[sizeof(task->comm)];
        unsigned long flags;
+       struct pid_namespace *ns;
+
+       ns = current->nsproxy->pid_ns;
 
        state = *get_task_state(task);
        vsize = eip = esp = 0;
@@ -416,7 +425,7 @@ static int do_task_stat(struct task_struct *task, char *buffer, int whole)
                struct signal_struct *sig = task->signal;
 
                if (sig->tty) {
-                       tty_pgrp = pid_nr(sig->tty->pgrp);
+                       tty_pgrp = pid_nr_ns(sig->tty->pgrp, ns);
                        tty_nr = new_encode_dev(tty_devnum(sig->tty));
                }
 
@@ -446,12 +455,12 @@ static int do_task_stat(struct task_struct *task, char *buffer, int whole)
                        maj_flt += sig->maj_flt;
                        utime = cputime_add(utime, sig->utime);
                        stime = cputime_add(stime, sig->stime);
-                       gtime += cputime_add(gtime, sig->gtime);
+                       gtime = cputime_add(gtime, sig->gtime);
                }
 
-               sid = signal_session(sig);
-               pgid = process_group(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);
        }
@@ -483,7 +492,7 @@ static int do_task_stat(struct task_struct *task, char *buffer, int whole)
        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 %lu %ld\n",
-               task->pid,
+               task_pid_nr_ns(task, ns),
                tcomm,
                state,
                ppid,