|
@@ -1573,8 +1573,17 @@ static void css_clear_dir(struct cgroup_subsys_state *css)
|
|
|
|
|
|
css->flags &= ~CSS_VISIBLE;
|
|
|
|
|
|
- list_for_each_entry(cfts, &css->ss->cfts, node)
|
|
|
+ if (!css->ss) {
|
|
|
+ if (cgroup_on_dfl(cgrp))
|
|
|
+ cfts = cgroup_base_files;
|
|
|
+ else
|
|
|
+ cfts = cgroup1_base_files;
|
|
|
+
|
|
|
cgroup_addrm_files(css, cgrp, cfts, false);
|
|
|
+ } else {
|
|
|
+ list_for_each_entry(cfts, &css->ss->cfts, node)
|
|
|
+ cgroup_addrm_files(css, cgrp, cfts, false);
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -1598,14 +1607,16 @@ static int css_populate_dir(struct cgroup_subsys_state *css)
|
|
|
else
|
|
|
cfts = cgroup1_base_files;
|
|
|
|
|
|
- return cgroup_addrm_files(&cgrp->self, cgrp, cfts, true);
|
|
|
- }
|
|
|
-
|
|
|
- list_for_each_entry(cfts, &css->ss->cfts, node) {
|
|
|
- ret = cgroup_addrm_files(css, cgrp, cfts, true);
|
|
|
- if (ret < 0) {
|
|
|
- failed_cfts = cfts;
|
|
|
- goto err;
|
|
|
+ ret = cgroup_addrm_files(&cgrp->self, cgrp, cfts, true);
|
|
|
+ if (ret < 0)
|
|
|
+ return ret;
|
|
|
+ } else {
|
|
|
+ list_for_each_entry(cfts, &css->ss->cfts, node) {
|
|
|
+ ret = cgroup_addrm_files(css, cgrp, cfts, true);
|
|
|
+ if (ret < 0) {
|
|
|
+ failed_cfts = cfts;
|
|
|
+ goto err;
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -5090,10 +5101,8 @@ static int cgroup_destroy_locked(struct cgroup *cgrp)
|
|
|
for_each_css(css, ssid, cgrp)
|
|
|
kill_css(css);
|
|
|
|
|
|
- /*
|
|
|
- * Remove @cgrp directory along with the base files. @cgrp has an
|
|
|
- * extra ref on its kn.
|
|
|
- */
|
|
|
+ /* clear and remove @cgrp dir, @cgrp has an extra ref on its kn */
|
|
|
+ css_clear_dir(&cgrp->self);
|
|
|
kernfs_remove(cgrp->kn);
|
|
|
|
|
|
if (parent && cgroup_is_threaded(cgrp))
|