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)
committerMichael S. Tsirkin <mst@redhat.com>
Wed, 28 Dec 2022 10:09:47 +0000 (05:09 -0500)
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>
drivers/block/virtio_blk.c

index 68bd2f7961b3f5ad7d64843f2fbc659984cd3c92..271a9878fa8b3555804faf59deb6a726c4c27541 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))