cgroup: collapse cgroup_create() into croup_mkdir()
cgroup_mkdir() is the sole user of cgroup_create(). Let's collapse the latter into the former. This will help simplifying locking. While at it, remove now stale comment about inode locking. This patch doesn't introduce any functional changes. Signed-off-by: Tejun Heo <tj@kernel.org> Acked-by: Li Zefan <lizefan@huawei.com>
This commit is contained in:
parent
ba0f4d7615
commit
b3bfd983ca
|
@ -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.
|
||||
|
|
Loading…
Reference in New Issue