nvme-pci: don't try to use SGLs for metadata on the admin queue
authorChristoph Hellwig <hch@lst.de>
Sun, 11 May 2025 04:04:27 +0000 (06:04 +0200)
committerChristoph Hellwig <hch@lst.de>
Sun, 11 May 2025 04:09:38 +0000 (06:09 +0200)
No admin command defined in an NVMe specification supports metadata,
but to protect against vendor specific commands using metadata ensure
that we don't try to use SGLs for metadata on the admin queue, as NVMe
does not support SGLs on the admin queue for the PCI transport.  Do
this by checking if the data transfer has been setup using SGLs as
that is required for using SGLs for metadata.

Signed-off-by: Christoph Hellwig <hch@lst.de>
drivers/nvme/host/pci.c

index cf5c105d5b8fa13279a9344dcd6bcc19877fb8c4..42fa3ddf81c2bbfa27a13adfa2d6c9646c39fe9a 100644 (file)
@@ -906,7 +906,10 @@ static blk_status_t nvme_pci_setup_meta_mptr(struct nvme_dev *dev,
 
 static blk_status_t nvme_map_metadata(struct nvme_dev *dev, struct request *req)
 {
-       if (nvme_pci_metadata_use_sgls(dev, req))
+       struct nvme_iod *iod = blk_mq_rq_to_pdu(req);
+
+       if ((iod->cmd.common.flags & NVME_CMD_SGL_METABUF) &&
+           nvme_pci_metadata_use_sgls(dev, req))
                return nvme_pci_setup_meta_sgls(dev, req);
        return nvme_pci_setup_meta_mptr(dev, req);
 }