Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit cef6a948 authored by Keith Busch's avatar Keith Busch Committed by Jens Axboe
Browse files

NVMe: Command abort handling fixes



Aborts all requeued commands prior to killing the request_queue. For
commands that time out on a dying request queue, set the "Do Not Retry"
bit on the command status so the command cannot be requeued. Finanally, if
the driver is requested to abort a command it did not start, do nothing.

Signed-off-by: default avatarKeith Busch <keith.busch@intel.com>
Signed-off-by: default avatarJens Axboe <axboe@fb.com>
parent 0fb59cbc
Loading
Loading
Loading
Loading
+13 −4
Original line number Original line Diff line number Diff line
@@ -1064,15 +1064,22 @@ static void nvme_cancel_queue_ios(struct blk_mq_hw_ctx *hctx,
	void *ctx;
	void *ctx;
	nvme_completion_fn fn;
	nvme_completion_fn fn;
	struct nvme_cmd_info *cmd;
	struct nvme_cmd_info *cmd;
	static struct nvme_completion cqe = {
	struct nvme_completion cqe;
		.status = cpu_to_le16(NVME_SC_ABORT_REQ << 1),

	};
	if (!blk_mq_request_started(req))
		return;


	cmd = blk_mq_rq_to_pdu(req);
	cmd = blk_mq_rq_to_pdu(req);


	if (cmd->ctx == CMD_CTX_CANCELLED)
	if (cmd->ctx == CMD_CTX_CANCELLED)
		return;
		return;


	if (blk_queue_dying(req->q))
		cqe.status = cpu_to_le16((NVME_SC_ABORT_REQ | NVME_SC_DNR) << 1);
	else
		cqe.status = cpu_to_le16(NVME_SC_ABORT_REQ << 1);


	dev_warn(nvmeq->q_dmadev, "Cancelling I/O %d QID %d\n",
	dev_warn(nvmeq->q_dmadev, "Cancelling I/O %d QID %d\n",
						req->tag, nvmeq->qid);
						req->tag, nvmeq->qid);
	ctx = cancel_cmd_info(cmd, &fn);
	ctx = cancel_cmd_info(cmd, &fn);
@@ -2429,10 +2436,12 @@ static void nvme_dev_remove(struct nvme_dev *dev)
	list_for_each_entry(ns, &dev->namespaces, list) {
	list_for_each_entry(ns, &dev->namespaces, list) {
		if (ns->disk->flags & GENHD_FL_UP)
		if (ns->disk->flags & GENHD_FL_UP)
			del_gendisk(ns->disk);
			del_gendisk(ns->disk);
		if (!blk_queue_dying(ns->queue))
		if (!blk_queue_dying(ns->queue)) {
			blk_mq_abort_requeue_list(ns->queue);
			blk_cleanup_queue(ns->queue);
			blk_cleanup_queue(ns->queue);
		}
		}
	}
	}
}


static int nvme_setup_prp_pools(struct nvme_dev *dev)
static int nvme_setup_prp_pools(struct nvme_dev *dev)
{
{