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 0d0de34..0551796 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);