summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTejun Heo <htejun@fb.com>2016-05-14 15:56:53 -0400
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>2016-05-14 15:56:53 -0400
commit99e66921c86bce77d0d3587c201c7d1b611a7d99 (patch)
treeea02e79efac1588dd58adb9d277215ddcaeafe2d
parent4b653dd2b3f07f9f8bc4b197b369b742178afd76 (diff)
downloadsystemd-99e66921c86bce77d0d3587c201c7d1b611a7d99.tar.gz
core: allow slice to be overriden if cgroups aren't realized (#3246)
unit_set_slice() fails with -EBUSY if the unit already has a slice associated with it. This makes it impossible to override slice through dropin config or over dbus. There's no reason to disallow slice changes as long as cgroups aren't realized. Fix it. Fixes #3240. Signed-off-by: Tejun Heo <htejun@fb.com> Reported-by: Davide Cavalca <dcavalca@fb.com>
-rw-r--r--src/core/unit.c4
1 files changed, 3 insertions, 1 deletions
diff --git a/src/core/unit.c b/src/core/unit.c
index d8ab5781b0..dc8325515c 100644
--- a/src/core/unit.c
+++ b/src/core/unit.c
@@ -2400,9 +2400,11 @@ int unit_set_slice(Unit *u, Unit *slice) {
if (UNIT_DEREF(u->slice) == slice)
return 0;
- if (UNIT_ISSET(u->slice))
+ /* Disallow slice changes if @u is already bound to cgroups */
+ if (UNIT_ISSET(u->slice) && u->cgroup_realized)
return -EBUSY;
+ unit_ref_unset(&u->slice);
unit_ref_set(&u->slice, slice);
return 1;
}