|
@@ -3314,6 +3314,9 @@ void nvme_remove_namespaces(struct nvme_ctrl *ctrl)
|
|
|
struct nvme_ns *ns, *next;
|
|
|
LIST_HEAD(ns_list);
|
|
|
|
|
|
+ /* prevent racing with ns scanning */
|
|
|
+ flush_work(&ctrl->scan_work);
|
|
|
+
|
|
|
/*
|
|
|
* The dead states indicates the controller was not gracefully
|
|
|
* disconnected. In that case, we won't be able to flush any data while
|
|
@@ -3476,7 +3479,6 @@ void nvme_stop_ctrl(struct nvme_ctrl *ctrl)
|
|
|
nvme_mpath_stop(ctrl);
|
|
|
nvme_stop_keep_alive(ctrl);
|
|
|
flush_work(&ctrl->async_event_work);
|
|
|
- flush_work(&ctrl->scan_work);
|
|
|
cancel_work_sync(&ctrl->fw_act_work);
|
|
|
if (ctrl->ops->stop_ctrl)
|
|
|
ctrl->ops->stop_ctrl(ctrl);
|
|
@@ -3585,7 +3587,7 @@ int nvme_init_ctrl(struct nvme_ctrl *ctrl, struct device *dev,
|
|
|
|
|
|
return 0;
|
|
|
out_free_name:
|
|
|
- kfree_const(dev->kobj.name);
|
|
|
+ kfree_const(ctrl->device->kobj.name);
|
|
|
out_release_instance:
|
|
|
ida_simple_remove(&nvme_instance_ida, ctrl->instance);
|
|
|
out:
|
|
@@ -3607,7 +3609,7 @@ void nvme_kill_queues(struct nvme_ctrl *ctrl)
|
|
|
down_read(&ctrl->namespaces_rwsem);
|
|
|
|
|
|
/* Forcibly unquiesce queues to avoid blocking dispatch */
|
|
|
- if (ctrl->admin_q)
|
|
|
+ if (ctrl->admin_q && !blk_queue_dying(ctrl->admin_q))
|
|
|
blk_mq_unquiesce_queue(ctrl->admin_q);
|
|
|
|
|
|
list_for_each_entry(ns, &ctrl->namespaces, list)
|