[Libguestfs] [libnbd PATCH] interop: Tolerate qemu-nbd 6.0 change in behavior
Nir Soffer
nsoffer at redhat.com
Tue Apr 13 16:33:36 UTC 2021
On Tue, Apr 13, 2021 at 1:07 AM Eric Blake <eblake at redhat.com> wrote:
>
> Qemu 6.0 commit 0da9856851 (nbd: server: Report holes for faw images)
raw
> intentionally changed how holes are reported, not only for raw images,
> but for known-zero portions of qcow2 files.
Do you have an example for known-zero?
> As the point of our
> dirty-bitmap test is more about reading multiple contexts from a
> single qemu-nbd process, it is okay to accept both behaviors for
> base:allocation reporting on a block of zeros.
> ---
> interop/dirty-bitmap.c | 40 +++++++++++++++++++++++++++++-----------
> 1 file changed, 29 insertions(+), 11 deletions(-)
>
> diff --git a/interop/dirty-bitmap.c b/interop/dirty-bitmap.c
> index 5f9fa12f..ed445712 100644
> --- a/interop/dirty-bitmap.c
> +++ b/interop/dirty-bitmap.c
> @@ -1,5 +1,5 @@
> /* NBD client library in userspace
> - * Copyright (C) 2013-2019 Red Hat Inc.
> + * Copyright (C) 2013-2021 Red Hat Inc.
> *
> * This library is free software; you can redistribute it and/or
> * modify it under the terms of the GNU Lesser General Public
> @@ -48,7 +48,10 @@ cb (void *opaque, const char *metacontext, uint64_t offset,
>
> /* libnbd does not actually verify that a server is fully compliant
> * to the spec; the asserts marked [qemu-nbd] are thus dependent on
> - * the fact that qemu-nbd is compliant.
> + * the fact that qemu-nbd is compliant. Furthermore, qemu 5.2 and
> + * 6.0 disagree on whether base:allocation includes the hole bit for
> + * the zeroes at 512k (both answers are compliant); but we care more
> + * that the zeroes show up in the dirty bitmap
So 6.0 show reports a hole for zeroed area, and 5.2 reports data?
When we copy the image with qemu-img convert, do we get
a hole in the destination?
> */
> assert (offset == 0);
> assert (!*error || (data->fail && data->count == 1 && *error == EPROTO));
> @@ -57,19 +60,34 @@ cb (void *opaque, const char *metacontext, uint64_t offset,
> if (strcmp (metacontext, LIBNBD_CONTEXT_BASE_ALLOCATION) == 0) {
> assert (!data->seen_base); /* [qemu-nbd] */
> data->seen_base = true;
> - assert (len == (data->req_one ? 2 : 8)); /* [qemu-nbd] */
> + if (data->req_one)
> + assert (len == 2); /* [qemu-nbd] */
> + else
> + assert ((len & 1) == 0 && len > 2); /* [qemu-nbd] */
>
> /* Data block offset 0 size 128k */
> assert (entries[0] == 131072); assert (entries[1] == 0);
> if (!data->req_one) {
> - /* hole|zero offset 128k size 384k */
> - assert (entries[2] == 393216); assert (entries[3] == (LIBNBD_STATE_HOLE|
> - LIBNBD_STATE_ZERO));
> - /* allocated zero offset 512k size 64k */
> - assert (entries[4] == 65536); assert (entries[5] == LIBNBD_STATE_ZERO);
> - /* hole|zero offset 576k size 448k */
> - assert (entries[6] == 458752); assert (entries[7] == (LIBNBD_STATE_HOLE|
> - LIBNBD_STATE_ZERO));
> + if (len == 4) {
> + /* hole|zero offset 128k size 896k */
Is this the qemu-nbd 5.2 behavior?
> + assert (entries[2] == 917504);
> + assert (entries[3] == (LIBNBD_STATE_HOLE|
> + LIBNBD_STATE_ZERO));
> + }
> + else {
> + assert (len == 8);
> + /* hole|zero offset 128k size 384k */
Moving the comment under the else will be more clear.
> + assert (entries[2] == 393216);
> + assert (entries[3] == (LIBNBD_STATE_HOLE|
> + LIBNBD_STATE_ZERO));
> + /* allocated zero offset 512k size 64k */
> + assert (entries[4] == 65536);
> + assert (entries[5] == LIBNBD_STATE_ZERO);
> + /* hole|zero offset 576k size 448k */
> + assert (entries[6] == 458752);
> + assert (entries[7] == (LIBNBD_STATE_HOLE|
> + LIBNBD_STATE_ZERO));
> + }
> }
> }
> else if (strcmp (metacontext, bitmap) == 0) {
> --
> 2.31.1
>
More information about the Libguestfs
mailing list