|
|
@@ -4373,16 +4373,20 @@ static void css_free_work_fn(struct work_struct *work)
|
|
|
{
|
|
|
struct cgroup_subsys_state *css =
|
|
|
container_of(work, struct cgroup_subsys_state, destroy_work);
|
|
|
+ struct cgroup_subsys *ss = css->ss;
|
|
|
struct cgroup *cgrp = css->cgroup;
|
|
|
|
|
|
percpu_ref_exit(&css->refcnt);
|
|
|
|
|
|
- if (css->ss) {
|
|
|
+ if (ss) {
|
|
|
/* css free path */
|
|
|
+ int id = css->id;
|
|
|
+
|
|
|
if (css->parent)
|
|
|
css_put(css->parent);
|
|
|
|
|
|
- css->ss->css_free(css);
|
|
|
+ ss->css_free(css);
|
|
|
+ cgroup_idr_remove(&ss->css_idr, id);
|
|
|
cgroup_put(cgrp);
|
|
|
} else {
|
|
|
/* cgroup free path */
|
|
|
@@ -4434,7 +4438,7 @@ static void css_release_work_fn(struct work_struct *work)
|
|
|
|
|
|
if (ss) {
|
|
|
/* css release path */
|
|
|
- cgroup_idr_remove(&ss->css_idr, css->id);
|
|
|
+ cgroup_idr_replace(&ss->css_idr, NULL, css->id);
|
|
|
if (ss->css_released)
|
|
|
ss->css_released(css);
|
|
|
} else {
|