From 80591941b0cd75773a0c080ce5c0fcab04f3816a Mon Sep 17 00:00:00 2001 From: Keith Busch Date: Wed, 27 Mar 2019 21:51:51 +0800 Subject: [PATCH] nvme-pci: fix hot removal during error handling mainline inclusion from mainline-4.20-rc1 commit cb4bfda62afa25b4eee3d635d33fccdd9485dd7c category: bugfix bugzilla: 9903 CVE: NA --------------------------- A removal waits for the reset_work to complete. If a surprise removal occurs around the same time as an error triggered controller reset, and reset work happened to dispatch a command to the removed controller, the command won't be recovered since the timeout work doesn't do anything during error recovery. We wouldn't want to wait for timeout handling anyway, so this patch fixes this by disabling the controller and killing admin queues prior to syncing with the reset_work. Signed-off-by: Keith Busch Reviewed-by: Sagi Grimberg Signed-off-by: Christoph Hellwig Signed-off-by: Yufen Yu Reviewed-by: Miao Xie Signed-off-by: Yang Yingliang --- drivers/nvme/host/pci.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/drivers/nvme/host/pci.c b/drivers/nvme/host/pci.c index 8d2aaeb7877a..65d40558cdce 100644 --- a/drivers/nvme/host/pci.c +++ b/drivers/nvme/host/pci.c @@ -2594,13 +2594,12 @@ static void nvme_remove(struct pci_dev *pdev) struct nvme_dev *dev = pci_get_drvdata(pdev); nvme_change_ctrl_state(&dev->ctrl, NVME_CTRL_DELETING); - - cancel_work_sync(&dev->ctrl.reset_work); pci_set_drvdata(pdev, NULL); if (!pci_device_is_present(pdev)) { nvme_change_ctrl_state(&dev->ctrl, NVME_CTRL_DEAD); nvme_dev_disable(dev, true); + nvme_dev_remove_admin(dev); } flush_work(&dev->ctrl.reset_work); -- GitLab