diff mbox series

[v6,1/2] virtio-blk: use a helper to handle request queuing errors

Message ID 20221109044632.3121790-2-dmitry.fomichev@wdc.com (mailing list archive)
State New, archived
Headers show
Series virtio-blk: support zoned block devices | expand

Commit Message

Dmitry Fomichev Nov. 9, 2022, 4:46 a.m. UTC
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>
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
Reviewed-by: Johannes Thumshirn <johannes.thumshirn@wdc.com>
Reviewed-by: Chaitanya Kulkarni <kch@nvidia.com>
---
 drivers/block/virtio_blk.c | 29 ++++++++++++++++-------------
 1 file changed, 16 insertions(+), 13 deletions(-)

Comments

Damien Le Moal Nov. 9, 2022, 5:25 a.m. UTC | #1
On 11/9/22 13:46, Dmitry Fomichev wrote:
> 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>
> Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
> Reviewed-by: Johannes Thumshirn <johannes.thumshirn@wdc.com>
> Reviewed-by: Chaitanya Kulkarni <kch@nvidia.com>

(you forgot to add my Rb tag that I sent...)

Reviewed-by: Damien Le Moal <damien.lemoal@opensource.wdc.com>

> ---
>  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))
diff mbox series

Patch

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))