summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2020-08-17 19:54:38 +0200
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>2020-08-26 14:33:29 +0200
commit3a2d169f3643cc37fa889b61dfba80794f3c99d1 (patch)
treea7b2f2e52cabd6b0d2e9969f9f9c7a3d7bae2887
parent84e1ab74d274de2a43bfa4f67a81da97635fd27c (diff)
downloadsystemd-3a2d169f3643cc37fa889b61dfba80794f3c99d1.tar.gz
homework: sync everything to disk before we rename LUKS loopback file into place
This how this works on Linux: when atomically creating a file we need to fully populate it under a temporary name and then when we are fully done, sync it and the directory it is contained in, before renaming it to the final name. (cherry picked from commit a2a8a509cd56955c0ce42ba0650d163e0d3eeb82)
-rw-r--r--src/home/homework-luks.c14
1 files changed, 14 insertions, 0 deletions
diff --git a/src/home/homework-luks.c b/src/home/homework-luks.c
index ba47688b0f..be296f1a4b 100644
--- a/src/home/homework-luks.c
+++ b/src/home/homework-luks.c
@@ -2174,8 +2174,22 @@ int home_create_luks(
goto fail;
}
+ /* Sync everything to disk before we move things into place under the final name. */
+ if (fsync(image_fd) < 0) {
+ r = log_error_errno(r, "Failed to synchronize image to disk: %m");
+ goto fail;
+ }
+
if (disk_uuid_path)
(void) ioctl(image_fd, BLKRRPART, 0);
+ else {
+ /* If we operate on a file, sync the contaning directory too. */
+ r = fsync_directory_of_file(image_fd);
+ if (r < 0) {
+ log_error_errno(r, "Failed to synchronize directory of image file to disk: %m");
+ goto fail;
+ }
+ }
/* Let's close the image fd now. If we are operating on a real block device this will release the BSD
* lock that ensures udev doesn't interfere with what we are doing */