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: Keith Busch <keith.busch@intel.com> Signed-off-by: Jens Axboe <axboe@fb.com>
This commit is contained in:
parent
0fb59cbc5f
commit
cef6a94827
|
@ -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)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue