virtio-blk: use a helper to handle request queuing errors
authorDmitry Fomichev <dmitry.fomichev@wdc.com>
Sun, 16 Oct 2022 03:41:26 +0000 (23:41 -0400)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 12 Jan 2023 11:02:53 +0000 (12:02 +0100)
[ Upstream commit 258896fcc786b4e7db238eba26f6dd080e0ff41e ]

Define a new helper function, virtblk_fail_to_queue(), to
clean up the error handling code in virtio_queue_rq().

Signed-off-by: Dmitry Fomichev <dmitry.fomichev@wdc.com>
Message-Id: <20221016034127.330942-2-dmitry.fomichev@wdc.com>
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
Stable-dep-of: a26116c1e740 ("virtio_blk: Fix signedness bug in virtblk_prep_rq()")
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/block/virtio_blk.c

index 19da5de..3efe3da 100644 (file)
@@ -315,6 +315,19 @@ static void virtio_commit_rqs(struct blk_mq_hw_ctx *hctx)
                virtqueue_notify(vq->vq);
 }
 
+static blk_status_t virtblk_fail_to_queue(struct request *req, int rc)
+{
+       virtblk_cleanup_cmd(req);
+       switch (rc) {
+       case -ENOSPC:
+               return BLK_STS_DEV_RESOURCE;
+       case -ENOMEM:
+               return BLK_STS_RESOURCE;
+       default:
+               return BLK_STS_IOERR;
+       }
+}
+
 static blk_status_t virtblk_prep_rq(struct blk_mq_hw_ctx *hctx,
                                        struct virtio_blk *vblk,
                                        struct request *req,
@@ -327,10 +340,8 @@ static blk_status_t virtblk_prep_rq(struct blk_mq_hw_ctx *hctx,
                return status;
 
        vbr->sg_table.nents = virtblk_map_data(hctx, req, vbr);
-       if (unlikely(vbr->sg_table.nents < 0)) {
-               virtblk_cleanup_cmd(req);
-               return BLK_STS_RESOURCE;
-       }
+       if (unlikely(vbr->sg_table.nents < 0))
+               return virtblk_fail_to_queue(req, -ENOMEM);
 
        blk_mq_start_request(req);
 
@@ -364,15 +375,7 @@ static blk_status_t virtio_queue_rq(struct blk_mq_hw_ctx *hctx,
                        blk_mq_stop_hw_queue(hctx);
                spin_unlock_irqrestore(&vblk->vqs[qid].lock, flags);
                virtblk_unmap_data(req, vbr);
-               virtblk_cleanup_cmd(req);
-               switch (err) {
-               case -ENOSPC:
-                       return BLK_STS_DEV_RESOURCE;
-               case -ENOMEM:
-                       return BLK_STS_RESOURCE;
-               default:
-                       return BLK_STS_IOERR;
-               }
+               return virtblk_fail_to_queue(req, err);
        }
 
        if (bd->last && virtqueue_kick_prepare(vblk->vqs[qid].vq))