[PATCH v1 10/11] blk-crypto: add slot_offset to blk_crypto_profile

From: Linlin Zhang

Date: Thu Aug 27 2026 - 12:14:53 EST


From: linlzhan <linlin.zhang@xxxxxxxxxxxxxxxx>

On platforms where ICE keyslots are partitioned across the host and
guest VMs, the host's physical keyslot range does not necessarily start
at slot 0. blk_crypto_keyslot_index() currently returns a 0-based
array index, which is wrong for such configurations — hardware
programming requires the physical slot number, not the array position.

Add an unsigned int slot_offset field to struct blk_crypto_profile.
It defaults to zero (no change for existing drivers) and is set by
storage drivers that share ICE hardware across guests.

Update blk_crypto_keyslot_index() to add slot_offset to the array
index so that callers always receive the correct physical ICE keyslot
number to program into hardware.

Signed-off-by: linlzhan <linlin.zhang@xxxxxxxxxxxxxxxx>
---
block/blk-crypto-profile.c | 7 ++++---
include/linux/blk-crypto-profile.h | 9 +++++++++
2 files changed, 13 insertions(+), 3 deletions(-)

diff --git a/block/blk-crypto-profile.c b/block/blk-crypto-profile.c
index 53126c091b0b..64202d64a018 100644
--- a/block/blk-crypto-profile.c
+++ b/block/blk-crypto-profile.c
@@ -218,14 +218,15 @@ blk_crypto_find_and_grab_keyslot(struct blk_crypto_profile *profile,
}

/**
- * blk_crypto_keyslot_index() - Get the index of a keyslot
+ * blk_crypto_keyslot_index() - Get the physical index of a keyslot
* @slot: a keyslot that blk_crypto_get_keyslot() returned
*
- * Return: the 0-based index of the keyslot within the device's keyslots.
+ * Return: the physical ICE keyslot index, i.e. the 0-based position of @slot
+ * within the profile's keyslot array plus @slot->profile->slot_offset.
*/
unsigned int blk_crypto_keyslot_index(struct blk_crypto_keyslot *slot)
{
- return slot - slot->profile->slots;
+ return (slot - slot->profile->slots) + slot->profile->slot_offset;
}
EXPORT_SYMBOL_GPL(blk_crypto_keyslot_index);

diff --git a/include/linux/blk-crypto-profile.h b/include/linux/blk-crypto-profile.h
index 4f39e9cd7576..a9bdc05abfa3 100644
--- a/include/linux/blk-crypto-profile.h
+++ b/include/linux/blk-crypto-profile.h
@@ -162,6 +162,15 @@ struct blk_crypto_profile {
*/
struct device *dev;

+ /**
+ * @slot_offset: offset added to the slot array index to obtain the
+ * physical ICE keyslot number. Zero in the common case. Set to a
+ * non-zero value by storage drivers that share ICE hardware across
+ * multiple guests, where the host's keyslots do not start at physical
+ * slot 0.
+ */
+ unsigned int slot_offset;
+
/* private: The following fields shouldn't be accessed by drivers. */

/* Number of keyslots, or 0 if not applicable */
--
2.34.1