Subject: Define/use task_active_pid_ns() wrapper

From: Sukadev Bhattiprolu <[EMAIL PROTECTED]>


A process is visible in one or more pid namespaces, as it is known by
some pid_t in every ancestor pid namespace.  Every time the process
forks, the child process also gets a pid_t in every ancestor pid
namespace.

While a process is visible in >=1 pid namespaces, it can see pid_t's
in only one pid namespace.  We call this pid namespace it's "active
pid namespace", and it is always the youngest pid namespace in which
the process is known.

This patch defines/uses a wrapper to find the active pid namespace of a
process. The implementation of the wrapper will be changed in subsequent
patches when support for multiple pid namespaces are added.

Changelog:
        2.6.21-rc6-mm1:
        - Rename task_pid_ns() to task_active_pid_ns() to reflect that
          a process can have multiple pid namespaces.

Signed-off-by: Sukadev Bhattiprolu <[EMAIL PROTECTED]>
---
 fs/exec.c                     |    2 +-
 fs/proc/proc_misc.c           |    3 ++-
 include/linux/pid_namespace.h |    7 ++++++-
 kernel/exit.c                 |    5 +++--
 kernel/pid.c                  |    4 ++--
 5 files changed, 14 insertions(+), 7 deletions(-)

Index: lx26-21-mm2/include/linux/pid_namespace.h
===================================================================
--- lx26-21-mm2.orig/include/linux/pid_namespace.h      2007-05-22 
16:59:29.000000000 -0700
+++ lx26-21-mm2/include/linux/pid_namespace.h   2007-05-22 17:49:52.000000000 
-0700
@@ -37,9 +37,14 @@ static inline void put_pid_ns(struct pid
        kref_put(&ns->kref, free_pid_ns);
 }
 
+static inline struct pid_namespace *task_active_pid_ns(struct task_struct *tsk)
+{
+       return tsk->nsproxy->pid_ns;
+}
+
 static inline struct task_struct *child_reaper(struct task_struct *tsk)
 {
-       return init_pid_ns.child_reaper;
+       return task_active_pid_ns(tsk)->child_reaper;
 }
 
 #endif /* _LINUX_PID_NS_H */
Index: lx26-21-mm2/fs/exec.c
===================================================================
--- lx26-21-mm2.orig/fs/exec.c  2007-05-22 16:59:29.000000000 -0700
+++ lx26-21-mm2/fs/exec.c       2007-05-22 17:49:52.000000000 -0700
@@ -629,7 +629,7 @@ static int de_thread(struct task_struct 
         * so it is safe to do it under read_lock.
         */
        if (unlikely(tsk->group_leader == child_reaper(tsk)))
-               tsk->nsproxy->pid_ns->child_reaper = tsk;
+               task_active_pid_ns(tsk)->child_reaper = tsk;
 
        zap_other_threads(tsk);
        read_unlock(&tasklist_lock);
Index: lx26-21-mm2/fs/proc/proc_misc.c
===================================================================
--- lx26-21-mm2.orig/fs/proc/proc_misc.c        2007-05-22 16:59:29.000000000 
-0700
+++ lx26-21-mm2/fs/proc/proc_misc.c     2007-05-22 16:59:34.000000000 -0700
@@ -94,7 +94,8 @@ static int loadavg_read_proc(char *page,
                LOAD_INT(a), LOAD_FRAC(a),
                LOAD_INT(b), LOAD_FRAC(b),
                LOAD_INT(c), LOAD_FRAC(c),
-               nr_running(), nr_threads, current->nsproxy->pid_ns->last_pid);
+               nr_running(), nr_threads,
+               task_active_pid_ns(current)->last_pid);
        return proc_calc_metrics(page, start, off, count, eof, len);
 }
 
Index: lx26-21-mm2/kernel/exit.c
===================================================================
--- lx26-21-mm2.orig/kernel/exit.c      2007-05-22 16:59:29.000000000 -0700
+++ lx26-21-mm2/kernel/exit.c   2007-05-22 17:49:52.000000000 -0700
@@ -876,8 +876,9 @@ fastcall NORET_TYPE void do_exit(long co
        if (unlikely(!tsk->pid))
                panic("Attempted to kill the idle task!");
        if (unlikely(tsk == child_reaper(tsk))) {
-               if (tsk->nsproxy->pid_ns != &init_pid_ns)
-                       tsk->nsproxy->pid_ns->child_reaper = 
init_pid_ns.child_reaper;
+               if (task_active_pid_ns(tsk) != &init_pid_ns)
+                       task_active_pid_ns(tsk)->child_reaper =
+                                       init_pid_ns.child_reaper;
                else
                        panic("Attempted to kill init!");
        }
Index: lx26-21-mm2/kernel/pid.c
===================================================================
--- lx26-21-mm2.orig/kernel/pid.c       2007-05-22 16:59:29.000000000 -0700
+++ lx26-21-mm2/kernel/pid.c    2007-05-22 17:49:52.000000000 -0700
@@ -213,7 +213,7 @@ struct pid *alloc_pid(void)
        if (!pid)
                goto out;
 
-       nr = alloc_pidmap(current->nsproxy->pid_ns);
+       nr = alloc_pidmap(task_active_pid_ns(current));
        if (nr < 0)
                goto out_free;
 
@@ -358,7 +358,7 @@ struct pid *find_ge_pid(int nr)
                pid = find_pid(nr);
                if (pid)
                        break;
-               nr = next_pidmap(current->nsproxy->pid_ns, nr);
+               nr = next_pidmap(task_active_pid_ns(current), nr);
        } while (nr > 0);
 
        return pid;
_______________________________________________
Containers mailing list
[EMAIL PROTECTED]
https://lists.linux-foundation.org/mailman/listinfo/containers

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

Reply via email to