summaryrefslogtreecommitdiff
path: root/kernel/cgroup.c
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/cgroup.c')
-rw-r--r--kernel/cgroup.c52
1 files changed, 13 insertions, 39 deletions
diff --git a/kernel/cgroup.c b/kernel/cgroup.c
index 1d6106c3fb4e..580d3484f97a 100644
--- a/kernel/cgroup.c
+++ b/kernel/cgroup.c
@@ -4235,30 +4235,24 @@ err_free_css:
return err;
}
-/**
- * cgroup_create - create a cgroup
- * @parent: cgroup that will be parent of the new cgroup
- * @name: name of the new cgroup
- * @mode: mode to set on new cgroup
- */
-static long cgroup_create(struct cgroup *parent, const char *name,
- umode_t mode)
+static int cgroup_mkdir(struct kernfs_node *parent_kn, const char *name,
+ umode_t mode)
{
- struct cgroup *cgrp;
+ struct cgroup *parent = parent_kn->priv, *cgrp;
struct cgroup_root *root = parent->root;
- int ssid, ret;
struct cgroup_subsys *ss;
struct kernfs_node *kn;
-
- mutex_lock(&cgroup_tree_mutex);
+ int ssid, ret;
/*
- * 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.
+ * cgroup_mkdir() grabs cgroup_tree_mutex which nests outside
+ * kernfs active_ref and cgroup_create() already synchronizes
+ * properly against removal through cgroup_lock_live_group().
+ * Break it before calling cgroup_create().
*/
+ cgroup_get(parent);
+ kernfs_break_active_protection(parent_kn);
+ mutex_lock(&cgroup_tree_mutex);
if (!cgroup_lock_live_group(parent)) {
ret = -ENODEV;
goto out_unlock_tree;
@@ -4357,6 +4351,8 @@ out_unlock:
mutex_unlock(&cgroup_mutex);
out_unlock_tree:
mutex_unlock(&cgroup_tree_mutex);
+ kernfs_unbreak_active_protection(parent_kn);
+ cgroup_put(parent);
return ret;
out_destroy:
@@ -4364,28 +4360,6 @@ out_destroy:
goto out_unlock;
}
-static int cgroup_mkdir(struct kernfs_node *parent_kn, const char *name,
- umode_t mode)
-{
- struct cgroup *parent = parent_kn->priv;
- int ret;
-
- /*
- * cgroup_create() grabs cgroup_tree_mutex which nests outside
- * kernfs active_ref and cgroup_create() already synchronizes
- * properly against removal through cgroup_lock_live_group().
- * Break it before calling cgroup_create().
- */
- cgroup_get(parent);
- kernfs_break_active_protection(parent_kn);
-
- ret = cgroup_create(parent, name, mode);
-
- kernfs_unbreak_active_protection(parent_kn);
- cgroup_put(parent);
- return ret;
-}
-
/*
* This is called when the refcnt of a css is confirmed to be killed.
* css_tryget_online() is now guaranteed to fail.