diff --git a/lib/internal.h b/lib/internal.h index a48f4478..91f16231 100644 --- a/lib/internal.h +++ b/lib/internal.h @@ -104,6 +104,7 @@ int device_is_rotational(struct device *device); size_t device_alignment(struct device *device); int device_direct_io(const struct device *device); int device_fallocate(struct device *device, uint64_t size); +void device_sync(struct device *device, int devfd); int device_open_locked(struct device *device, int flags); int device_read_lock(struct crypt_device *cd, struct device *device); diff --git a/lib/luks1/keyencryption.c b/lib/luks1/keyencryption.c index 68856be1..a19ab34c 100644 --- a/lib/luks1/keyencryption.c +++ b/lib/luks1/keyencryption.c @@ -193,8 +193,10 @@ int LUKS_encrypt_to_storage(char *src, size_t srcLength, r = 0; out: - if (devfd >= 0) + if (devfd >= 0) { + device_sync(device, devfd); close(devfd); + } if (r) log_err(ctx, _("IO error while encrypting keyslot.")); diff --git a/lib/luks1/keymanage.c b/lib/luks1/keymanage.c index 19e96b17..4034b38f 100644 --- a/lib/luks1/keymanage.c +++ b/lib/luks1/keymanage.c @@ -378,8 +378,10 @@ int LUKS_hdr_restore( /* Be sure to reload new data */ r = LUKS_read_phdr(hdr, 1, 0, ctx); out: - if (devfd >= 0) + if (devfd >= 0) { + device_sync(device, devfd); close(devfd); + } crypt_safe_free(buffer); return r; } @@ -681,6 +683,8 @@ int LUKS_write_phdr(struct luks_phdr *hdr, &convHdr, hdr_size) < hdr_size ? -EIO : 0; if (r) log_err(ctx, _("Error during update of LUKS header on device %s."), device_path(device)); + + device_sync(device, devfd); close(devfd); /* Re-read header from disk to be sure that in-memory and on-disk data are the same. */ diff --git a/lib/luks2/luks2_disk_metadata.c b/lib/luks2/luks2_disk_metadata.c index 4ed27bca..5006a7f9 100644 --- a/lib/luks2/luks2_disk_metadata.c +++ b/lib/luks2/luks2_disk_metadata.c @@ -341,6 +341,7 @@ static int hdr_write_disk(struct device *device, struct luks2_hdr *hdr, LUKS2_HDR_BIN_LEN, offset) < (ssize_t)LUKS2_HDR_BIN_LEN) r = -EIO; + device_sync(device, devfd); close(devfd); return r; } diff --git a/lib/luks2/luks2_json_metadata.c b/lib/luks2/luks2_json_metadata.c index 56fbfde1..f763412d 100644 --- a/lib/luks2/luks2_json_metadata.c +++ b/lib/luks2/luks2_json_metadata.c @@ -1195,8 +1195,10 @@ out: crypt_memzero(&tmp_hdr, sizeof(tmp_hdr)); crypt_safe_free(buffer); - if (devfd >= 0) + if (devfd >= 0) { + device_sync(device, devfd); close(devfd); + } if (!r) { LUKS2_hdr_free(hdr); diff --git a/lib/luks2/luks2_keyslot_luks2.c b/lib/luks2/luks2_keyslot_luks2.c index 3716c26c..5e1d348b 100644 --- a/lib/luks2/luks2_keyslot_luks2.c +++ b/lib/luks2/luks2_keyslot_luks2.c @@ -79,6 +79,8 @@ static int luks2_encrypt_to_storage(char *src, size_t srcLength, r = -EIO; else r = 0; + + device_sync(device, devfd); close(devfd); } else r = -EIO; diff --git a/lib/luks2/luks2_luks1_convert.c b/lib/luks2/luks2_luks1_convert.c index c785faec..04e38b34 100644 --- a/lib/luks2/luks2_luks1_convert.c +++ b/lib/luks2/luks2_luks1_convert.c @@ -461,6 +461,7 @@ static int move_keyslot_areas(struct crypt_device *cd, off_t offset_from, r = 0; out: + device_sync(device, devfd); close(devfd); crypt_memzero(buf, buf_size); free(buf); diff --git a/lib/utils_device.c b/lib/utils_device.c index 1f3a1688..966a9115 100644 --- a/lib/utils_device.c +++ b/lib/utils_device.c @@ -229,6 +229,16 @@ static int _open_locked(struct device *device, int flags) return fd; } +/* + * Common wrapper for device sync. + * FIXME: file descriptor will be in struct later. + */ +void device_sync(struct device *device, int devfd) +{ + if (fsync(devfd) == -1) + log_dbg("Cannot sync device %s.", device_path(device)); +} + /* * in non-locked mode returns always fd or -1 * @@ -242,7 +252,6 @@ static int device_open_internal(struct device *device, int flags) { int devfd; - flags |= O_SYNC; if (device->o_direct) flags |= O_DIRECT; diff --git a/lib/utils_wipe.c b/lib/utils_wipe.c index ab946a13..d0a6f6d7 100644 --- a/lib/utils_wipe.c +++ b/lib/utils_wipe.c @@ -213,7 +213,7 @@ int crypt_wipe_device(struct crypt_device *cd, } } - fsync(devfd); + device_sync(device, devfd); out: close(devfd); free(sf); diff --git a/lib/verity/verity.c b/lib/verity/verity.c index b411dd91..db682bda 100644 --- a/lib/verity/verity.c +++ b/lib/verity/verity.c @@ -201,6 +201,8 @@ int VERITY_write_sb(struct crypt_device *cd, if (r) log_err(cd, _("Error during update of verity header on device %s."), device_path(device)); + + device_sync(device, devfd); close(devfd); return r;