diff --git a/kernel/cgroup.c b/kernel/cgroup.c index fd38e1cfacca..65b72d0367c5 100644 --- a/kernel/cgroup.c +++ b/kernel/cgroup.c @@ -875,6 +875,13 @@ static void cgroup_free_fn(struct work_struct *work) cgrp->root->number_of_cgroups--; mutex_unlock(&cgroup_mutex); + /* + * We get a ref to the parent's dentry, and put the ref when + * this cgroup is being freed, so it's guaranteed that the + * parent won't be destroyed before its children. + */ + dput(cgrp->parent->dentry); + /* * Drop the active superblock reference that we took when we * created the cgroup @@ -4164,6 +4171,9 @@ static long cgroup_create(struct cgroup *parent, struct dentry *dentry, for_each_subsys(root, ss) dget(dentry); + /* hold a ref to the parent's dentry */ + dget(parent->dentry); + /* creation succeeded, notify subsystems */ for_each_subsys(root, ss) { err = online_css(ss, cgrp);