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: Tejun Heo <tj@kernel.org> Acked-by: Li Zefan <lizefan@huawei.com>
This commit is contained in:
parent
5f46990787
commit
2da440a26c
|
@ -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)
|
||||||
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);
|
||||||
*/
|
*/
|
||||||
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)
|
||||||
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)
|
||||||
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);
|
||||||
|
|
Loading…
Reference in New Issue