diff options
Diffstat (limited to 'drivers/nvme/host/multipath.c')
| -rw-r--r-- | drivers/nvme/host/multipath.c | 10 | 
1 files changed, 7 insertions, 3 deletions
| diff --git a/drivers/nvme/host/multipath.c b/drivers/nvme/host/multipath.c index e040e467f9fa..3da980dc60d9 100644 --- a/drivers/nvme/host/multipath.c +++ b/drivers/nvme/host/multipath.c @@ -690,8 +690,8 @@ static void nvme_remove_head(struct nvme_ns_head *head)  		nvme_cdev_del(&head->cdev, &head->cdev_device);  		synchronize_srcu(&head->srcu);  		del_gendisk(head->disk); -		nvme_put_ns_head(head);  	} +	nvme_put_ns_head(head);  }  static void nvme_remove_head_work(struct work_struct *work) @@ -1200,7 +1200,8 @@ void nvme_mpath_add_sysfs_link(struct nvme_ns_head *head)  	 */  	srcu_idx = srcu_read_lock(&head->srcu); -	list_for_each_entry_rcu(ns, &head->list, siblings) { +	list_for_each_entry_srcu(ns, &head->list, siblings, +				 srcu_read_lock_held(&head->srcu)) {  		/*  		 * Ensure that ns path disk node is already added otherwise we  		 * may get invalid kobj name for target @@ -1291,6 +1292,9 @@ void nvme_mpath_remove_disk(struct nvme_ns_head *head)  {  	bool remove = false; +	if (!head->disk) +		return; +  	mutex_lock(&head->subsys->lock);  	/*  	 * We are called when all paths have been removed, and at that point @@ -1311,7 +1315,7 @@ void nvme_mpath_remove_disk(struct nvme_ns_head *head)  		 */  		if (!try_module_get(THIS_MODULE))  			goto out; -		queue_delayed_work(nvme_wq, &head->remove_work, +		mod_delayed_work(nvme_wq, &head->remove_work,  				head->delayed_removal_secs * HZ);  	} else {  		list_del_init(&head->entry); | 
