|
@@ -557,6 +557,10 @@ static int nvme_revalidate_disk(struct gendisk *disk)
|
|
|
u16 old_ms;
|
|
|
unsigned short bs;
|
|
|
|
|
|
+ if (test_bit(NVME_NS_DEAD, &ns->flags)) {
|
|
|
+ set_capacity(disk, 0);
|
|
|
+ return -ENODEV;
|
|
|
+ }
|
|
|
if (nvme_identify_ns(ns->ctrl, ns->ns_id, &id)) {
|
|
|
dev_warn(ns->ctrl->dev, "%s: Identify failure nvme%dn%d\n",
|
|
|
__func__, ns->ctrl->instance, ns->ns_id);
|
|
@@ -1186,32 +1190,15 @@ static void nvme_alloc_ns(struct nvme_ctrl *ctrl, unsigned nsid)
|
|
|
|
|
|
static void nvme_ns_remove(struct nvme_ns *ns)
|
|
|
{
|
|
|
- bool kill;
|
|
|
-
|
|
|
if (test_and_set_bit(NVME_NS_REMOVING, &ns->flags))
|
|
|
return;
|
|
|
|
|
|
- kill = nvme_io_incapable(ns->ctrl) &&
|
|
|
- !blk_queue_dying(ns->queue);
|
|
|
- if (kill) {
|
|
|
- blk_set_queue_dying(ns->queue);
|
|
|
-
|
|
|
- /*
|
|
|
- * The controller was shutdown first if we got here through
|
|
|
- * device removal. The shutdown may requeue outstanding
|
|
|
- * requests. These need to be aborted immediately so
|
|
|
- * del_gendisk doesn't block indefinitely for their completion.
|
|
|
- */
|
|
|
- blk_mq_abort_requeue_list(ns->queue);
|
|
|
- }
|
|
|
if (ns->disk->flags & GENHD_FL_UP) {
|
|
|
if (blk_get_integrity(ns->disk))
|
|
|
blk_integrity_unregister(ns->disk);
|
|
|
sysfs_remove_group(&disk_to_dev(ns->disk)->kobj,
|
|
|
&nvme_ns_attr_group);
|
|
|
del_gendisk(ns->disk);
|
|
|
- }
|
|
|
- if (kill || !blk_queue_dying(ns->queue)) {
|
|
|
blk_mq_abort_requeue_list(ns->queue);
|
|
|
blk_cleanup_queue(ns->queue);
|
|
|
}
|
|
@@ -1413,6 +1400,38 @@ out:
|
|
|
return ret;
|
|
|
}
|
|
|
|
|
|
+/**
|
|
|
+ * nvme_kill_queues(): Ends all namespace queues
|
|
|
+ * @ctrl: the dead controller that needs to end
|
|
|
+ *
|
|
|
+ * Call this function when the driver determines it is unable to get the
|
|
|
+ * controller in a state capable of servicing IO.
|
|
|
+ */
|
|
|
+void nvme_kill_queues(struct nvme_ctrl *ctrl)
|
|
|
+{
|
|
|
+ struct nvme_ns *ns;
|
|
|
+
|
|
|
+ mutex_lock(&ctrl->namespaces_mutex);
|
|
|
+ list_for_each_entry(ns, &ctrl->namespaces, list) {
|
|
|
+ if (!kref_get_unless_zero(&ns->kref))
|
|
|
+ continue;
|
|
|
+
|
|
|
+ /*
|
|
|
+ * Revalidating a dead namespace sets capacity to 0. This will
|
|
|
+ * end buffered writers dirtying pages that can't be synced.
|
|
|
+ */
|
|
|
+ if (!test_and_set_bit(NVME_NS_DEAD, &ns->flags))
|
|
|
+ revalidate_disk(ns->disk);
|
|
|
+
|
|
|
+ blk_set_queue_dying(ns->queue);
|
|
|
+ blk_mq_abort_requeue_list(ns->queue);
|
|
|
+ blk_mq_start_stopped_hw_queues(ns->queue, true);
|
|
|
+
|
|
|
+ nvme_put_ns(ns);
|
|
|
+ }
|
|
|
+ mutex_unlock(&ctrl->namespaces_mutex);
|
|
|
+}
|
|
|
+
|
|
|
void nvme_stop_queues(struct nvme_ctrl *ctrl)
|
|
|
{
|
|
|
struct nvme_ns *ns;
|