if (!cgrp)
                return -ENOMEM;
 
+       /*
+        * Only live parents can have children.  Note that the liveliness
+        * check isn't strictly necessary because cgroup_mkdir() and
+        * cgroup_rmdir() are fully synchronized by i_mutex; however, do it
+        * anyway so that locking is contained inside cgroup proper and we
+        * don't get nasty surprises if we ever grow another caller.
+        */
+       if (!cgroup_lock_live_group(parent)) {
+               err = -ENODEV;
+               goto err_free;
+       }
+
        /* Grab a reference on the superblock so the hierarchy doesn't
         * get deleted on unmount if there are child cgroups.  This
         * can be done outside cgroup_mutex, since the sb can't
         * fs */
        atomic_inc(&sb->s_active);
 
-       mutex_lock(&cgroup_mutex);
-
        init_cgroup_housekeeping(cgrp);
 
        cgrp->parent = parent;
 
        /* Release the reference count that we took on the superblock */
        deactivate_super(sb);
-
+err_free:
        kfree(cgrp);
        return err;
 }