]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
machine-id-setup: sync before committing machine-id
authorHarald Seiler <hws@denx.de>
Sun, 6 Sep 2020 19:35:33 +0000 (21:35 +0200)
committerHarald Seiler <hws@denx.de>
Mon, 19 Oct 2020 14:28:22 +0000 (16:28 +0200)
sync() before committing a transient machine-id to disk.  This will
ensure that any filesystem changes made by first-boot units will have
been persisted before the first boot is marked as completed.

src/core/machine-id-setup.c

index 4e9a8d266e6cbf80b6024c9015b350f3b9a90844..c55e0b53212389ac30ffb6b321b1108a74317c5a 100644 (file)
@@ -202,10 +202,22 @@ finish:
 
 int machine_id_commit(const char *root) {
         _cleanup_close_ int fd = -1, initial_mntns_fd = -1;
-        const char *etc_machine_id;
+        const char *etc_machine_id, *sync_path;
         sd_id128_t id;
         int r;
 
+        /* Before doing anything, sync everything to ensure any changes by first-boot units are persisted.
+         *
+         * First, explicitly sync the file systems we care about and check if it worked. */
+        FOREACH_STRING(sync_path, "/etc/", "/var/") {
+                r = syncfs_path(AT_FDCWD, sync_path);
+                if (r < 0)
+                        return log_error_errno(r, "Cannot sync %s: %m", sync_path);
+        }
+
+        /* Afterwards, sync() the rest too, but we can't check the return value for these. */
+        sync();
+
         /* Replaces a tmpfs bind mount of /etc/machine-id by a proper file, atomically. For this, the umount is removed
          * in a mount namespace, a new file is created at the right place. Afterwards the mount is also removed in the
          * original mount namespace, thus revealing the file that was just created. */