]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
switch-root: sync() before MNT_DETACH unmounting all old mounts 27700/head
authorLennart Poettering <lennart@poettering.net>
Fri, 19 May 2023 12:22:14 +0000 (14:22 +0200)
committerLennart Poettering <lennart@poettering.net>
Fri, 19 May 2023 12:31:11 +0000 (14:31 +0200)
As discussed here:

https://github.com/systemd/systemd/pull/27670#discussion_r1196716794

src/shared/switch-root.c

index 2431facba006422f30ff57996f17a1772f794bd4..d5b3d169bf87194bbec130ee5cebe159b494f6ec 100644 (file)
@@ -63,6 +63,13 @@ int switch_root(const char *new_root,
                         (void) mkdir_p_label(resolved_old_root_after, 0755);
         }
 
+        /* We are about to unmount various file systems with MNT_DETACH (either explicitly via umount() or
+         * indirectly via pivot_root()), and thus do not synchronously wait for them to be fully sync'ed —
+         * all while making them invisible/inaccessible in the file system tree for later code. That makes
+         * sync'ing them then difficult. Let's hence issue a manual sync() here, so that we at least can
+         * guarantee all file systems are an a good state before entering this state. */
+        sync();
+
         /* Work-around for kernel design: the kernel refuses MS_MOVE if any file systems are mounted
          * MS_SHARED. Hence remount them MS_PRIVATE here as a work-around.
          *