Commit 2da440a2 authored by Tejun Heo's avatar Tejun Heo

cgroup: introduce cgroup_init/exit_cftypes()

Factor out cft->ss initialization into cgroup_init_cftypes() from
cgroup_add_cftypes() and add cft->ss clearing to cgroup_rm_cftypes()
through cgroup_exit_cftypes().

This doesn't make any meaningful difference now but the two new
functions will be expanded during kernfs transition.
Signed-off-by: default avatarTejun Heo <tj@kernel.org>
Acked-by: default avatarLi Zefan <lizefan@huawei.com>
parent 5f469907
...@@ -2770,6 +2770,22 @@ static int cgroup_cfts_commit(struct cftype *cfts, bool is_add) ...@@ -2770,6 +2770,22 @@ static int cgroup_cfts_commit(struct cftype *cfts, bool is_add)
return ret; return ret;
} }
static void cgroup_exit_cftypes(struct cftype *cfts)
{
struct cftype *cft;
for (cft = cfts; cft->name[0] != '\0'; cft++)
cft->ss = NULL;
}
static void cgroup_init_cftypes(struct cgroup_subsys *ss, struct cftype *cfts)
{
struct cftype *cft;
for (cft = cfts; cft->name[0] != '\0'; cft++)
cft->ss = ss;
}
/** /**
* cgroup_add_cftypes - add an array of cftypes to a subsystem * cgroup_add_cftypes - add an array of cftypes to a subsystem
* @ss: target cgroup subsystem * @ss: target cgroup subsystem
...@@ -2787,15 +2803,13 @@ static int cgroup_cfts_commit(struct cftype *cfts, bool is_add) ...@@ -2787,15 +2803,13 @@ static int cgroup_cfts_commit(struct cftype *cfts, bool is_add)
int cgroup_add_cftypes(struct cgroup_subsys *ss, struct cftype *cfts) int cgroup_add_cftypes(struct cgroup_subsys *ss, struct cftype *cfts)
{ {
struct cftype_set *set; struct cftype_set *set;
struct cftype *cft;
int ret; int ret;
set = kzalloc(sizeof(*set), GFP_KERNEL); set = kzalloc(sizeof(*set), GFP_KERNEL);
if (!set) if (!set)
return -ENOMEM; return -ENOMEM;
for (cft = cfts; cft->name[0] != '\0'; cft++) cgroup_init_cftypes(ss, cfts);
cft->ss = ss;
cgroup_cfts_prepare(); cgroup_cfts_prepare();
set->cfts = cfts; set->cfts = cfts;
...@@ -2820,6 +2834,7 @@ EXPORT_SYMBOL_GPL(cgroup_add_cftypes); ...@@ -2820,6 +2834,7 @@ EXPORT_SYMBOL_GPL(cgroup_add_cftypes);
*/ */
int cgroup_rm_cftypes(struct cftype *cfts) int cgroup_rm_cftypes(struct cftype *cfts)
{ {
struct cftype *found = NULL;
struct cftype_set *set; struct cftype_set *set;
if (!cfts || !cfts[0].ss) if (!cfts || !cfts[0].ss)
...@@ -2831,13 +2846,14 @@ int cgroup_rm_cftypes(struct cftype *cfts) ...@@ -2831,13 +2846,14 @@ int cgroup_rm_cftypes(struct cftype *cfts)
if (set->cfts == cfts) { if (set->cfts == cfts) {
list_del(&set->node); list_del(&set->node);
kfree(set); kfree(set);
cgroup_cfts_commit(cfts, false); found = cfts;
return 0; break;
} }
} }
cgroup_cfts_commit(NULL, false); cgroup_cfts_commit(found, false);
return -ENOENT; cgroup_exit_cftypes(cfts);
return found ? 0 : -ENOENT;
} }
/** /**
...@@ -4596,6 +4612,8 @@ int __init cgroup_init(void) ...@@ -4596,6 +4612,8 @@ int __init cgroup_init(void)
if (err) if (err)
return err; return err;
cgroup_init_cftypes(NULL, cgroup_base_files);
for_each_subsys(ss, i) { for_each_subsys(ss, i) {
if (!ss->early_init) if (!ss->early_init)
cgroup_init_subsys(ss); cgroup_init_subsys(ss);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment