Re: [PATCH v3 0/6] block: fix integrity offset/length conversions
"Martin K. Petersen" <[email protected]> Thu, 16 Apr 2026 23:26:11 -0400
| 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 |
|---|---|
| Organization | Oracle Corporation |
| Message-ID | <[email protected]> |
Hi Caleb! > 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 I don't necessarily agree with the premise that the seed needs to be expressed in any particular unit. The seed is a start value, nothing more. We happen to set it to the block number in the block layer since we need to be able to know what to compare against on completion (for Type 1 + the restrictive Linux implementation of Type 2). But that does not imply that the seed needs to be specified in any particular unit. Submitters set the seed to whichever value makes sense to them (i.e. it could be the offset within a file as opposed to the eventual LBA on the backend device). And then that seed is incremented by 1 for each integrity interval of data in the PI sent to/received from the device. The conversion between the submitter's view of what the first ref tag should be (i.e. seed) and what is required by the hardware (for instance lower 32 bits of device LBA) is the reason we perform remapping. The seed is intentionally different in the submitter's protection envelope compared to the device's protection envelope. Using the block layer block number as seed was just a convenience since that provided a predictable value for any I/O that had its PI autogenerated. I never intended for the actual LBA to be used as seed value on a 4Kn device. Initially we just used 0 as the seed. Leveraging the block number just added a bit of additional protection. I confess I haven't tested 4Kn in a while since things sort of converged on 512e. But I used to run nightly tests on a SCSI storage with 4Kn blocks just fine. > 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. Are you seeing this with NVMe or SCSI? -- Martin K. Petersen