From mboxrd@z Thu Jan 1 00:00:00 1970 From: Andrey Zhadchenko Date: Tue, 25 Aug 2026 15:51:49 +0300 Subject: [Devel] [PATCH VZ10 v3 2/5] drivers/vhost/blk: report correct used-ring lengths In-Reply-To: <20260825125152.259376-1-andrey.zhadchenko@virtuozzo.com> References: <20260825125152.259376-1-andrey.zhadchenko@virtuozzo.com> Message-ID: <20260825125152.259376-3-andrey.zhadchenko@virtuozzo.com> List-Id: We are expected to return amount of bytes written to the guest, which also includes status. https://virtuozzo.atlassian.net/browse/VSTOR-138640 Fixes: 40a5928ec730 ("drivers/vhost: vhost-blk accelerator for virtio-blk guests") Signed-off-by: Andrey Zhadchenko --- drivers/vhost/blk.c | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/drivers/vhost/blk.c b/drivers/vhost/blk.c index edd3e75873ff5..2c41a073004bc 100644 --- a/drivers/vhost/blk.c +++ b/drivers/vhost/blk.c @@ -445,12 +445,14 @@ static int vhost_blk_req_submit(struct vhost_blk_req *req) static int vhost_blk_req_handle(struct vhost_virtqueue *vq, struct virtio_blk_outhdr *hdr, - u16 head, u16 total_iov_nr) + u16 head, u16 out, u16 in) { struct vhost_blk *blk = container_of(vq->dev, struct vhost_blk, dev); struct vhost_blk_vq *blk_vq = container_of(vq, struct vhost_blk_vq, vq); struct vhost_blk_req *req; + u16 total_iov_nr = out + in; struct iov_iter iter; + size_t in_len; int ret, len; u8 status; @@ -461,8 +463,9 @@ static int vhost_blk_req_handle(struct vhost_virtqueue *vq, req->sector = hdr->sector; req->iov = blk_vq->iov; req->bio_err = 0; + in_len = iov_length(vq->iov + out, in); - if (iov_length(vq->iov, total_iov_nr) < sizeof(status)) + if (in_len < sizeof(status) || in_len > INT_MAX) return -EINVAL; req->len = iov_length(vq->iov, total_iov_nr) - sizeof(status); @@ -498,14 +501,14 @@ static int vhost_blk_req_handle(struct vhost_virtqueue *vq, ret = vhost_blk_set_status(req, status); if (ret) break; - vhost_add_used_and_signal(&blk->dev, vq, head, len); + vhost_add_used_and_signal(&blk->dev, vq, head, in_len); break; default: status = VIRTIO_BLK_S_UNSUPP; ret = vhost_blk_set_status(req, status); if (ret) break; - vhost_add_used_and_signal(&blk->dev, vq, head, 0); + vhost_add_used_and_signal(&blk->dev, vq, head, sizeof(status)); } return ret; @@ -561,7 +564,7 @@ static void vhost_blk_handle_guest_kick(struct vhost_work *work) break; } - ret = vhost_blk_req_handle(vq, &hdr, head, out + in); + ret = vhost_blk_req_handle(vq, &hdr, head, out, in); if (ret == -EAGAIN || ret == -ENOMEM) { vhost_discard_vq_desc(vq, 1); vhost_poll_queue(&vq->poll); @@ -610,7 +613,12 @@ static void vhost_blk_handle_host_kick(struct vhost_work *work) if (vhost_blk_set_status(req, status)) { vhostblk_vq_err(blk, vq, "Failed to write status"); } else { - vhost_add_used(vq, req->head, req->len); + int used_len = sizeof(status); + + if (req->bi_opf == REQ_OP_READ) + used_len += req->len; + + vhost_add_used(vq, req->head, used_len); added = true; } -- 2.43.5