[Devel] [RFC][PATCH 2/5] Define helper functions

sukadev at us.ibm.com sukadev at us.ibm.com
Fri Mar 9 20:02:07 PST 2007


From: Sukadev Bhattiprolu <sukadev at us.ibm.com>
Subject: [RFC][PATCH 2/5] Define helper functions

Define some helper functions that will be used in subsequent patches
to move pid namespace out of nsproxy and into pid->pid_nrs list.

Changelog:
	- Remove set_pid_ns() as its no longer needed.
	- Remove set_pid_ns_child_reaper() from use-pid-ns-from-struct-pid-nr
	  patch and moved it into this patch
	- Add priv_check_pid_ns()

Signed-off-by: Sukadev Bhattiprolu <sukadev at us.ibm.com>
Cc: Cedric Le Goater <clg at fr.ibm.com>
Cc: Dave Hansen <haveblue at us.ibm.com>
Cc: Serge Hallyn <serue at us.ibm.com>
Cc: containers at lists.osdl.org
---
 kernel/fork.c |   29 +++++++++++++++++++++++++++++
 kernel/pid.c  |   30 ++++++++++++++++++++++++++++++
 2 files changed, 59 insertions(+)

Index: lx26-20-mm2b/kernel/pid.c
===================================================================
--- lx26-20-mm2b.orig/kernel/pid.c	2007-03-09 19:00:12.000000000 -0800
+++ lx26-20-mm2b/kernel/pid.c	2007-03-09 19:00:42.000000000 -0800
@@ -327,6 +327,36 @@ static struct pid_namespace *clone_pid_n
 	return ns;
 }
 
+/*
+ * Return the clone-pid-namespace of this pid.
+ *
+ * Clone-pid-namespace of a process is the namespace that the process
+ * did the most recent unshare or clone of CLONE_NEWPID into. If the
+ * process never unshared its pid namespace, then its clone-pid-namespace
+ * is the same as its parent's clone-pid-namespace.
+ */
+struct pid_namespace *pid_ns(struct pid *pid)
+{
+	struct pid_nr* pid_nr;
+	struct pid_namespace *ns;
+	struct hlist_node *head;
+
+	if (!pid)
+		return 0;
+
+	rcu_read_lock();
+	/*
+	 * Our clone-pid-ns is simply the pid_ns of the first pid_nr
+	 * on our pid_nrs list
+	 */
+	head = pid->pid_nrs.first;
+	pid_nr = hlist_entry(head, struct pid_nr, node);
+	ns = pid_nr->pid_ns;
+
+	rcu_read_unlock();
+	return ns;
+}
+
 struct pid *alloc_pid(void)
 {
 	struct pid *pid;
Index: lx26-20-mm2b/kernel/fork.c
===================================================================
--- lx26-20-mm2b.orig/kernel/fork.c	2007-03-09 19:00:14.000000000 -0800
+++ lx26-20-mm2b/kernel/fork.c	2007-03-09 19:00:42.000000000 -0800
@@ -953,6 +953,35 @@ static inline void rcu_task_init(struct 
 static inline void rcu_task_init(struct task_struct *p) {}
 #endif
 
+static inline int priv_check_pid_ns(unsigned long clone_flags)
+{
+	if (clone_flags & CLONE_NEWPID)
+		if (!capable(CAP_SYS_ADMIN))
+			return -EPERM;
+	return 0;
+}
+
+/*
+ * Make @tsk the child reaper for the clone-pid-ns of the process
+ * identified by @pid
+ */
+static void set_pid_ns_child_reaper(unsigned long clone_flags, struct pid *pid,
+		struct task_struct *tsk)
+{
+	struct pid_namespace *lpid_ns;
+
+	if (!(clone_flags & CLONE_NEWPID))
+		return;
+
+	lpid_ns = pid_ns(pid);
+	BUG_ON(lpid_ns == &init_pid_ns);
+
+	/* don't need to lock here since we just created the pid ns */
+	lpid_ns->child_reaper = tsk;
+
+	return;
+}
+
 /*
  * This creates a new process as a copy of the old one,
  * but does not actually start it yet.
_______________________________________________
Containers mailing list
Containers at lists.osdl.org
https://lists.osdl.org/mailman/listinfo/containers




More information about the Devel mailing list