Blame SOURCES/cryptsetup-2.2.1-take-optimal-io-size-in-account-with-LUKS2-reencrypt.patch

0bd263
From d13a6f7487eb7519bc1e4302085b21ca98afabc0 Mon Sep 17 00:00:00 2001
0bd263
From: Ondrej Kozina <okozina@redhat.com>
0bd263
Date: Thu, 22 Aug 2019 17:05:43 +0200
0bd263
Subject: [PATCH 1/5] Take optimal io size in account with LUKS2 reencryption.
0bd263
0bd263
If device properly exposes optimal io size, let's align
0bd263
reencryption hotzone to it. Otherwise device-mapper driver
0bd263
complaints about misaligned tables and reencryption performance
0bd263
is not optimal.
0bd263
---
0bd263
 lib/luks2/luks2_reencrypt.c | 23 +++++++++++++++++++++--
0bd263
 1 file changed, 21 insertions(+), 2 deletions(-)
0bd263
0bd263
diff --git a/lib/luks2/luks2_reencrypt.c b/lib/luks2/luks2_reencrypt.c
0bd263
index 1d70aaf..1f5eb5f 100644
0bd263
--- a/lib/luks2/luks2_reencrypt.c
0bd263
+++ b/lib/luks2/luks2_reencrypt.c
0bd263
@@ -817,8 +817,13 @@ static int reencrypt_offset(struct luks2_hdr *hdr,
0bd263
 	return -EINVAL;
0bd263
 }
0bd263
 
0bd263
-static uint64_t reencrypt_length(struct luks2_hdr *hdr, struct luks2_reenc_context *rh, uint64_t keyslot_area_length, uint64_t length_max)
0bd263
+static uint64_t reencrypt_length(struct crypt_device *cd,
0bd263
+		struct luks2_hdr *hdr,
0bd263
+		struct luks2_reenc_context *rh,
0bd263
+		uint64_t keyslot_area_length,
0bd263
+		uint64_t length_max)
0bd263
 {
0bd263
+	unsigned long dummy, optimal_alignment;
0bd263
 	uint64_t length;
0bd263
 
0bd263
 	if (rh->rp.type == REENC_PROTECTION_NONE)
0bd263
@@ -835,6 +840,20 @@ static uint64_t reencrypt_length(struct luks2_hdr *hdr, struct luks2_reenc_conte
0bd263
 
0bd263
 	length -= (length % rh->alignment);
0bd263
 
0bd263
+	/* Emits error later */
0bd263
+	if (!length)
0bd263
+		return length;
0bd263
+
0bd263
+	device_topology_alignment(cd, crypt_data_device(cd), &optimal_alignment, &dummy, length);
0bd263
+
0bd263
+	/* we have to stick with encryption sector size alignment */
0bd263
+	if (optimal_alignment % rh->alignment)
0bd263
+		return length;
0bd263
+
0bd263
+	/* align to opt-io size only if remaining size allows it */
0bd263
+	if (length > optimal_alignment)
0bd263
+		length -= (length % optimal_alignment);
0bd263
+
0bd263
 	return length;
0bd263
 }
0bd263
 
0bd263
@@ -920,7 +939,7 @@ static int reencrypt_context_init(struct crypt_device *cd, struct luks2_hdr *hdr
0bd263
 	} else
0bd263
 		rh->fixed_length = false;
0bd263
 
0bd263
-	rh->length = reencrypt_length(hdr, rh, area_length, params->max_hotzone_size << SECTOR_SHIFT);
0bd263
+	rh->length = reencrypt_length(cd, hdr, rh, area_length, params->max_hotzone_size << SECTOR_SHIFT);
0bd263
 	if (reencrypt_offset(hdr, rh->direction, device_size, &rh->length, &rh->offset)) {
0bd263
 		log_dbg(cd, "Failed to get reencryption offset.");
0bd263
 		return -EINVAL;
0bd263
-- 
0bd263
1.8.3.1
0bd263