Commit 258896fc authored by Dmitry Fomichev's avatar Dmitry Fomichev Committed by Michael S. Tsirkin
Browse files

virtio-blk: use a helper to handle request queuing errors



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

Signed-off-by: default avatarDmitry Fomichev <dmitry.fomichev@wdc.com>
Message-Id: <20221016034127.330942-2-dmitry.fomichev@wdc.com>
Signed-off-by: default avatarMichael S. Tsirkin <mst@redhat.com>
parent c262f75c
Loading
Loading
Loading
Loading
+16 −13
Original line number Diff line number Diff line
@@ -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))