]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
shutdown: fsync() before detaching loopback devices
authorLennart Poettering <lennart@poettering.net>
Tue, 22 Sep 2020 09:19:37 +0000 (11:19 +0200)
committerLennart Poettering <lennart@poettering.net>
Wed, 23 Sep 2020 16:33:48 +0000 (18:33 +0200)
This is a follow-up for cae1e8fb88c5a6b0960a2d0be3df8755f0c78462: we
also call the detach ioctls in the shutdown code, hence add the fsync()s
there too, just to be safe.

src/shutdown/umount.c

index 0eb694c1af9b589aaad39bee882c09dd542f5696..307944c65751333aa110a7ddb197a2148f709ccf 100644 (file)
@@ -387,8 +387,15 @@ static int delete_loopback(const char *device) {
         assert(device);
 
         fd = open(device, O_RDONLY|O_CLOEXEC);
-        if (fd < 0)
+        if (fd < 0) {
+                log_debug_errno(errno, "Failed to open loopback device %s: %m", device);
                 return errno == ENOENT ? 0 : -errno;
+        }
+
+        /* Loopback block devices don't sync in-flight blocks when we clear the fd, hence sync explicitly
+         * first */
+        if (fsync(fd) < 0)
+                log_debug_errno(errno, "Failed to sync loop block device %s, ignoring: %m", device);
 
         if (ioctl(fd, LOOP_CLR_FD, 0) < 0) {
                 if (errno == ENXIO) /* Nothing bound, didn't do anything */