summaryrefslogtreecommitdiff
path: root/src/core/swap.c
diff options
context:
space:
mode:
authorZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>2014-09-28 10:37:52 -0400
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>2014-09-29 11:08:12 -0400
commitcdc8982030271785d650af410230397bbb5a4be9 (patch)
tree6cfee28097ed15851733f6a434a8b52ca4724fbd /src/core/swap.c
parent4f52d3fe2da7c3449b7fbfaa7c64a83354d3b56c (diff)
core/swap: follow the configured unit by default
Phenomenon: parameters configured in /etc/fstab for swap units are ignored. E.g. pri= settings have no effect when systemd starts swap units. What is even more confusing, .swap units for the name used in /etc/fstab initially show proper values for Priority=, but after starting them, they are re-initalized from /proc/swaps and show the -1 value from /proc/swaps. Change swap units to follow the original configured unit. This way proper settings are used when starting the swap.
Diffstat (limited to 'src/core/swap.c')
-rw-r--r--src/core/swap.c21
1 files changed, 18 insertions, 3 deletions
diff --git a/src/core/swap.c b/src/core/swap.c
index 36c9e029e9..ef90d0efde 100644
--- a/src/core/swap.c
+++ b/src/core/swap.c
@@ -1208,11 +1208,25 @@ static Unit *swap_following(Unit *u) {
assert(s);
- if (streq_ptr(s->what, s->devnode))
+ /* If the user configured the swap through /etc/fstab or
+ * a device unit, follow that. */
+
+ if (s->from_fragment)
return NULL;
- /* Make everybody follow the unit that's named after the swap
- * device in the kernel */
+ LIST_FOREACH_AFTER(same_devnode, other, s)
+ if (other->from_fragment)
+ return UNIT(other);
+
+ LIST_FOREACH_BEFORE(same_devnode, other, s)
+ if (other->from_fragment)
+ return UNIT(other);
+
+ /* Otherwise make everybody follow the unit that's named after
+ * the swap device in the kernel */
+
+ if (streq_ptr(s->what, s->devnode))
+ return NULL;
LIST_FOREACH_AFTER(same_devnode, other, s)
if (streq_ptr(other->what, other->devnode))
@@ -1225,6 +1239,7 @@ static Unit *swap_following(Unit *u) {
first = other;
}
+ /* Fall back to the first on the list */
return UNIT(first);
}