]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
switch-root: automatically make target switch root dir a mount point
authorLennart Poettering <lennart@poettering.net>
Fri, 2 Jun 2023 16:24:27 +0000 (18:24 +0200)
committerLennart Poettering <lennart@poettering.net>
Fri, 2 Jun 2023 16:43:10 +0000 (18:43 +0200)
Let's make sure implicitly that the target directory is a mount point,
instead of doing so manually beforehand. This allows us to drop this
step from the transition into the /run/initramfs/ dir at shutdown.

During the initrd→host transition the switch root operations so far
where towards pre-existing mount points, but there are cetrainly
usecases where it might make sense to siwtch into arbitrary
subdirectories, too.

src/shared/switch-root.c
src/shutdown/shutdown.c

index 17078c049035a1f15ed8428cd406f75244af3052..070d5bd908b3c24b7cc70b06176afef2e338558a 100644 (file)
@@ -66,6 +66,11 @@ int switch_root(const char *new_root,
                 return 0;
         }
 
+        /* Make the new root directory a mount point if it isn't */
+        r = fd_make_mount_point(new_root_fd);
+        if (r < 0)
+                return log_error_errno(r, "Failed to make new root directory a mount point: %m");
+
         if (FLAGS_SET(flags, SWITCH_ROOT_DESTROY_OLD_ROOT)) {
                 istmp = fd_is_temporary_fs(old_root_fd);
                 if (istmp < 0)
index cdf828616ea7dd426877d7d22ca80358703d4ea8..f8a9b0243a0778828fb50299679a11de3ffe68ef 100644 (file)
@@ -159,12 +159,6 @@ static int parse_argv(int argc, char *argv[]) {
 }
 
 static int switch_root_initramfs(void) {
-        if (mount("/run/initramfs", "/run/initramfs", NULL, MS_BIND, NULL) < 0)
-                return log_error_errno(errno, "Failed to mount bind /run/initramfs on /run/initramfs: %m");
-
-        if (mount(NULL, "/run/initramfs", NULL, MS_PRIVATE, NULL) < 0)
-                return log_error_errno(errno, "Failed to make /run/initramfs private mount: %m");
-
         /* Do not detach the old root, because /run/initramfs/shutdown needs to access it.
          *
          * Disable sync() during switch-root, we after all sync'ed here plenty, and a dumb sync (as opposed