]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
nvme: allow integrity on extended metadata formats
authorKeith Busch <kbusch@kernel.org>
Thu, 3 Mar 2022 20:13:06 +0000 (12:13 -0800)
committerJens Axboe <axboe@kernel.dk>
Mon, 7 Mar 2022 19:48:35 +0000 (12:48 -0700)
The block integrity subsystem knows how to construct protection
information buffers with metadata beyond the protection information
fields. Remove the driver restriction.

Note, this can only work if the PI field appears first in the metadata,
as the integrity subsystem doesn't calculate guard tags on preceding
metadata.

Reviewed-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Hannes Reinecke <hare@suse.de>
Reviewed-by: Martin K. Petersen <martin.petersen@oracle.com>
Signed-off-by: Keith Busch <kbusch@kernel.org>
Link: https://lore.kernel.org/r/20220303201312.3255347-3-kbusch@kernel.org
Signed-off-by: Jens Axboe <axboe@kernel.dk>
drivers/nvme/host/core.c

index bcbe12fd4984a587ab20262710ef27bc1397e1fe..cd13b7dcd18fe3a42f87ea6569853d70ab0167ba 100644 (file)
@@ -1616,12 +1616,9 @@ static void nvme_configure_metadata(struct nvme_ns *ns, struct nvme_id_ns *id)
 {
        struct nvme_ctrl *ctrl = ns->ctrl;
 
-       /*
-        * The PI implementation requires the metadata size to be equal to the
-        * t10 pi tuple size.
-        */
        ns->ms = le16_to_cpu(id->lbaf[id->flbas & NVME_NS_FLBAS_LBA_MASK].ms);
-       if (ns->ms == sizeof(struct t10_pi_tuple))
+       if (id->dps & NVME_NS_DPS_PI_FIRST ||
+           ns->ms == sizeof(struct t10_pi_tuple))
                ns->pi_type = id->dps & NVME_NS_DPS_PI_MASK;
        else
                ns->pi_type = 0;