From 83c227d53c7cd6f454cd407b44c0151d528e7162 Mon Sep 17 00:00:00 2001 From: Ondrej Kozina Date: Fri, 10 May 2019 15:27:53 +0200 Subject: [PATCH] Sync device using internal write enabled descriptor. --- lib/internal.h | 2 +- lib/luks1/keyencryption.c | 3 +-- lib/luks1/keymanage.c | 5 ++--- lib/luks2/luks2_disk_metadata.c | 2 +- lib/luks2/luks2_json_metadata.c | 3 +-- lib/luks2/luks2_keyslot_luks2.c | 2 +- lib/luks2/luks2_luks1_convert.c | 2 +- lib/utils_device.c | 8 +++++--- lib/utils_wipe.c | 2 +- lib/verity/verity.c | 2 +- 10 files changed, 15 insertions(+), 16 deletions(-) diff --git a/lib/internal.h b/lib/internal.h index ad59c539..df7a98e4 100644 --- a/lib/internal.h +++ b/lib/internal.h @@ -129,7 +129,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 crypt_device *cd, struct device *device, int devfd); +void device_sync(struct crypt_device *cd, struct device *device); int device_check_size(struct crypt_device *cd, struct device *device, uint64_t req_offset, int falloc); diff --git a/lib/luks1/keyencryption.c b/lib/luks1/keyencryption.c index 2a7b6e0b..23b5e477 100644 --- a/lib/luks1/keyencryption.c +++ b/lib/luks1/keyencryption.c @@ -196,8 +196,7 @@ int LUKS_encrypt_to_storage(char *src, size_t srcLength, r = 0; out: - if (devfd >= 0) - device_sync(ctx, device, devfd); + device_sync(ctx, device); if (r) log_err(ctx, _("IO error while encrypting keyslot.")); diff --git a/lib/luks1/keymanage.c b/lib/luks1/keymanage.c index 734a3a98..6ef69a00 100644 --- a/lib/luks1/keymanage.c +++ b/lib/luks1/keymanage.c @@ -359,8 +359,7 @@ int LUKS_hdr_restore( /* Be sure to reload new data */ r = LUKS_read_phdr(hdr, 1, 0, ctx); out: - if (devfd >= 0) - device_sync(ctx, device, devfd); + device_sync(ctx, device); crypt_safe_free(buffer); return r; } @@ -661,7 +660,7 @@ int LUKS_write_phdr(struct luks_phdr *hdr, if (r) log_err(ctx, _("Error during update of LUKS header on device %s."), device_path(device)); - device_sync(ctx, device, devfd); + device_sync(ctx, device); /* Re-read header from disk to be sure that in-memory and on-disk data are the same. */ if (!r) { diff --git a/lib/luks2/luks2_disk_metadata.c b/lib/luks2/luks2_disk_metadata.c index 7d249d70..aac3d782 100644 --- a/lib/luks2/luks2_disk_metadata.c +++ b/lib/luks2/luks2_disk_metadata.c @@ -345,7 +345,7 @@ static int hdr_write_disk(struct crypt_device *cd, LUKS2_HDR_BIN_LEN, offset) < (ssize_t)LUKS2_HDR_BIN_LEN) r = -EIO; - device_sync(cd, device, devfd); + device_sync(cd, device); return r; } diff --git a/lib/luks2/luks2_json_metadata.c b/lib/luks2/luks2_json_metadata.c index c9932f6b..fababbd1 100644 --- a/lib/luks2/luks2_json_metadata.c +++ b/lib/luks2/luks2_json_metadata.c @@ -1256,8 +1256,7 @@ out: crypt_memzero(&tmp_hdr, sizeof(tmp_hdr)); crypt_safe_free(buffer); - if (devfd >= 0) - device_sync(cd, device, devfd); + device_sync(cd, device); return r; } diff --git a/lib/luks2/luks2_keyslot_luks2.c b/lib/luks2/luks2_keyslot_luks2.c index fb39898a..da9951f9 100644 --- a/lib/luks2/luks2_keyslot_luks2.c +++ b/lib/luks2/luks2_keyslot_luks2.c @@ -83,7 +83,7 @@ static int luks2_encrypt_to_storage(char *src, size_t srcLength, else r = 0; - device_sync(cd, device, devfd); + device_sync(cd, device); } else r = -EIO; diff --git a/lib/luks2/luks2_luks1_convert.c b/lib/luks2/luks2_luks1_convert.c index 8d0ca4db..8ec74b83 100644 --- a/lib/luks2/luks2_luks1_convert.c +++ b/lib/luks2/luks2_luks1_convert.c @@ -465,7 +465,7 @@ static int move_keyslot_areas(struct crypt_device *cd, off_t offset_from, r = 0; out: - device_sync(cd, device, devfd); + device_sync(cd, device); crypt_memzero(buf, buf_size); free(buf); diff --git a/lib/utils_device.c b/lib/utils_device.c index 2d4fe6da..2aa08c0b 100644 --- a/lib/utils_device.c +++ b/lib/utils_device.c @@ -240,11 +240,13 @@ static int _open_locked(struct crypt_device *cd, struct device *device, int flag /* * Common wrapper for device sync. - * FIXME: file descriptor will be in struct later. */ -void device_sync(struct crypt_device *cd, struct device *device, int devfd) +void device_sync(struct crypt_device *cd, struct device *device) { - if (fsync(devfd) == -1) + if (!device || device->dev_fd < 0) + return; + + if (fsync(device->dev_fd) == -1) log_dbg(cd, "Cannot sync device %s.", device_path(device)); } diff --git a/lib/utils_wipe.c b/lib/utils_wipe.c index f936ef8b..a89a104e 100644 --- a/lib/utils_wipe.c +++ b/lib/utils_wipe.c @@ -215,7 +215,7 @@ int crypt_wipe_device(struct crypt_device *cd, } } - device_sync(cd, device, devfd); + device_sync(cd, device); out: free(sf); return r; diff --git a/lib/verity/verity.c b/lib/verity/verity.c index e97ec1d7..6aaf3785 100644 --- a/lib/verity/verity.c +++ b/lib/verity/verity.c @@ -199,7 +199,7 @@ int VERITY_write_sb(struct crypt_device *cd, log_err(cd, _("Error during update of verity header on device %s."), device_path(device)); - device_sync(cd, device, devfd); + device_sync(cd, device); return r; }