From ed387ac13a5823d1a9128bd48d93477bd9d7541a Mon Sep 17 00:00:00 2001 From: "Serge E. Hallyn" Date: Fri, 25 Jul 2008 01:47:06 -0700 Subject: [PATCH] --- yaml --- r: 105899 b: refs/heads/master c: e885dcde75685e09f23cffae1f6d5169c105b8a0 h: refs/heads/master i: 105897: a6d20cf0fbd2cee5ed0f141081877da11c33bd31 105895: 5ccf3cb7f03c0becb0f5ca2f31b751464e748dcc v: v3 --- [refs] | 2 +- trunk/include/linux/cgroup.h | 3 ++- trunk/include/linux/nsproxy.h | 7 +++++-- trunk/kernel/cgroup.c | 7 +++---- trunk/kernel/fork.c | 6 ++++++ trunk/kernel/ns_cgroup.c | 8 ++++++-- trunk/kernel/nsproxy.c | 8 +------- 7 files changed, 24 insertions(+), 17 deletions(-) diff --git a/[refs] b/[refs] index 18f97bbc0706..a42bec7c2983 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 856c13aa1ff6136c1968414fdea5938ea9d5ebf2 +refs/heads/master: e885dcde75685e09f23cffae1f6d5169c105b8a0 diff --git a/trunk/include/linux/cgroup.h b/trunk/include/linux/cgroup.h index cc59d3a21d87..c98dd7cb7076 100644 --- a/trunk/include/linux/cgroup.h +++ b/trunk/include/linux/cgroup.h @@ -364,7 +364,8 @@ static inline struct cgroup* task_cgroup(struct task_struct *task, return task_subsys_state(task, subsys_id)->cgroup; } -int cgroup_clone(struct task_struct *tsk, struct cgroup_subsys *ss); +int cgroup_clone(struct task_struct *tsk, struct cgroup_subsys *ss, + char *nodename); /* A cgroup_iter should be treated as an opaque object */ struct cgroup_iter { diff --git a/trunk/include/linux/nsproxy.h b/trunk/include/linux/nsproxy.h index 0e66b57631fc..c8a768e59640 100644 --- a/trunk/include/linux/nsproxy.h +++ b/trunk/include/linux/nsproxy.h @@ -82,9 +82,12 @@ static inline void get_nsproxy(struct nsproxy *ns) } #ifdef CONFIG_CGROUP_NS -int ns_cgroup_clone(struct task_struct *tsk); +int ns_cgroup_clone(struct task_struct *tsk, struct pid *pid); #else -static inline int ns_cgroup_clone(struct task_struct *tsk) { return 0; } +static inline int ns_cgroup_clone(struct task_struct *tsk, struct pid *pid) +{ + return 0; +} #endif #endif diff --git a/trunk/kernel/cgroup.c b/trunk/kernel/cgroup.c index 86b71e714e13..66ec9fd21e0c 100644 --- a/trunk/kernel/cgroup.c +++ b/trunk/kernel/cgroup.c @@ -2848,16 +2848,17 @@ void cgroup_exit(struct task_struct *tsk, int run_callbacks) * cgroup_clone - clone the cgroup the given subsystem is attached to * @tsk: the task to be moved * @subsys: the given subsystem + * @nodename: the name for the new cgroup * * Duplicate the current cgroup in the hierarchy that the given * subsystem is attached to, and move this task into the new * child. */ -int cgroup_clone(struct task_struct *tsk, struct cgroup_subsys *subsys) +int cgroup_clone(struct task_struct *tsk, struct cgroup_subsys *subsys, + char *nodename) { struct dentry *dentry; int ret = 0; - char nodename[MAX_CGROUP_TYPE_NAMELEN]; struct cgroup *parent, *child; struct inode *inode; struct css_set *cg; @@ -2882,8 +2883,6 @@ int cgroup_clone(struct task_struct *tsk, struct cgroup_subsys *subsys) cg = tsk->cgroups; parent = task_cgroup(tsk, subsys->subsys_id); - snprintf(nodename, MAX_CGROUP_TYPE_NAMELEN, "%d", tsk->pid); - /* Pin the hierarchy */ atomic_inc(&parent->root->sb->s_active); diff --git a/trunk/kernel/fork.c b/trunk/kernel/fork.c index 5a5d6fef341d..228f80c9155a 100644 --- a/trunk/kernel/fork.c +++ b/trunk/kernel/fork.c @@ -1107,6 +1107,12 @@ static struct task_struct *copy_process(unsigned long clone_flags, if (clone_flags & CLONE_THREAD) p->tgid = current->tgid; + if (current->nsproxy != p->nsproxy) { + retval = ns_cgroup_clone(p, pid); + if (retval) + goto bad_fork_free_pid; + } + p->set_child_tid = (clone_flags & CLONE_CHILD_SETTID) ? child_tidptr : NULL; /* * Clear TID on mm_release()? diff --git a/trunk/kernel/ns_cgroup.c b/trunk/kernel/ns_cgroup.c index 48d7ed6fc3a4..43c2111cd54d 100644 --- a/trunk/kernel/ns_cgroup.c +++ b/trunk/kernel/ns_cgroup.c @@ -7,6 +7,7 @@ #include #include #include +#include #include #include @@ -24,9 +25,12 @@ static inline struct ns_cgroup *cgroup_to_ns( struct ns_cgroup, css); } -int ns_cgroup_clone(struct task_struct *task) +int ns_cgroup_clone(struct task_struct *task, struct pid *pid) { - return cgroup_clone(task, &ns_subsys); + char name[PROC_NUMBUF]; + + snprintf(name, PROC_NUMBUF, "%d", pid_vnr(pid)); + return cgroup_clone(task, &ns_subsys, name); } /* diff --git a/trunk/kernel/nsproxy.c b/trunk/kernel/nsproxy.c index adc785146a1c..21575fc46d05 100644 --- a/trunk/kernel/nsproxy.c +++ b/trunk/kernel/nsproxy.c @@ -157,12 +157,6 @@ int copy_namespaces(unsigned long flags, struct task_struct *tsk) goto out; } - err = ns_cgroup_clone(tsk); - if (err) { - put_nsproxy(new_ns); - goto out; - } - tsk->nsproxy = new_ns; out: @@ -209,7 +203,7 @@ int unshare_nsproxy_namespaces(unsigned long unshare_flags, goto out; } - err = ns_cgroup_clone(current); + err = ns_cgroup_clone(current, task_pid(current)); if (err) put_nsproxy(*new_nsp);