On Thu, Oct 22, 2020 at 07:43:33PM +0200, Klaus Jensen wrote: > On Oct 22 08:01, Keith Busch wrote: > > On Thu, Oct 22, 2020 at 09:33:13AM +0200, Klaus Jensen wrote: > > > + if (--(*discards)) { > > > + status = NVME_NO_COMPLETE; > > > + } else { > > > + g_free(discards); > > > + req->opaque = NULL; > > > > This case needs a > > > > status = req->status; > > > > So that we get the error set in the callback. > > > > There are no cases that result in a non-zero status code here.
Your callback has a case that sets NVME_INTERNAL_DEV_ERROR status. That would get ignored if the final discard reference is dropped from the submission side. +static void nvme_aio_discard_cb(void *opaque, int ret) +{ + NvmeRequest *req = opaque; + int *discards = req->opaque; + + trace_pci_nvme_aio_discard_cb(nvme_cid(req)); + + if (ret) { + req->status = NVME_INTERNAL_DEV_ERROR; + trace_pci_nvme_err_aio(nvme_cid(req), strerror(ret), + req->status); + }