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);