summaryrefslogtreecommitdiff
path: root/src/core
diff options
context:
space:
mode:
authorAnita Zhang <the.anitazha@gmail.com>2021-11-09 15:26:28 -0800
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>2021-11-10 10:52:08 +0100
commit899acf5c2d4b89caa891d05ccfa4be828a999c2d (patch)
tree542704b65d167750da9a4d9e72616e22d947e16b /src/core
parent4d544a0c879a2f1a983cc5e6960c4a53fa565772 (diff)
downloadsystemd-899acf5c2d4b89caa891d05ccfa4be828a999c2d.tar.gz
core: replace slice dependencies as they get added
Defines a "UNIT_DEPENDENCY_SLICE_PROPERTY" UnitDependencyMask type that is used when adding slices to the dependencies hashmap. This type is used to remove slice dependencies when they get overridden by new ones. Fixes #20182
Diffstat (limited to 'src/core')
-rw-r--r--src/core/dbus-unit.c2
-rw-r--r--src/core/load-fragment.c2
-rw-r--r--src/core/unit-serialize.c1
-rw-r--r--src/core/unit.c10
-rw-r--r--src/core/unit.h7
5 files changed, 15 insertions, 7 deletions
diff --git a/src/core/dbus-unit.c b/src/core/dbus-unit.c
index fe320f1b05..d4ec789a7c 100644
--- a/src/core/dbus-unit.c
+++ b/src/core/dbus-unit.c
@@ -2273,7 +2273,7 @@ static int bus_unit_set_transient_property(
return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "Unit name '%s' is not a slice", s);
if (!UNIT_WRITE_FLAGS_NOOP(flags)) {
- r = unit_set_slice(u, slice, UNIT_DEPENDENCY_FILE);
+ r = unit_set_slice(u, slice);
if (r < 0)
return r;
diff --git a/src/core/load-fragment.c b/src/core/load-fragment.c
index 7ef6bcc41d..6efcba3265 100644
--- a/src/core/load-fragment.c
+++ b/src/core/load-fragment.c
@@ -3793,7 +3793,7 @@ int config_parse_unit_slice(
return 0;
}
- r = unit_set_slice(u, slice, UNIT_DEPENDENCY_FILE);
+ r = unit_set_slice(u, slice);
if (r < 0) {
log_syntax(unit, LOG_WARNING, filename, line, r, "Failed to assign slice %s to unit %s, ignoring: %m", slice->id, u->id);
return 0;
diff --git a/src/core/unit-serialize.c b/src/core/unit-serialize.c
index 3458d7017b..7d2e6bc130 100644
--- a/src/core/unit-serialize.c
+++ b/src/core/unit-serialize.c
@@ -593,6 +593,7 @@ static void print_unit_dependency_mask(FILE *f, const char *kind, UnitDependency
{ UNIT_DEPENDENCY_MOUNTINFO_IMPLICIT, "mountinfo-implicit" },
{ UNIT_DEPENDENCY_MOUNTINFO_DEFAULT, "mountinfo-default" },
{ UNIT_DEPENDENCY_PROC_SWAP, "proc-swap" },
+ { UNIT_DEPENDENCY_SLICE_PROPERTY, "slice-property" },
};
assert(f);
diff --git a/src/core/unit.c b/src/core/unit.c
index 59be3b78eb..77d4ceaf24 100644
--- a/src/core/unit.c
+++ b/src/core/unit.c
@@ -3285,7 +3285,7 @@ reset:
return r;
}
-int unit_set_slice(Unit *u, Unit *slice, UnitDependencyMask mask) {
+int unit_set_slice(Unit *u, Unit *slice) {
int r;
assert(u);
@@ -3318,7 +3318,11 @@ int unit_set_slice(Unit *u, Unit *slice, UnitDependencyMask mask) {
if (UNIT_GET_SLICE(u) && u->cgroup_realized)
return -EBUSY;
- r = unit_add_dependency(u, UNIT_IN_SLICE, slice, true, mask);
+ /* Remove any slices assigned prior; we should only have one UNIT_IN_SLICE dependency */
+ if (UNIT_GET_SLICE(u))
+ unit_remove_dependencies(u, UNIT_DEPENDENCY_SLICE_PROPERTY);
+
+ r = unit_add_dependency(u, UNIT_IN_SLICE, slice, true, UNIT_DEPENDENCY_SLICE_PROPERTY);
if (r < 0)
return r;
@@ -3374,7 +3378,7 @@ int unit_set_default_slice(Unit *u) {
if (r < 0)
return r;
- return unit_set_slice(u, slice, UNIT_DEPENDENCY_FILE);
+ return unit_set_slice(u, slice);
}
const char *unit_slice_name(Unit *u) {
diff --git a/src/core/unit.h b/src/core/unit.h
index b49ae7c1b8..3f3a75d33b 100644
--- a/src/core/unit.h
+++ b/src/core/unit.h
@@ -89,7 +89,10 @@ typedef enum UnitDependencyMask {
/* A dependency created because of data read from /proc/swaps and no other configuration source */
UNIT_DEPENDENCY_PROC_SWAP = 1 << 7,
- _UNIT_DEPENDENCY_MASK_FULL = (1 << 8) - 1,
+ /* A dependency for units in slices assigned by directly setting Slice= */
+ UNIT_DEPENDENCY_SLICE_PROPERTY = 1 << 8,
+
+ _UNIT_DEPENDENCY_MASK_FULL = (1 << 9) - 1,
} UnitDependencyMask;
/* The Unit's dependencies[] hashmaps use this structure as value. It has the same size as a void pointer, and thus can
@@ -782,7 +785,7 @@ Unit *unit_follow_merge(Unit *u) _pure_;
int unit_load_fragment_and_dropin(Unit *u, bool fragment_required);
int unit_load(Unit *unit);
-int unit_set_slice(Unit *u, Unit *slice, UnitDependencyMask mask);
+int unit_set_slice(Unit *u, Unit *slice);
int unit_set_default_slice(Unit *u);
const char *unit_description(Unit *u) _pure_;