Commit c7c16c5b authored by Christoph Hellwig's avatar Christoph Hellwig

nvme-pci: don't unbind the driver on reset failure

Unbind a device driver when a reset fails is very unusual behavior.
Just shut the controller down and leave it in dead state if we fail
to reset it.
Signed-off-by: default avatarChristoph Hellwig <hch@lst.de>
Reviewed-by: default avatarSagi Grimberg <sagi@grimberg.me>
Reviewed-by: default avatarChaitanya Kulkarni <kch@nvidia.com>
parent eac3ef26
...@@ -130,7 +130,6 @@ struct nvme_dev { ...@@ -130,7 +130,6 @@ struct nvme_dev {
u32 db_stride; u32 db_stride;
void __iomem *bar; void __iomem *bar;
unsigned long bar_mapped_size; unsigned long bar_mapped_size;
struct work_struct remove_work;
struct mutex shutdown_lock; struct mutex shutdown_lock;
bool subsystem; bool subsystem;
u64 cmb_size; u64 cmb_size;
...@@ -2797,20 +2796,6 @@ static void nvme_pci_free_ctrl(struct nvme_ctrl *ctrl) ...@@ -2797,20 +2796,6 @@ static void nvme_pci_free_ctrl(struct nvme_ctrl *ctrl)
kfree(dev); kfree(dev);
} }
static void nvme_remove_dead_ctrl(struct nvme_dev *dev)
{
/*
* Set state to deleting now to avoid blocking nvme_wait_reset(), which
* may be holding this pci_dev's device lock.
*/
nvme_change_ctrl_state(&dev->ctrl, NVME_CTRL_DELETING);
nvme_get_ctrl(&dev->ctrl);
nvme_dev_disable(dev, false);
nvme_mark_namespaces_dead(&dev->ctrl);
if (!queue_work(nvme_wq, &dev->remove_work))
nvme_put_ctrl(&dev->ctrl);
}
static void nvme_reset_work(struct work_struct *work) static void nvme_reset_work(struct work_struct *work)
{ {
struct nvme_dev *dev = struct nvme_dev *dev =
...@@ -2901,20 +2886,16 @@ static void nvme_reset_work(struct work_struct *work) ...@@ -2901,20 +2886,16 @@ static void nvme_reset_work(struct work_struct *work)
out_unlock: out_unlock:
mutex_unlock(&dev->shutdown_lock); mutex_unlock(&dev->shutdown_lock);
out: out:
if (result) /*
dev_warn(dev->ctrl.device, * Set state to deleting now to avoid blocking nvme_wait_reset(), which
"Removing after probe failure status: %d\n", result); * may be holding this pci_dev's device lock.
nvme_remove_dead_ctrl(dev); */
} dev_warn(dev->ctrl.device, "Disabling device after reset failure: %d\n",
result);
static void nvme_remove_dead_ctrl_work(struct work_struct *work) nvme_change_ctrl_state(&dev->ctrl, NVME_CTRL_DELETING);
{ nvme_dev_disable(dev, true);
struct nvme_dev *dev = container_of(work, struct nvme_dev, remove_work); nvme_mark_namespaces_dead(&dev->ctrl);
struct pci_dev *pdev = to_pci_dev(dev->dev); nvme_change_ctrl_state(&dev->ctrl, NVME_CTRL_DEAD);
if (pci_get_drvdata(pdev))
device_release_driver(&pdev->dev);
nvme_put_ctrl(&dev->ctrl);
} }
static int nvme_pci_reg_read32(struct nvme_ctrl *ctrl, u32 off, u32 *val) static int nvme_pci_reg_read32(struct nvme_ctrl *ctrl, u32 off, u32 *val)
...@@ -3052,7 +3033,6 @@ static struct nvme_dev *nvme_pci_alloc_dev(struct pci_dev *pdev, ...@@ -3052,7 +3033,6 @@ static struct nvme_dev *nvme_pci_alloc_dev(struct pci_dev *pdev,
if (!dev) if (!dev)
return NULL; return NULL;
INIT_WORK(&dev->ctrl.reset_work, nvme_reset_work); INIT_WORK(&dev->ctrl.reset_work, nvme_reset_work);
INIT_WORK(&dev->remove_work, nvme_remove_dead_ctrl_work);
mutex_init(&dev->shutdown_lock); mutex_init(&dev->shutdown_lock);
dev->nr_write_queues = write_queues; dev->nr_write_queues = write_queues;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment