summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichal Sekletar <msekletar@users.noreply.github.com>2017-10-16 16:15:05 +0200
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>2017-10-16 16:15:05 +0200
commitfab35afabf01a5dea651187a1ccb5ae7cd778f9d (patch)
tree782bd51c511523c1d7e18152021fc9f62db24df0
parent0051ca1f63e6d9c481e3b5f989e72ff538b17daa (diff)
downloadsystemd-fab35afabf01a5dea651187a1ccb5ae7cd778f9d.tar.gz
mount: make sure we unmount tmpfs mounts before we deactivate swaps (#7076)
In the past we introduced this property just for tmp.mount. However on todays systems usually there are many more tmpfs mounts. Most notably mounts backing XDG_RUNTIME_DIR for each user. Let's generalize what we already have for tmp.mount and implement the ordering After=swap.target for all tmpfs based mounts.
-rw-r--r--src/core/dbus-mount.c10
-rw-r--r--src/core/mount.c24
-rw-r--r--src/core/mount.h2
-rw-r--r--units/tmp.mount1
4 files changed, 27 insertions, 10 deletions
diff --git a/src/core/dbus-mount.c b/src/core/dbus-mount.c
index 76a7a7ce97..1f9c254c39 100644
--- a/src/core/dbus-mount.c
+++ b/src/core/dbus-mount.c
@@ -88,20 +88,12 @@ static int property_get_type(
sd_bus_error *error) {
Mount *m = userdata;
- const char *d;
assert(bus);
assert(reply);
assert(m);
- if (m->from_proc_self_mountinfo && m->parameters_proc_self_mountinfo.fstype)
- d = m->parameters_proc_self_mountinfo.fstype;
- else if (m->from_fragment && m->parameters_fragment.fstype)
- d = m->parameters_fragment.fstype;
- else
- d = "";
-
- return sd_bus_message_append(reply, "s", d);
+ return sd_bus_message_append(reply, "s", mount_get_fstype(m));
}
static BUS_DEFINE_PROPERTY_GET_ENUM(property_get_result, mount_result, MountResult);
diff --git a/src/core/mount.c b/src/core/mount.c
index 903b3a9c1b..9fde132faa 100644
--- a/src/core/mount.c
+++ b/src/core/mount.c
@@ -156,6 +156,21 @@ static bool needs_quota(const MountParameters *p) {
"usrquota\0" "grpquota\0" "quota\0" "usrjquota\0" "grpjquota\0");
}
+const char *mount_get_fstype(const Mount *m) {
+ const char *type = NULL;
+
+ assert(m);
+
+ if (m->from_proc_self_mountinfo && m->parameters_proc_self_mountinfo.fstype)
+ type = m->parameters_proc_self_mountinfo.fstype;
+ else if (m->from_fragment && m->parameters_fragment.fstype)
+ type = m->parameters_fragment.fstype;
+ else
+ type = "";
+
+ return type;
+}
+
static void mount_init(Unit *u) {
Mount *m = MOUNT(u);
@@ -267,6 +282,7 @@ _pure_ static MountParameters* get_mount_parameters(Mount *m) {
static int mount_add_mount_links(Mount *m) {
_cleanup_free_ char *parent = NULL;
+ const char *fstype;
MountParameters *pm;
Unit *other;
Iterator i;
@@ -324,6 +340,14 @@ static int mount_add_mount_links(Mount *m) {
}
}
+ /* If this is a tmpfs mount then we have to unmount it before we try to deactivate swaps */
+ fstype = mount_get_fstype(m);
+ if (streq(fstype, "tmpfs")) {
+ r = unit_add_dependency_by_name(UNIT(m), UNIT_AFTER, SPECIAL_SWAP_TARGET, NULL, true);
+ if (r < 0)
+ return r;
+ }
+
return 0;
}
diff --git a/src/core/mount.h b/src/core/mount.h
index f81e4217df..f37094e39f 100644
--- a/src/core/mount.h
+++ b/src/core/mount.h
@@ -110,3 +110,5 @@ MountExecCommand mount_exec_command_from_string(const char *s) _pure_;
const char* mount_result_to_string(MountResult i) _const_;
MountResult mount_result_from_string(const char *s) _pure_;
+
+const char *mount_get_fstype(const Mount *m);
diff --git a/units/tmp.mount b/units/tmp.mount
index 3a333d22ec..a057fa1cf9 100644
--- a/units/tmp.mount
+++ b/units/tmp.mount
@@ -13,7 +13,6 @@ ConditionPathIsSymbolicLink=!/tmp
DefaultDependencies=no
Conflicts=umount.target
Before=local-fs.target umount.target
-After=swap.target
[Mount]
What=tmpfs