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