[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
>