[Devel] [PATCH 3/4] namespace containers: add nsproxy to nscont struct
Serge E. Hallyn
serue at us.ibm.com
Mon Feb 19 14:16:20 PST 2007
From: Serge E. Hallyn <serue at us.ibm.com>
Subject: [PATCH 3/4] namespace containers: add nsproxy to nscont struct
Each ns container is associated with an nsproxy. Add that
nsproxy to the nscont struct, set it when a container is auto-
created on clone/unshare, and inc/dec the nsproxy to account for
each container referencing it.
Note that once the nscont->nsproxy is set, it will never change
for the duration of the container's lifetime.
Changelog:
Feb 14: added ss->init_from_task() hook so ns_container
can initialize a container's private data from a task
on clone().
Signed-off-by: Serge E. Hallyn <serue at us.ibm.com>
---
Documentation/containers.txt | 9 +++++++++
include/linux/container.h | 1 +
include/linux/nsproxy.h | 1 +
kernel/container.c | 16 ++++++++++++++++
kernel/ns_container.c | 11 +++++++++++
5 files changed, 38 insertions(+), 0 deletions(-)
f863632142517f79ef885c238a8e5df238e8420c
diff --git a/Documentation/containers.txt b/Documentation/containers.txt
index 7918827..0001191 100644
--- a/Documentation/containers.txt
+++ b/Documentation/containers.txt
@@ -466,6 +466,15 @@ LL=manage_mutex
The container system is about to destroy the passed container; the
subsystem should do any necessary cleanup
+int init_from_task(struct container *cont, struct task_struct *task)
+LL=manage_mutex
+
+Called during a container_clone() call to allow differentiation
+between a container created automatically and one created by hand.
+A container created by hand inherits the nsproxy from the parent
+container. A container created automatically inherits the nsproxy
+from the task entering, which may have already done some unsharing.
+
int can_attach(struct container_subsys *ss, struct container *cont,
struct task_struct *task)
LL=manage_mutex
diff --git a/include/linux/container.h b/include/linux/container.h
index db2fc27..4c9c092 100644
--- a/include/linux/container.h
+++ b/include/linux/container.h
@@ -197,6 +197,7 @@ struct container_subsys {
int (*create)(struct container_subsys *ss,
struct container *cont);
void (*destroy)(struct container_subsys *ss, struct container *cont);
+ void (*init_from_task)(struct container *cont, struct task_struct *task);
int (*can_attach)(struct container_subsys *ss,
struct container *cont, struct task_struct *tsk);
void (*attach)(struct container_subsys *ss, struct container *cont,
diff --git a/include/linux/nsproxy.h b/include/linux/nsproxy.h
index d11eb09..43f5696 100644
--- a/include/linux/nsproxy.h
+++ b/include/linux/nsproxy.h
@@ -71,6 +71,7 @@ static inline void swap_nsproxies(struct
put_nsproxy(oldnsp);
}
+struct container;
#ifdef CONFIG_CONTAINER_NS
int ns_container_clone(struct task_struct *tsk, struct nsproxy *nsproxy);
#else
diff --git a/kernel/container.c b/kernel/container.c
index 0606753..0352f84 100644
--- a/kernel/container.c
+++ b/kernel/container.c
@@ -920,6 +920,19 @@ static int attach_task(struct container
return 0;
}
+static void init_container_from_task(struct container *cont,
+ struct task_struct *tsk)
+{
+ struct container_subsys *ss;
+ int h = cont->hierarchy;
+
+ for_each_subsys(h, ss) {
+ if (ss->init_from_task) {
+ ss->init_from_task(cont, tsk);
+ }
+ }
+}
+
/*
* Attach task with pid 'pid' to container 'cont'. Call with
* manage_mutex, may take callback_mutex and task_lock of task
@@ -1665,6 +1678,9 @@ int container_clone(struct task_struct *
goto again;
}
+ /* the new container needs private info initialized from the task */
+ init_container_from_task(child, tsk);
+
/* All seems fine. Finish by moving the task into the new container */
ret = attach_task(child, tsk);
mutex_unlock(&manage_mutex);
diff --git a/kernel/ns_container.c b/kernel/ns_container.c
index 23fac0e..1cc9cea 100644
--- a/kernel/ns_container.c
+++ b/kernel/ns_container.c
@@ -11,6 +11,7 @@
struct nscont {
struct container_subsys_state css;
+ struct nsproxy *nsproxy; /* never changes once set */
spinlock_t lock;
};
@@ -82,10 +83,19 @@ static int ns_create(struct container_su
return 0;
}
+void ns_init_from_task(struct container *cont, struct task_struct *tsk)
+{
+ struct nscont *ns = container_nscont(cont);
+ ns->nsproxy = tsk->nsproxy;
+ get_nsproxy(ns->nsproxy);
+}
+
static void ns_destroy(struct container_subsys *ss,
struct container *cont)
{
struct nscont *ns = container_nscont(cont);
+ if (ns->nsproxy)
+ put_nsproxy(ns->nsproxy);
kfree(ns);
}
@@ -97,6 +107,7 @@ static struct container_subsys ns_subsys
//.attach = ns_attach,
//.post_attach = ns_post_attach,
//.populate = ns_populate,
+ .init_from_task = ns_init_from_task,
.subsys_id = -1,
};
--
1.1.6
More information about the Devel
mailing list