diff options
Diffstat (limited to 'drivers/block/nvme-core.c')
| -rw-r--r-- | drivers/block/nvme-core.c | 18 | 
1 files changed, 12 insertions, 6 deletions
| diff --git a/drivers/block/nvme-core.c b/drivers/block/nvme-core.c index 51824d1f23ea..8459e4e7c719 100644 --- a/drivers/block/nvme-core.c +++ b/drivers/block/nvme-core.c @@ -993,7 +993,7 @@ static void nvme_abort_cmd(int cmdid, struct nvme_queue *nvmeq)  		dev_warn(&dev->pci_dev->dev,  			"I/O %d QID %d timeout, reset controller\n", cmdid,  								nvmeq->qid); -		PREPARE_WORK(&dev->reset_work, nvme_reset_failed_dev); +		dev->reset_workfn = nvme_reset_failed_dev;  		queue_work(nvme_workq, &dev->reset_work);  		return;  	} @@ -1696,8 +1696,7 @@ static int nvme_kthread(void *data)  				list_del_init(&dev->node);  				dev_warn(&dev->pci_dev->dev,  					"Failed status, reset controller\n"); -				PREPARE_WORK(&dev->reset_work, -							nvme_reset_failed_dev); +				dev->reset_workfn = nvme_reset_failed_dev;  				queue_work(nvme_workq, &dev->reset_work);  				continue;  			} @@ -2406,7 +2405,7 @@ static int nvme_dev_resume(struct nvme_dev *dev)  		return ret;  	if (ret == -EBUSY) {  		spin_lock(&dev_list_lock); -		PREPARE_WORK(&dev->reset_work, nvme_remove_disks); +		dev->reset_workfn = nvme_remove_disks;  		queue_work(nvme_workq, &dev->reset_work);  		spin_unlock(&dev_list_lock);  	} @@ -2435,6 +2434,12 @@ static void nvme_reset_failed_dev(struct work_struct *ws)  	nvme_dev_reset(dev);  } +static void nvme_reset_workfn(struct work_struct *work) +{ +	struct nvme_dev *dev = container_of(work, struct nvme_dev, reset_work); +	dev->reset_workfn(work); +} +  static int nvme_probe(struct pci_dev *pdev, const struct pci_device_id *id)  {  	int result = -ENOMEM; @@ -2453,7 +2458,8 @@ static int nvme_probe(struct pci_dev *pdev, const struct pci_device_id *id)  		goto free;  	INIT_LIST_HEAD(&dev->namespaces); -	INIT_WORK(&dev->reset_work, nvme_reset_failed_dev); +	dev->reset_workfn = nvme_reset_failed_dev; +	INIT_WORK(&dev->reset_work, nvme_reset_workfn);  	dev->pci_dev = pdev;  	pci_set_drvdata(pdev, dev);  	result = nvme_set_instance(dev); @@ -2553,7 +2559,7 @@ static int nvme_resume(struct device *dev)  	struct nvme_dev *ndev = pci_get_drvdata(pdev);  	if (nvme_dev_resume(ndev) && !work_busy(&ndev->reset_work)) { -		PREPARE_WORK(&ndev->reset_work, nvme_reset_failed_dev); +		ndev->reset_workfn = nvme_reset_failed_dev;  		queue_work(nvme_workq, &ndev->reset_work);  	}  	return 0; | 
