NVMe: Fix command setup on IO retry
authorKeith Busch <keith.busch@intel.com>
Thu, 4 Dec 2014 00:07:13 +0000 (17:07 -0700)
committerJens Axboe <axboe@fb.com>
Thu, 4 Dec 2014 02:10:45 +0000 (19:10 -0700)
On retry, the req->special is pointing to an already setup IOD, but we
still need to setup the command context and callback, otherwise you'll
see false twice completed errors and leak requests.

Signed-off-by: Keith Busch <keith.busch@intel.com>
Signed-off-by: Jens Axboe <axboe@fb.com>
drivers/block/nvme-core.c

index c7ea07ce9372983e8b4b3fcaf0d2458b5e146cc2..bcbdf832b1b09727213f5532c23404c89df0a12d 100644 (file)
@@ -640,8 +640,6 @@ static int nvme_queue_rq(struct blk_mq_hw_ctx *hctx,
        iod->private = req;
        req->special = iod;
 
-       nvme_set_info(cmd, iod, req_completion);
-
        if (req->cmd_flags & REQ_DISCARD) {
                void *range;
                /*
@@ -677,6 +675,7 @@ static int nvme_queue_rq(struct blk_mq_hw_ctx *hctx,
        blk_mq_start_request(req);
 
  submit_iod:
+       nvme_set_info(cmd, iod, req_completion);
        spin_lock_irq(&nvmeq->q_lock);
        if (req->cmd_flags & REQ_DISCARD)
                nvme_submit_discard(nvmeq, ns, req, iod);