]> www.infradead.org Git - users/hch/block.git/commitdiff
nvme: don't abort completed request in nvme_cancel_request
authorMing Lei <ming.lei@redhat.com>
Wed, 24 Jul 2019 03:48:41 +0000 (11:48 +0800)
committerJens Axboe <axboe@kernel.dk>
Mon, 5 Aug 2019 03:41:29 +0000 (21:41 -0600)
Before aborting in-flight requests, all IO queues and their interrupts
have been shutdown. However, request's completion function may not be
done yet because it can be scheduled to run via IPI.

So don't abort one request if it is marked as completed, otherwise
we may abort one normal completed request.

Cc: Max Gurtovoy <maxg@mellanox.com>
Cc: Sagi Grimberg <sagi@grimberg.me>
Cc: Keith Busch <keith.busch@intel.com>
Cc: Christoph Hellwig <hch@lst.de>
Reviewed-by: Sagi Grimberg <sagi@grimberg.me>
Signed-off-by: Ming Lei <ming.lei@redhat.com>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
drivers/nvme/host/core.c

index 8f3fbe5ca9379988b16c88c6e25cb45869f6a614..bcede8c879d1b83bca6fc01f8ad57c0f00dc6a7a 100644 (file)
@@ -288,6 +288,10 @@ bool nvme_cancel_request(struct request *req, void *data, bool reserved)
        dev_dbg_ratelimited(((struct nvme_ctrl *) data)->device,
                                "Cancelling I/O %d", req->tag);
 
+       /* don't abort one completed request */
+       if (blk_mq_request_completed(req))
+               return true;
+
        nvme_req(req)->status = NVME_SC_ABORT_REQ;
        blk_mq_complete_request_sync(req);
        return true;