ecbff1
From e7e3e1d230c15079a3d1480c47076ffd89f1de63 Mon Sep 17 00:00:00 2001
ecbff1
From: Michal Sekletar <msekletar@users.noreply.github.com>
ecbff1
Date: Mon, 16 Oct 2017 16:15:05 +0200
ecbff1
Subject: [PATCH] mount: make sure we unmount tmpfs mounts before we deactivate
ecbff1
 swaps (#7076)
ecbff1
ecbff1
In the past we introduced this property just for tmp.mount. However on
ecbff1
todays systems usually there are many more tmpfs mounts. Most notably
ecbff1
mounts backing XDG_RUNTIME_DIR for each user.
ecbff1
ecbff1
Let's generalize what we already have for tmp.mount and implement the
ecbff1
ordering After=swap.target for all tmpfs based mounts.
ecbff1
ecbff1
(cherry picked from commit fab35afabf01a5dea651187a1ccb5ae7cd778f9d)
ecbff1
ecbff1
Conflicts:
ecbff1
	src/core/mount.h
ecbff1
ecbff1
Resolves: #1437518
ecbff1
---
ecbff1
 src/core/dbus-mount.c | 10 +---------
ecbff1
 src/core/mount.c      | 24 ++++++++++++++++++++++++
ecbff1
 src/core/mount.h      |  1 +
ecbff1
 units/tmp.mount       |  1 -
ecbff1
 4 files changed, 26 insertions(+), 10 deletions(-)
ecbff1
ecbff1
diff --git a/src/core/dbus-mount.c b/src/core/dbus-mount.c
ecbff1
index 53fe4edc3..04beba631 100644
ecbff1
--- a/src/core/dbus-mount.c
ecbff1
+++ b/src/core/dbus-mount.c
ecbff1
@@ -90,20 +90,12 @@ static int property_get_type(
ecbff1
                 sd_bus_error *error) {
ecbff1
 
ecbff1
         Mount *m = userdata;
ecbff1
-        const char *d;
ecbff1
 
ecbff1
         assert(bus);
ecbff1
         assert(reply);
ecbff1
         assert(m);
ecbff1
 
ecbff1
-        if (m->from_proc_self_mountinfo && m->parameters_proc_self_mountinfo.fstype)
ecbff1
-                d = m->parameters_proc_self_mountinfo.fstype;
ecbff1
-        else if (m->from_fragment && m->parameters_fragment.fstype)
ecbff1
-                d = m->parameters_fragment.fstype;
ecbff1
-        else
ecbff1
-                d = "";
ecbff1
-
ecbff1
-        return sd_bus_message_append(reply, "s", d);
ecbff1
+        return sd_bus_message_append(reply, "s", mount_get_fstype(m));
ecbff1
 }
ecbff1
 
ecbff1
 static BUS_DEFINE_PROPERTY_GET_ENUM(property_get_result, mount_result, MountResult);
ecbff1
diff --git a/src/core/mount.c b/src/core/mount.c
ecbff1
index 7ca7f5a25..a6d93b869 100644
ecbff1
--- a/src/core/mount.c
ecbff1
+++ b/src/core/mount.c
ecbff1
@@ -119,6 +119,21 @@ static bool needs_quota(const MountParameters *p) {
ecbff1
                                  "usrquota\0" "grpquota\0" "quota\0" "usrjquota\0" "grpjquota\0");
ecbff1
 }
ecbff1
 
ecbff1
+const char *mount_get_fstype(const Mount *m) {
ecbff1
+        const char *type = NULL;
ecbff1
+
ecbff1
+        assert(m);
ecbff1
+
ecbff1
+        if (m->from_proc_self_mountinfo && m->parameters_proc_self_mountinfo.fstype)
ecbff1
+                type = m->parameters_proc_self_mountinfo.fstype;
ecbff1
+        else if (m->from_fragment && m->parameters_fragment.fstype)
ecbff1
+                type = m->parameters_fragment.fstype;
ecbff1
+        else
ecbff1
+                type = "";
ecbff1
+
ecbff1
+        return type;
ecbff1
+}
ecbff1
+
ecbff1
 static void mount_init(Unit *u) {
ecbff1
         Mount *m = MOUNT(u);
ecbff1
 
ecbff1
@@ -236,6 +251,7 @@ _pure_ static MountParameters* get_mount_parameters(Mount *m) {
ecbff1
 
ecbff1
 static int mount_add_mount_links(Mount *m) {
ecbff1
         _cleanup_free_ char *parent = NULL;
ecbff1
+        const char *fstype;
ecbff1
         MountParameters *pm;
ecbff1
         Unit *other;
ecbff1
         Iterator i;
ecbff1
@@ -292,6 +308,14 @@ static int mount_add_mount_links(Mount *m) {
ecbff1
                 }
ecbff1
         }
ecbff1
 
ecbff1
+        /* If this is a tmpfs mount then we have to unmount it before we try to deactivate swaps */
ecbff1
+        fstype = mount_get_fstype(m);
ecbff1
+        if (streq(fstype, "tmpfs")) {
ecbff1
+                r = unit_add_dependency_by_name(UNIT(m), UNIT_AFTER, SPECIAL_SWAP_TARGET, NULL, true);
ecbff1
+                if (r < 0)
ecbff1
+                        return r;
ecbff1
+        }
ecbff1
+
ecbff1
         return 0;
ecbff1
 }
ecbff1
 
ecbff1
diff --git a/src/core/mount.h b/src/core/mount.h
ecbff1
index d6987e6fa..353222000 100644
ecbff1
--- a/src/core/mount.h
ecbff1
+++ b/src/core/mount.h
ecbff1
@@ -130,3 +130,4 @@ const char* mount_result_to_string(MountResult i) _const_;
ecbff1
 MountResult mount_result_from_string(const char *s) _pure_;
ecbff1
 
ecbff1
 void warn_if_dir_nonempty(const char *unit, const char* where);
ecbff1
+const char *mount_get_fstype(const Mount *m);
ecbff1
diff --git a/units/tmp.mount b/units/tmp.mount
ecbff1
index 8c53a8705..af0cf4a55 100644
ecbff1
--- a/units/tmp.mount
ecbff1
+++ b/units/tmp.mount
ecbff1
@@ -13,7 +13,6 @@ ConditionPathIsSymbolicLink=!/tmp
ecbff1
 DefaultDependencies=no
ecbff1
 Conflicts=umount.target
ecbff1
 Before=local-fs.target umount.target
ecbff1
-After=swap.target
ecbff1
 
ecbff1
 [Mount]
ecbff1
 What=tmpfs