|
@@ -3927,6 +3927,18 @@ static long cgroup_create(struct cgroup *parent, struct dentry *dentry,
|
|
|
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
|
|
@@ -3934,8 +3946,6 @@ static long cgroup_create(struct cgroup *parent, struct dentry *dentry,
|
|
|
* fs */
|
|
|
atomic_inc(&sb->s_active);
|
|
|
|
|
|
- mutex_lock(&cgroup_mutex);
|
|
|
-
|
|
|
init_cgroup_housekeeping(cgrp);
|
|
|
|
|
|
cgrp->parent = parent;
|
|
@@ -4006,7 +4016,7 @@ static long cgroup_create(struct cgroup *parent, struct dentry *dentry,
|
|
|
|
|
|
/* Release the reference count that we took on the superblock */
|
|
|
deactivate_super(sb);
|
|
|
-
|
|
|
+err_free:
|
|
|
kfree(cgrp);
|
|
|
return err;
|
|
|
}
|