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 <[email protected]>
Reviewed-by: Stefan Hajnoczi <[email protected]>
---
 drivers/block/virtio_blk.c | 29 ++++++++++++++++-------------
 1 file changed, 16 insertions(+), 13 deletions(-)

diff --git a/drivers/block/virtio_blk.c b/drivers/block/virtio_blk.c
index 19da5defd734..3efe3da5f8c2 100644
--- a/drivers/block/virtio_blk.c
+++ b/drivers/block/virtio_blk.c
@@ -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))
-- 
2.34.1


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to