[PATCH v2 1/3] nvmet: pci-epf: Always fully initialize completion entries

Niklas Cassel cassel at kernel.org
Mon Apr 14 02:24:40 PDT 2025


On Fri, Apr 11, 2025 at 10:42:09AM +0900, Damien Le Moal wrote:
> For a command that is normally processed through the command request
> execute() function, the completion entry for the command is initialized
> by __nvmet_req_complete() and nvmet_pci_epf_cq_work() only needs to set
> the status field and the phase of the completion entry before posting
> the entry to the completion queue.
> 
> However, for commands that are failed due to an internal error (e.g. the
> command data buffer allocation fails), the command request execute()
> function is not called and __nvmet_req_complete() is never executed for
> the command, leaving the command completion entry uninitialized. For
> such command failed before calling req->execute(), the host ends up
> seeing completion entries with an invalid submission queue ID and
> command ID.
> 
> Avoid such issue by always fully initilizing a command completion entry
> in nvmet_pci_epf_cq_work(), setting the entry submission queue head, ID
> and command ID.
> 
> Fixes: 0faa0fe6f90e ("nvmet: New NVMe PCI endpoint function target driver")
> Cc: stable at vger.kernel.org
> Signed-off-by: Damien Le Moal <dlemoal at kernel.org>

While it is obvious from looking at the code, the commit message probably
should have included something about the READ_ONCE()/WRITE_ONCE() change.

Regardless:
Reviewed-by: Niklas Cassel <cassel at kernel.org>



More information about the Linux-nvme mailing list