nvme-multipath: reset bdev to ns head when failover
authorDaniel Wagner <dwagner@suse.de>
Mon, 3 May 2021 17:03:03 +0000 (19:03 +0200)
committerChristoph Hellwig <hch@lst.de>
Tue, 4 May 2021 07:39:23 +0000 (09:39 +0200)
When a request finally completes in end_io() after it has failed over,
the bdev pointer can be stale and thus the system can crash. Set the
bdev back to ns head, so the request is map to an active path when
resubmitted.

Signed-off-by: Daniel Wagner <dwagner@suse.de>
Reviewed-by: Hannes Reinecke <hare@suse.de>
Signed-off-by: Christoph Hellwig <hch@lst.de>
drivers/nvme/host/multipath.c

index 0d0de3433f3776a6ae8d7f153877b8746ade67cb..0551796517e61bfa82ac122e26dc7b9ae7002ade 100644 (file)
@@ -70,6 +70,7 @@ void nvme_failover_req(struct request *req)
        struct nvme_ns *ns = req->q->queuedata;
        u16 status = nvme_req(req)->status & 0x7ff;
        unsigned long flags;
+       struct bio *bio;
 
        nvme_mpath_clear_current_path(ns);
 
@@ -84,6 +85,8 @@ void nvme_failover_req(struct request *req)
        }
 
        spin_lock_irqsave(&ns->head->requeue_lock, flags);
+       for (bio = req->bio; bio; bio = bio->bi_next)
+               bio_set_dev(bio, ns->head->disk->part0);
        blk_steal_bios(&ns->head->requeue_list, req);
        spin_unlock_irqrestore(&ns->head->requeue_lock, flags);