|
@@ -1452,6 +1452,8 @@ static void nvme_alloc_ns(struct nvme_ctrl *ctrl, unsigned nsid)
|
|
|
|
|
|
static void nvme_ns_remove(struct nvme_ns *ns)
|
|
|
{
|
|
|
+ lockdep_assert_held(&ns->ctrl->namespaces_mutex);
|
|
|
+
|
|
|
if (test_and_set_bit(NVME_NS_REMOVING, &ns->flags))
|
|
|
return;
|
|
|
|
|
@@ -1464,9 +1466,7 @@ static void nvme_ns_remove(struct nvme_ns *ns)
|
|
|
blk_mq_abort_requeue_list(ns->queue);
|
|
|
blk_cleanup_queue(ns->queue);
|
|
|
}
|
|
|
- mutex_lock(&ns->ctrl->namespaces_mutex);
|
|
|
list_del_init(&ns->list);
|
|
|
- mutex_unlock(&ns->ctrl->namespaces_mutex);
|
|
|
synchronize_rcu();
|
|
|
nvme_put_ns(ns);
|
|
|
}
|
|
@@ -1580,8 +1580,10 @@ void nvme_remove_namespaces(struct nvme_ctrl *ctrl)
|
|
|
{
|
|
|
struct nvme_ns *ns, *next;
|
|
|
|
|
|
+ mutex_lock(&ctrl->namespaces_mutex);
|
|
|
list_for_each_entry_safe(ns, next, &ctrl->namespaces, list)
|
|
|
nvme_ns_remove(ns);
|
|
|
+ mutex_unlock(&ctrl->namespaces_mutex);
|
|
|
}
|
|
|
EXPORT_SYMBOL_GPL(nvme_remove_namespaces);
|
|
|
|