aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLi Zefan <lizefan@huawei.com>2013-04-08 02:35:02 -0400
committerTejun Heo <tj@kernel.org>2013-04-10 14:07:00 -0400
commit415cf07a1c1c65249773330434878ae7bcd92d0f (patch)
tree2154c7078abde678f7d4fdb9c5f1c10a26ab16df
parent84cfb6ab484b442d5115eb3baf9db7d74a3ea626 (diff)
cgroup: make sure parent won't be destroyed before its children
Suppose we rmdir a cgroup and there're still css refs, this cgroup won't be freed. Then we rmdir the parent cgroup, and the parent is freed immediately due to css ref draining to 0. Now it would be a disaster if the still-alive child cgroup tries to access its parent. Make sure this won't happen. Signed-off-by: Li Zefan <lizefan@huawei.com> Reviewed-by: Michal Hocko <mhocko@suse.cz> Acked-by: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com> Signed-off-by: Tejun Heo <tj@kernel.org>
-rw-r--r--kernel/cgroup.c10
1 files changed, 10 insertions, 0 deletions
diff --git a/kernel/cgroup.c b/kernel/cgroup.c
index fd38e1cfacca..65b72d0367c5 100644
--- a/kernel/cgroup.c
+++ b/kernel/cgroup.c
@@ -876,6 +876,13 @@ static void cgroup_free_fn(struct work_struct *work)
876 mutex_unlock(&cgroup_mutex); 876 mutex_unlock(&cgroup_mutex);
877 877
878 /* 878 /*
879 * We get a ref to the parent's dentry, and put the ref when
880 * this cgroup is being freed, so it's guaranteed that the
881 * parent won't be destroyed before its children.
882 */
883 dput(cgrp->parent->dentry);
884
885 /*
879 * Drop the active superblock reference that we took when we 886 * Drop the active superblock reference that we took when we
880 * created the cgroup 887 * created the cgroup
881 */ 888 */
@@ -4164,6 +4171,9 @@ static long cgroup_create(struct cgroup *parent, struct dentry *dentry,
4164 for_each_subsys(root, ss) 4171 for_each_subsys(root, ss)
4165 dget(dentry); 4172 dget(dentry);
4166 4173
4174 /* hold a ref to the parent's dentry */
4175 dget(parent->dentry);
4176
4167 /* creation succeeded, notify subsystems */ 4177 /* creation succeeded, notify subsystems */
4168 for_each_subsys(root, ss) { 4178 for_each_subsys(root, ss) {
4169 err = online_css(ss, cgrp); 4179 err = online_css(ss, cgrp);