diff --git a/drivers/nvme/host/core.c b/drivers/nvme/host/core.c --- a/drivers/nvme/host/core.c +++ b/drivers/nvme/host/core.c @@ -538,6 +538,8 @@ bool nvme_cancel_request(struct request *req, void *data) if (blk_mq_rq_state(req) != MQ_RQ_IN_FLIGHT) return true; + if (!(nvme_req(req)->ctrl->quirks & NVME_QUIRK_SKIP_CID_GEN)) + nvme_req(req)->genctr++; nvme_req(req)->status = NVME_SC_HOST_ABORTED_CMD; nvme_req(req)->flags |= NVME_REQ_CANCELLED; blk_mq_complete_request(req); diff --git a/drivers/nvme/host/pci.c b/drivers/nvme/host/pci.c --- a/drivers/nvme/host/pci.c +++ b/drivers/nvme/host/pci.c @@ -3296,14 +3296,19 @@ static void nvme_dev_unmap(struct nvme_dev *dev) pci_release_mem_regions(to_pci_dev(dev->dev)); } -static bool nvme_pci_ctrl_is_dead(struct nvme_dev *dev) +static bool nvme_pci_ctrl_is_accessible(struct nvme_dev *dev) { struct pci_dev *pdev = to_pci_dev(dev->dev); + + return pci_is_enabled(pdev) && pci_device_is_present(pdev) && + pdev->error_state == pci_channel_io_normal; +} + +static bool nvme_pci_ctrl_is_dead(struct nvme_dev *dev) +{ u32 csts; - if (!pci_is_enabled(pdev) || !pci_device_is_present(pdev)) - return true; - if (pdev->error_state != pci_channel_io_normal) + if (!nvme_pci_ctrl_is_accessible(dev)) return true; csts = readl(dev->bar + NVME_REG_CSTS); @@ -3331,10 +3336,16 @@ static void nvme_dev_disable(struct nvme_dev