aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--kernel/cgroup/cgroup.c35
1 files changed, 22 insertions, 13 deletions
diff --git a/kernel/cgroup/cgroup.c b/kernel/cgroup/cgroup.c
index a662bfcbea0e..25309c868728 100644
--- a/kernel/cgroup/cgroup.c
+++ b/kernel/cgroup/cgroup.c
@@ -1573,8 +1573,17 @@ static void css_clear_dir(struct cgroup_subsys_state *css)
1573 1573
1574 css->flags &= ~CSS_VISIBLE; 1574 css->flags &= ~CSS_VISIBLE;
1575 1575
1576 list_for_each_entry(cfts, &css->ss->cfts, node) 1576 if (!css->ss) {
1577 if (cgroup_on_dfl(cgrp))
1578 cfts = cgroup_base_files;
1579 else
1580 cfts = cgroup1_base_files;
1581
1577 cgroup_addrm_files(css, cgrp, cfts, false); 1582 cgroup_addrm_files(css, cgrp, cfts, false);
1583 } else {
1584 list_for_each_entry(cfts, &css->ss->cfts, node)
1585 cgroup_addrm_files(css, cgrp, cfts, false);
1586 }
1578} 1587}
1579 1588
1580/** 1589/**
@@ -1598,14 +1607,16 @@ static int css_populate_dir(struct cgroup_subsys_state *css)
1598 else 1607 else
1599 cfts = cgroup1_base_files; 1608 cfts = cgroup1_base_files;
1600 1609
1601 return cgroup_addrm_files(&cgrp->self, cgrp, cfts, true); 1610 ret = cgroup_addrm_files(&cgrp->self, cgrp, cfts, true);
1602 } 1611 if (ret < 0)
1603 1612 return ret;
1604 list_for_each_entry(cfts, &css->ss->cfts, node) { 1613 } else {
1605 ret = cgroup_addrm_files(css, cgrp, cfts, true); 1614 list_for_each_entry(cfts, &css->ss->cfts, node) {
1606 if (ret < 0) { 1615 ret = cgroup_addrm_files(css, cgrp, cfts, true);
1607 failed_cfts = cfts; 1616 if (ret < 0) {
1608 goto err; 1617 failed_cfts = cfts;
1618 goto err;
1619 }
1609 } 1620 }
1610 } 1621 }
1611 1622
@@ -5090,10 +5101,8 @@ static int cgroup_destroy_locked(struct cgroup *cgrp)
5090 for_each_css(css, ssid, cgrp) 5101 for_each_css(css, ssid, cgrp)
5091 kill_css(css); 5102 kill_css(css);
5092 5103
5093 /* 5104 /* clear and remove @cgrp dir, @cgrp has an extra ref on its kn */
5094 * Remove @cgrp directory along with the base files. @cgrp has an 5105 css_clear_dir(&cgrp->self);
5095 * extra ref on its kn.
5096 */
5097 kernfs_remove(cgrp->kn); 5106 kernfs_remove(cgrp->kn);
5098 5107
5099 if (parent && cgroup_is_threaded(cgrp)) 5108 if (parent && cgroup_is_threaded(cgrp))