Re: [PATCH 0/6] block: fix integrity offset/length conversions
Anuj gupta <[email protected]> Sun, 5 Apr 2026 16:56:46 +0530
| Newsgroups | org.kernel.vger.target-devel,org.infradead.lists.linux-nvme,org.kernel.vger.linux-block,org.kernel.vger.linux-kernel,org.kernel.vger.linux-scsi |
|---|---|
| Message-ID | <CACzX3AvwQ87hL4GOBmpiGDYGqvb9O_HVjkS_e+-jLiJGgA7HPg@mail.gmail.com> |
> The block layer's integrity code currently sets the seed (initial > reference tag) in units of 512-byte sectors but increments it in units > of integrity intervals. Not only do the T10 DIF formats require ref tags > to be the lower bits of the logical block address, but mixing the two > units means the ref tags used for a particular logical block vary based > on its offset within a read/write request. This looks to be a > longstanding bug affecting block devices that support integrity with > block sizes > 512 bytes; I'm surprised it wasn't noticed before. > This likely went unnoticed because the remap path compensates for it: blk_integrity_prepare() rewrites the host-side sector-based ref tag to the correct device-visible interval/LBA value, and blk_integrity_complete() rewrites it back on reads. So for block-auto PI, and for the FS-PI path that goes through the same remap, the device-facing ref tag still comes out correct even though the host-side seed is semantically wrong.