]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
bootctl: let's be paranoid and synchronize the ESP in full after all changes
authorLennart Poettering <lennart@poettering.net>
Fri, 22 Jun 2018 09:36:58 +0000 (11:36 +0200)
committerLennart Poettering <lennart@poettering.net>
Mon, 8 Oct 2018 19:40:44 +0000 (21:40 +0200)
We already synchronize all files we write individually, as well as the
directories they are stored in. Let's also synchronize the ESP as a
whole after our work, just in case.

src/boot/bootctl.c

index 827927f18b5aa709b7256952f7ff2d3b3423a32d..0ee908e8a3497b3355fc03424f984774d2ea2983 100644 (file)
@@ -1066,6 +1066,22 @@ static int verb_list(int argc, char *argv[], void *userdata) {
         return 0;
 }
 
+static int sync_esp(void) {
+        _cleanup_close_ int fd = -1;
+
+        if (!arg_path)
+                return 0;
+
+        fd = open(arg_path, O_CLOEXEC|O_DIRECTORY|O_RDONLY);
+        if (fd < 0)
+                return log_error_errno(errno, "Couldn't open ESP '%s' for synchronization: %m", arg_path);
+
+        if (syncfs(fd) < 0)
+                return log_error_errno(errno, "Failed to synchronize the ESP '%s': %m", arg_path);
+
+        return 1;
+}
+
 static int verb_install(int argc, char *argv[], void *userdata) {
 
         sd_id128_t uuid = SD_ID128_NULL;
@@ -1092,6 +1108,8 @@ static int verb_install(int argc, char *argv[], void *userdata) {
                 }
         }
 
+        (void) sync_esp();
+
         if (arg_touch_variables)
                 r = install_variables(arg_path,
                                       part, pstart, psize, uuid,
@@ -1111,6 +1129,8 @@ static int verb_remove(int argc, char *argv[], void *userdata) {
 
         r = remove_binaries(arg_path);
 
+        (void) sync_esp();
+
         if (arg_touch_variables) {
                 int q;