[Devel] [PATCH VZ10] drivers/vhost/blk: set correct iter directions

Pavel Tikhomirov ptikhomirov at virtuozzo.com
Mon Apr 20 12:06:38 MSK 2026


Looks good.

Should we also update used defines in:

kernel-vz10$ git grep iov_iter_bvec drivers/md/dm-{qcow2,ploop}* 
drivers/md/dm-ploop-bat.c:      iov_iter_bvec(&iter, READ, bvec, 1, PAGE_SIZE);
drivers/md/dm-ploop-bat.c:      iov_iter_bvec(&iter, READ, bvec, nr_segs, size);
drivers/md/dm-ploop-map.c:      iov_iter_bvec(&iter, rw, bvec, nr_segs, pio->bi_iter.bi_size);
drivers/md/dm-ploop-target.c:   iov_iter_bvec(&iter, rw, bvec, 1, PAGE_SIZE);
drivers/md/dm-qcow2-map.c:      iov_iter_bvec(&iter, rw, bvec, nr_segs, qio->bi_iter.bi_size);
drivers/md/dm-qcow2-target.c:   iov_iter_bvec(&iter, rw, bvec, nr, size);

? AFICS the directions are correct, so this would be only a cleanup, not a bugfix.

On 4/20/26 03:28, Andrey Zhadchenko wrote:
> On newer kernel VMs with vhostblk disks freeze after the first
> request.
> This is due incorrect directions in copy_from_iter() and
> copy_to_iter(). Newer kernel version actually check this values,
> so we get zero from copy_from_iter() in
> vhost_blk_handle_guest_kick() and never answer the guest.
> 
> Technically READ direction in iterator mean "data destination,
> as used with read(2)" and not "we read data from iterator".
> It was later deemed confusing and changed: see commit de4eda9de2d9
> ("use less confusing names for iov_iter direction initializers")
> 
> Fix this error with new defines from the same commit.

Reviewed-by: Pavel Tikhomirov <ptikhomirov at virtuozzo.com>

> 
> Signed-off-by: Andrey Zhadchenko <andrey.zhadchenko at virtuozzo.com>
> ---
>  drivers/vhost/blk.c | 10 +++++-----
>  1 file changed, 5 insertions(+), 5 deletions(-)
> 
> diff --git a/drivers/vhost/blk.c b/drivers/vhost/blk.c
> index fdb063fafc996..5acdf973ac71a 100644
> --- a/drivers/vhost/blk.c
> +++ b/drivers/vhost/blk.c
> @@ -130,7 +130,7 @@ static inline int vhost_blk_set_status(struct vhost_blk_req *req, u8 status)
>  	struct iov_iter iter;
>  	int ret;
>  
> -	iov_iter_init(&iter, WRITE, req->status, ARRAY_SIZE(req->status), sizeof(status));
> +	iov_iter_init(&iter, ITER_DEST, req->status, ARRAY_SIZE(req->status), sizeof(status));
>  	ret = copy_to_iter(&status, sizeof(status), &iter);
>  	if (ret != sizeof(status)) {
>  		vq_err(&req->blk_vq->vq, "Failed to write status\n");
> @@ -238,7 +238,7 @@ static size_t vhost_blk_move_req_to_bb(struct vhost_blk_req *req)
>  {
>  	struct iov_iter iter;
>  
> -	iov_iter_init(&iter, req->bi_opf, req->iov, req->iov_nr, req->len);
> +	iov_iter_init(&iter, ITER_SOURCE, req->iov, req->iov_nr, req->len);
>  	if (copy_from_iter(req->bb, req->len, &iter) != req->len)
>  		return -EINVAL;
>  
> @@ -249,7 +249,7 @@ static size_t vhost_blk_move_bb_to_req(struct vhost_blk_req *req)
>  {
>  	struct iov_iter iter;
>  
> -	iov_iter_init(&iter, req->bi_opf, req->iov, req->iov_nr, req->len);
> +	iov_iter_init(&iter, ITER_DEST, req->iov, req->iov_nr, req->len);
>  	if (copy_to_iter(req->bb, req->len, &iter) != req->len)
>  		return -EINVAL;
>  
> @@ -472,7 +472,7 @@ static int vhost_blk_req_handle(struct vhost_virtqueue *vq,
>  		break;
>  	case VIRTIO_BLK_T_GET_ID:
>  		len = strnlen(blk->serial, VIRTIO_BLK_ID_BYTES);
> -		iov_iter_init(&iter, WRITE, req->iov, req->iov_nr, req->len);
> +		iov_iter_init(&iter, ITER_DEST, req->iov, req->iov_nr, req->len);
>  		ret = copy_to_iter(blk->serial, len, &iter);
>  		status = ret != len ? VIRTIO_BLK_S_IOERR : VIRTIO_BLK_S_OK;
>  		ret = vhost_blk_set_status(req, status);
> @@ -535,7 +535,7 @@ static void vhost_blk_handle_guest_kick(struct vhost_work *work)
>  			break;
>  		}
>  
> -		iov_iter_init(&iter, READ, hdr_iovec, ARRAY_SIZE(hdr_iovec), sizeof(hdr));
> +		iov_iter_init(&iter, ITER_SOURCE, hdr_iovec, ARRAY_SIZE(hdr_iovec), sizeof(hdr));
>  		ret = copy_from_iter(&hdr, sizeof(hdr), &iter);
>  		if (ret != sizeof(hdr)) {
>  			vq_err(vq, "Failed to get block header: read %d bytes instead of %ld!\n",

-- 
Best regards, Pavel Tikhomirov
Senior Software Developer, Virtuozzo.



More information about the Devel mailing list