On 11/8/22 13:07, 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@xxxxxxx> > Reviewed-by: Stefan Hajnoczi <stefanha@xxxxxxxxxx> Reviewed-by: Damien Le Moal <damien.lemoal@xxxxxxxxxxxxxxxxxx> > --- > 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)) -- Damien Le Moal Western Digital Research