mirror of
https://github.com/torvalds/linux.git
synced 2024-11-11 14:42:24 +00:00
cgroup: fix harmless bugs in cgroup_load_subsys() fail path and cgroup_unload_subsys()
* If idr init fails, cgroup_load_subsys() cleared dummytop->subsys[] before calilng ->destroy() making CSS inaccessible to the callback, and didn't unlink ss->sibling. As no modular controller uses ->use_id, this doesn't cause any actual problems. * cgroup_unload_subsys() was forgetting to free idr, call ->pre_destroy() and clear ->active. As there currently is no modular controller which uses ->use_id, ->pre_destroy() or ->active, this doesn't cause any actual problems. Signed-off-by: Tejun Heo <tj@kernel.org> Acked-by: Li Zefan <lizefan@huawei.com>
This commit is contained in:
parent
648bb56d07
commit
02ae7486d0
@ -4420,9 +4420,10 @@ int __init_or_module cgroup_load_subsys(struct cgroup_subsys *ss)
|
||||
if (ss->use_id) {
|
||||
int ret = cgroup_init_idr(ss, css);
|
||||
if (ret) {
|
||||
dummytop->subsys[ss->subsys_id] = NULL;
|
||||
ss->destroy(dummytop);
|
||||
dummytop->subsys[ss->subsys_id] = NULL;
|
||||
subsys[ss->subsys_id] = NULL;
|
||||
list_del_init(&ss->sibling);
|
||||
mutex_unlock(&cgroup_mutex);
|
||||
return ret;
|
||||
}
|
||||
@ -4490,7 +4491,19 @@ void cgroup_unload_subsys(struct cgroup_subsys *ss)
|
||||
*/
|
||||
BUG_ON(ss->root != &rootnode);
|
||||
|
||||
/* ->pre_destroy() should be called outside cgroup_mutex for now */
|
||||
if (ss->pre_destroy)
|
||||
ss->pre_destroy(dummytop);
|
||||
|
||||
mutex_lock(&cgroup_mutex);
|
||||
|
||||
ss->active = 0;
|
||||
|
||||
if (ss->use_id) {
|
||||
idr_remove_all(&ss->idr);
|
||||
idr_destroy(&ss->idr);
|
||||
}
|
||||
|
||||
/* deassign the subsys_id */
|
||||
subsys[ss->subsys_id] = NULL;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user