On Thu, Jan 27, 2022 at 11:37:52AM -0500, Kevin O'Connor wrote:
Thanks. I don't know enough about NVMe to review this patch though. Maybe Julian or Alex could comment?
Happy to hear their comments on this. However, I can also try to explain the reasoning in a bit more detail.
This follows from the NVMe spec: The Identify command returns a data structure that contains packed LBAF records (Figure 249, starting at offset 131). This is represented by struct nvme_identify_ns in the SeaBIOS code.
Figure 250 gives the structure of these records and this is where the aforementioned discrepancy lies.
I think what happened was that somebody mistook the reserved 6 uppermost bits as a whole byte and put it into struct nvme_lba_format as such. To correctly parse the RP field, you'd still need to mask off these bits, but the code only uses the LBADS/MS fields anyway.
I encountered this on an NVMe device that had FLBAS[3:0] != 0, which caused nonsensical outputs of the various dprintf()s and also throws off everything that depends on knowing the block size. Empirically, the patch fixes these problems.