qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PATCH] virtio-9p: fix any_layout


From: Jason Wang
Subject: Re: [Qemu-devel] [PATCH] virtio-9p: fix any_layout
Date: Fri, 24 Jul 2015 10:14:02 +0800
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:31.0) Gecko/20100101 Thunderbird/31.8.0


On 07/24/2015 01:59 AM, Michael S. Tsirkin wrote:
> virtio pci allows any device to have a modern interface,
> this in turn requires ANY_LAYOUT support.
> Fix up ANY_LAYOUT for virtio-9p.
>
> Reported-by: Jason Wang <address@hidden>
> Signed-off-by: Michael S. Tsirkin <address@hidden>
> ---
>
> Lightly tested.

Looks correct.

Reviewed-by: Jason Wang <address@hidden>

>
>  hw/9pfs/virtio-9p.c | 22 ++++++++++++++++------
>  1 file changed, 16 insertions(+), 6 deletions(-)
>
> diff --git a/hw/9pfs/virtio-9p.c b/hw/9pfs/virtio-9p.c
> index 6ef8af3..7a3171f 100644
> --- a/hw/9pfs/virtio-9p.c
> +++ b/hw/9pfs/virtio-9p.c
> @@ -3261,16 +3261,26 @@ void handle_9p_output(VirtIODevice *vdev, VirtQueue 
> *vq)
>  
>      while ((pdu = alloc_pdu(s)) &&
>              (len = virtqueue_pop(vq, &pdu->elem)) != 0) {
> -        uint8_t *ptr;
> +        struct {
> +            uint32_t size_le;
> +            uint8_t id;
> +            uint16_t tag_le;
> +        } QEMU_PACKED out;
> +        int len;
> +
>          pdu->s = s;
>          BUG_ON(pdu->elem.out_num == 0 || pdu->elem.in_num == 0);
> -        BUG_ON(pdu->elem.out_sg[0].iov_len < 7);
> +        QEMU_BUILD_BUG_ON(sizeof out != 7);
> +
> +        len = iov_to_buf(pdu->elem.out_sg, pdu->elem.out_num, 0,
> +                         &out, sizeof out);
> +        BUG_ON(len != sizeof out);
> +
> +        pdu->size = le32_to_cpu(out.size_le);
>  
> -        ptr = pdu->elem.out_sg[0].iov_base;
> +        pdu->id = out.id;
> +        pdu->tag = le16_to_cpu(out.tag_le);
>  
> -        pdu->size = le32_to_cpu(*(uint32_t *)ptr);
> -        pdu->id = ptr[4];
> -        pdu->tag = le16_to_cpu(*(uint16_t *)(ptr + 5));
>          qemu_co_queue_init(&pdu->complete);
>          submit_pdu(s, pdu);
>      }




reply via email to

[Prev in Thread] Current Thread [Next in Thread]