summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Gundersen <teg@jklm.no>2013-08-19 12:34:13 +0800
committerTom Gundersen <teg@jklm.no>2013-09-11 14:42:36 +0200
commit88ac30a1979365a926bc85a9cd7150da85823077 (patch)
treeebd29c63e314c9e6e65edeb94c4711325c7a98fe
parent5073f89f102d98c27c4f3aefb5643b50a5301d10 (diff)
mount: filesystems mounted in the initrd should not conflict with umount.target in the real root
These mounts should be kept around and unmounted in the shutdown ramfs. Currently, we will still attempt to umount these in the final kill spree, but we should consider avoiding that too. Also, the should_umount function should be generalised and put into util.c or something like that, but we are still discussing precisely how.
-rw-r--r--src/core/mount.c26
1 files changed, 21 insertions, 5 deletions
diff --git a/src/core/mount.c b/src/core/mount.c
index d436a84606..5c18d4e463 100644
--- a/src/core/mount.c
+++ b/src/core/mount.c
@@ -447,6 +447,21 @@ static int mount_add_quota_links(Mount *m) {
return 0;
}
+static bool should_umount(Mount *m) {
+ MountParameters *p;
+
+ if (path_equal(m->where, "/") ||
+ path_equal(m->where, "/usr"))
+ return false;
+
+ p = get_mount_parameters(m);
+ if (p && mount_test_option(p->options, "x-initrd.mount") &&
+ !in_initrd())
+ return false;
+
+ return true;
+}
+
static int mount_add_default_dependencies(Mount *m) {
const char *after, *after2, *online;
MountParameters *p;
@@ -491,9 +506,11 @@ static int mount_add_default_dependencies(Mount *m) {
return r;
}
- r = unit_add_two_dependencies_by_name(UNIT(m), UNIT_BEFORE, UNIT_CONFLICTS, SPECIAL_UMOUNT_TARGET, NULL, true);
- if (r < 0)
- return r;
+ if (should_umount(m)) {
+ r = unit_add_two_dependencies_by_name(UNIT(m), UNIT_BEFORE, UNIT_CONFLICTS, SPECIAL_UMOUNT_TARGET, NULL, true);
+ if (r < 0)
+ return r;
+ }
return 0;
}
@@ -1553,8 +1570,7 @@ static int mount_add_one(
if (r < 0)
goto fail;
- if (!path_equal(where, "/") &&
- !path_equal(where, "/usr")) {
+ if (should_umount(MOUNT(u))) {
r = unit_add_dependency_by_name(u, UNIT_CONFLICTS, SPECIAL_UMOUNT_TARGET, NULL, true);
if (r < 0)
goto fail;