[PATCH v1 10/11] blk-crypto: add slot_offset to blk_crypto_profile
flat view
COLD39d
From: Linlin Zhang <hidden>
Date: 2026-08-27 16:08:46
Also in:
linux-arm-msm, linux-block, linux-crypto, linux-devicetree, linux-scsi, lkml
Subsystem:
block layer, the rest · Maintainers:
Jens Axboe, Linus Torvalds
From: linlzhan <redacted> 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 <redacted> --- 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