|
|
|
From 4fec67c88f7ddd02fecf711996f42ed4c9d24da6 Mon Sep 17 00:00:00 2001
|
|
|
|
From: Franck Bui <fbui@suse.com>
|
|
|
|
Date: Mon, 23 Nov 2015 11:14:10 +0100
|
|
|
|
Subject: [PATCH] make sure all swap units are ordered before the swap target
|
|
|
|
|
|
|
|
When shutting down the system, the swap devices can be disabled long
|
|
|
|
time before the swap target is stopped. They're actually the first
|
|
|
|
units systemd turns off on my system.
|
|
|
|
|
|
|
|
This is incorrect and due to swap devices having multiple associated
|
|
|
|
swap unit files. The main one is usually created by the fstab
|
|
|
|
generator and is used to start the swap device.
|
|
|
|
|
|
|
|
Once done, systemd creates some 'alias' units for the same swap
|
|
|
|
device, one for each swap dev link. But those units are missing an
|
|
|
|
ordering dependencies which was created by the fstab generator for the
|
|
|
|
main swap unit.
|
|
|
|
|
|
|
|
Therefore during shutdown those 'alias' units can be stopped at
|
|
|
|
anytime before unmount.target target.
|
|
|
|
|
|
|
|
This patch makes sure that all swap units are stopped after the
|
|
|
|
swap.target target.
|
|
|
|
|
|
|
|
Cherry-picked from: 8bf23dc757dacaaf5a8d2c21aabf71aee08d1a04
|
|
|
|
Resolves: #1298355
|
|
|
|
---
|
|
|
|
src/core/swap.c | 8 ++++++++
|
|
|
|
1 file changed, 8 insertions(+)
|
|
|
|
|
|
|
|
diff --git a/src/core/swap.c b/src/core/swap.c
|
|
|
|
index 42f995990c..984be2d9a9 100644
|
|
|
|
--- a/src/core/swap.c
|
|
|
|
+++ b/src/core/swap.c
|
|
|
|
@@ -210,6 +210,8 @@ static int swap_add_device_links(Swap *s) {
|
|
|
|
}
|
|
|
|
|
|
|
|
static int swap_add_default_dependencies(Swap *s) {
|
|
|
|
+ int r;
|
|
|
|
+
|
|
|
|
assert(s);
|
|
|
|
|
|
|
|
if (UNIT(s)->manager->running_as != SYSTEMD_SYSTEM)
|
|
|
|
@@ -218,6 +220,12 @@ static int swap_add_default_dependencies(Swap *s) {
|
|
|
|
if (detect_container(NULL) > 0)
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
+ /* swap units generated for the swap dev links are missing the
|
|
|
|
+ * ordering dep against the swap target. */
|
|
|
|
+ r = unit_add_dependency_by_name(UNIT(s), UNIT_BEFORE, SPECIAL_SWAP_TARGET, NULL, true);
|
|
|
|
+ if (r < 0)
|
|
|
|
+ return r;
|
|
|
|
+
|
|
|
|
return unit_add_two_dependencies_by_name(UNIT(s), UNIT_BEFORE, UNIT_CONFLICTS, SPECIAL_UMOUNT_TARGET, NULL, true);
|
|
|
|
}
|
|
|
|
|