diff options
Diffstat (limited to 'kernel/cgroup.c')
-rw-r--r-- | kernel/cgroup.c | 15 |
1 files changed, 14 insertions, 1 deletions
diff --git a/kernel/cgroup.c b/kernel/cgroup.c index 09751657abdc..5679cb1ce43f 100644 --- a/kernel/cgroup.c +++ b/kernel/cgroup.c | |||
@@ -4420,9 +4420,10 @@ int __init_or_module cgroup_load_subsys(struct cgroup_subsys *ss) | |||
4420 | if (ss->use_id) { | 4420 | if (ss->use_id) { |
4421 | int ret = cgroup_init_idr(ss, css); | 4421 | int ret = cgroup_init_idr(ss, css); |
4422 | if (ret) { | 4422 | if (ret) { |
4423 | dummytop->subsys[ss->subsys_id] = NULL; | ||
4424 | ss->destroy(dummytop); | 4423 | ss->destroy(dummytop); |
4424 | dummytop->subsys[ss->subsys_id] = NULL; | ||
4425 | subsys[ss->subsys_id] = NULL; | 4425 | subsys[ss->subsys_id] = NULL; |
4426 | list_del_init(&ss->sibling); | ||
4426 | mutex_unlock(&cgroup_mutex); | 4427 | mutex_unlock(&cgroup_mutex); |
4427 | return ret; | 4428 | return ret; |
4428 | } | 4429 | } |
@@ -4490,7 +4491,19 @@ void cgroup_unload_subsys(struct cgroup_subsys *ss) | |||
4490 | */ | 4491 | */ |
4491 | BUG_ON(ss->root != &rootnode); | 4492 | BUG_ON(ss->root != &rootnode); |
4492 | 4493 | ||
4494 | /* ->pre_destroy() should be called outside cgroup_mutex for now */ | ||
4495 | if (ss->pre_destroy) | ||
4496 | ss->pre_destroy(dummytop); | ||
4497 | |||
4493 | mutex_lock(&cgroup_mutex); | 4498 | mutex_lock(&cgroup_mutex); |
4499 | |||
4500 | ss->active = 0; | ||
4501 | |||
4502 | if (ss->use_id) { | ||
4503 | idr_remove_all(&ss->idr); | ||
4504 | idr_destroy(&ss->idr); | ||
4505 | } | ||
4506 | |||
4494 | /* deassign the subsys_id */ | 4507 | /* deassign the subsys_id */ |
4495 | subsys[ss->subsys_id] = NULL; | 4508 | subsys[ss->subsys_id] = NULL; |
4496 | 4509 | ||