[PATCH 4/5] nvmet: pci-epf: report transport errors in command completions
Christoph Hellwig
hch at lst.de
Tue Oct 13 07:27:36 PDT 2026
I think this looks good. Damien/Niklas, can you test this on hardware?
On Mon, Oct 12, 2026 at 04:12:31PM +0200, Andrea Parri wrote:
> When the PCI endpoint target fails a command itself, the host receives a
> successful completion. This happens for a data length above MDTS,
> malformed PRPs or SGLs, a buffer allocation failure, an SQ that is not
> live, and a failed DMA of the command data. A write whose data cannot be
> fetched from the host is thus reported as written, though nothing was
> executed.
>
> Each of these paths sets iod->status and calls
> nvmet_pci_epf_complete_iod(), which then reloads iod->status from
> iod->cqe.status. The nvmet core only fills that field when it completes
> the request, which these paths never do, so it is still zero and
> nvmet_pci_epf_cq_work() posts a success status to the host.
>
> Drop the reload. Every path already sets iod->status before completion:
> nvmet_pci_epf_queue_response() copies it from the request's CQE, and
> the transport error paths set it themselves.
>
> Found by code inspection. Build-tested only (x86_64, W=1): no PCI
> endpoint hardware was available to run it.
>
> Fixes: 0faa0fe6f90e ("nvmet: New NVMe PCI endpoint function target driver")
> Cc: stable at vger.kernel.org
> Assisted-by: LLM
> Signed-off-by: Andrea Parri <parri.andrea at gmail.com>
> ---
> drivers/nvme/target/pci-epf.c | 1 -
> 1 file changed, 1 deletion(-)
>
> diff --git a/drivers/nvme/target/pci-epf.c b/drivers/nvme/target/pci-epf.c
> index c683450df4227..4c5fff232fb99 100644
> --- a/drivers/nvme/target/pci-epf.c
> +++ b/drivers/nvme/target/pci-epf.c
> @@ -1152,7 +1152,6 @@ static void nvmet_pci_epf_complete_iod(struct nvmet_pci_epf_iod *iod)
> unsigned long flags;
>
> /* Print an error message for failed commands, except AENs. */
> - iod->status = le16_to_cpu(iod->cqe.status) >> 1;
> if (iod->status && iod->cmd.common.opcode != nvme_admin_async_event)
> dev_err(iod->ctrl->dev,
> "CQ[%d]: Command %s (0x%x) status 0x%0x\n",
> --
> 2.53.0
---end quoted text---
More information about the Linux-nvme
mailing list