From: Harald Seiler Date: Sun, 6 Sep 2020 19:35:33 +0000 (+0200) Subject: machine-id-setup: sync before committing machine-id X-Git-Tag: v247-rc1~44^2~4 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=c261a5d01469a3f5b6c448c066ea7ad6d14a5300;p=thirdparty%2Fsystemd.git machine-id-setup: sync before committing machine-id 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. --- diff --git a/src/core/machine-id-setup.c b/src/core/machine-id-setup.c index 4e9a8d266e6..c55e0b53212 100644 --- a/src/core/machine-id-setup.c +++ b/src/core/machine-id-setup.c @@ -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. */