On Tue, Apr 28, 2026 at 06:43:08PM +0800, Linlin Zhang wrote:
> Correct the response to Benjamin's comments.
> 
> On 4/27/2026 8:20 PM, Linlin Zhang wrote:
> > 
> > 
> > On 4/27/2026 9:19 AM, Benjamin Marzinski wrote:
> >> On Fri, Apr 10, 2026 at 06:40:30AM -0700, Linlin Zhang wrote:
> >>> From: Eric Biggers <[email protected]>
> >>> +
> >>> +static int inlinecrypt_map(struct dm_target *ti, struct bio *bio)
> >>> +{
> >>> + const struct inlinecrypt_ctx *ctx = ti->private;
> >>> + sector_t sector_in_target;
> >>> + u64 dun[BLK_CRYPTO_DUN_ARRAY_SIZE] = {};
> >>> +
> >>> + bio_set_dev(bio, ctx->dev->bdev);
> >>> +
> >>> + /*
> >>> +  * If the bio is a device-level request which doesn't target a specific
> >>> +  * sector, there's nothing more to do.
> >>> +  */
> >>> + if (bio_sectors(bio) == 0)
> >>> +         return DM_MAPIO_REMAPPED;
> >>> +
> >>> + /*
> >>> +  * The bio should never have an encryption context already, since
> >>> +  * dm-inlinecrypt doesn't pass through any inline encryption
> >>> +  * capabilities to the layer above it.
> >>> +  */
> >>> + if (WARN_ON_ONCE(bio_has_crypt_ctx(bio)))
> >>> +         return DM_MAPIO_KILL;
> >>> +
> >>> + /* Map the bio's sector to the underlying device. (512-byte sectors) */
> >>> + sector_in_target = dm_target_offset(ti, bio->bi_iter.bi_sector);
> >>> + bio->bi_iter.bi_sector = ctx->start + sector_in_target;
> >>> + /*
> >>> +  * If the bio doesn't have any data (e.g. if it's a DISCARD request),
> >>> +  * there's nothing more to do.
> >>> +  */
> >>> + if (!bio_has_data(bio))
> >>> +         return DM_MAPIO_REMAPPED;
> >>> +
> >>> + /* Calculate the DUN and enforce data-unit (crypto sector) alignment. */
> >>> + dun[0] = ctx->iv_offset + sector_in_target; /* 512-byte sectors */
> >>> + if (dun[0] & ((ctx->sector_size >> SECTOR_SHIFT) - 1))
> >>> +         return DM_MAPIO_KILL;
> >>
> >> If ctx->iv_offset is not a multiple of ctx->sector_size, this will
> >> always fail. ctx->iv_offset should probably get validated in
> >> inlinecrypt_ctr()
> > 
> > ACK
> > 
> > Yes, this assumes iv_offset is aligned to sector_size when large crypto
> > sectors are used. That’s a requirement of dm-inlinecrypt semantics, and
> > adding an explicit check in inlinecrypt_ctr() would make this fail earlier
> > and more clearly.
> 
> Sorry, the last response is wrong. No need to add check in inlinecrypt_ctr().
> 
> iv_offset is the starting offset for IVs that are generated as if the target 
> were
> preceded by iv_offset 512-byte sectors.
> 
> I think this concern is based on an implicit assumption that
> sector_in_target is always data-unit (crypto sector) aligned. In this
> target, however, sector_in_target is derived from dm_target_offset() and
> is in 512-byte sectors, so it is not guaranteed to be a multiple of
> (sector_size >> SECTOR_SHIFT).

sector_in_target should be guaranteed to be sector_size aligned.
inlinecrypt_io_hints() sets the device logical block size to at least
ctx->sector_size, and validate_hardware_logical_block_alignment() makes
sure that the target starts on a logical block boundary. The block
layer enforces IO to be aligned with the logical block size, so
an IO that starts 7 sectors into a device with a 4096 ctx->sector_size
should be impossible. 

-Ben


Reply via email to