qemu-devel
[Top][All Lists]
Advanced

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

Re: [Qemu-devel] [PATCH v3 2/2] xen: fix qdisk BLKIF_OP_DISCARD for 32/6


From: Stefano Stabellini
Subject: Re: [Qemu-devel] [PATCH v3 2/2] xen: fix qdisk BLKIF_OP_DISCARD for 32/64 word size mix
Date: Mon, 20 Jun 2016 10:52:06 +0100 (BST)
User-agent: Alpine 2.10 (DEB 1266 2009-07-14)

On Mon, 20 Jun 2016, Juergen Gross wrote:
> In case the word size of the domU and qemu running the qdisk backend
> differ BLKIF_OP_DISCARD will not work reliably, as the request
> structure in the ring have different layouts for different word size.
> 
> Correct this by copying the request structure in case of different
> word size element by element in the BLKIF_OP_DISCARD case, too.
> 
> Signed-off-by: Juergen Gross <address@hidden>

Acked-by: Stefano Stabellini <address@hidden>


>  hw/block/xen_blkif.h | 20 ++++++++++++++++++--
>  1 file changed, 18 insertions(+), 2 deletions(-)
> 
> diff --git a/hw/block/xen_blkif.h b/hw/block/xen_blkif.h
> index 7ccf92e..0738684 100644
> --- a/hw/block/xen_blkif.h
> +++ b/hw/block/xen_blkif.h
> @@ -28,6 +28,14 @@ struct blkif_x86_32_request {
>      blkif_sector_t sector_number;    /* start sector idx on disk (r/w only)  
> */
>      struct blkif_request_segment seg[BLKIF_MAX_SEGMENTS_PER_REQUEST];
>  };
> +struct blkif_x86_32_request_discard {
> +    uint8_t        operation;        /* BLKIF_OP_DISCARD                     
> */
> +    uint8_t        flag;             /* nr_segments in request struct        
> */
> +    blkif_vdev_t   handle;           /* only for read/write requests         
> */
> +    uint64_t       id;               /* private guest value, echoed in resp  
> */
> +    blkif_sector_t sector_number;    /* start sector idx on disk (r/w only)  
> */
> +    uint64_t       nr_sectors;       /* # of contiguous sectors to discard   
> */
> +};
>  struct blkif_x86_32_response {
>      uint64_t        id;              /* copied from request */
>      uint8_t         operation;       /* copied from request */
> @@ -46,6 +54,14 @@ struct blkif_x86_64_request {
>      blkif_sector_t sector_number;    /* start sector idx on disk (r/w only)  
> */
>      struct blkif_request_segment seg[BLKIF_MAX_SEGMENTS_PER_REQUEST];
>  };
> +struct blkif_x86_64_request_discard {
> +    uint8_t        operation;        /* BLKIF_OP_DISCARD                     
> */
> +    uint8_t        flag;             /* nr_segments in request struct        
> */
> +    blkif_vdev_t   handle;           /* only for read/write requests         
> */
> +    uint64_t       __attribute__((__aligned__(8))) id;
> +    blkif_sector_t sector_number;    /* start sector idx on disk (r/w only)  
> */
> +    uint64_t       nr_sectors;       /* # of contiguous sectors to discard   
> */
> +};
>  struct blkif_x86_64_response {
>      uint64_t       __attribute__((__aligned__(8))) id;
>      uint8_t         operation;       /* copied from request */
> @@ -88,7 +104,7 @@ static inline void blkif_get_x86_32_req(blkif_request_t 
> *dst,
>      /* Prevent the compiler from using src->... instead. */
>      barrier();
>      if (dst->operation == BLKIF_OP_DISCARD) {
> -        struct blkif_request_discard *s = (void *)src;
> +        struct blkif_x86_32_request_discard *s = (void *)src;
>          struct blkif_request_discard *d = (void *)dst;
>          d->nr_sectors = s->nr_sectors;
>          return;
> @@ -114,7 +130,7 @@ static inline void blkif_get_x86_64_req(blkif_request_t 
> *dst,
>      /* Prevent the compiler from using src->... instead. */
>      barrier();
>      if (dst->operation == BLKIF_OP_DISCARD) {
> -        struct blkif_request_discard *s = (void *)src;
> +        struct blkif_x86_64_request_discard *s = (void *)src;
>          struct blkif_request_discard *d = (void *)dst;
>          d->nr_sectors = s->nr_sectors;
>          return;
> -- 
> 2.6.6
> 



reply via email to

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