[Libguestfs] [nbdkit PATCH 3/3] RFC swab: Re-enable .extents

Richard W.M. Jones rjones at redhat.com
Wed Jul 8 11:32:08 UTC 2020


On Tue, Jul 07, 2020 at 05:22:47PM -0500, Eric Blake wrote:
> This reverts commit 2c5aec42cf04c567639bd885cf12a57192229215.
> 
> Now that we have an easy way to generate aligned extents from the
> plugin, where the client will never see an unaligned extent
> transition, it's time to put it to use.
> 
> Signed-off-by: Eric Blake <eblake at redhat.com>
> 
> ---
> Here's what I used on the command line; I need to turn it into a formal test:
> 
> $ ./nbdkit -U - eval pread='exit 1' get_size='echo 8' can_extents='exit 0' \
>  extents='printf "0 3\n3 4 hole,zero\n7 1\n"' --run \
>  'qemu-img map -f raw --output=json $uri'
> $ ./nbdkit -U - --filter=swab eval pread='exit 1' get_size='echo 8' can_extents='exit 0' extents='printf "0 3\n3 4 hole,zero\n7 1\n"' --run 'qemu-img map -f raw --output=json $uri'
> 
> except it's currently failing:
> nbdkit: eval[1]: error: swab: requests to this filter must be aligned
> nbdkit: backend.c:621: backend_extents: Assertion `*err' failed.
> qemu-img: Could not read file metadata: Input/output error

I would add -v to the command line, as it will show you exactly what
requests qemu-img is making.  The assert failure seems to be a
separate and worrying problem.

Rich.

>  filters/swab/swab.c | 16 ++++++++--------
>  1 file changed, 8 insertions(+), 8 deletions(-)
> 
> diff --git a/filters/swab/swab.c b/filters/swab/swab.c
> index 57a51aee..2e423bbf 100644
> --- a/filters/swab/swab.c
> +++ b/filters/swab/swab.c
> @@ -191,15 +191,15 @@ swab_zero (struct nbdkit_next_ops *next_ops, void *nxdata,
>    return next_ops->zero (nxdata, count, offset, flags, err);
>  }
> 
> -/* FIXME: Extents could be useful, but if the underlying plugin ever reports
> - * values not aligned to 2 bytes, it is complicated to adjust that correctly.
> - * In the short term, we punt by disabling extents.
> - */
> +/* Extents. */
>  static int
> -swab_can_extents (struct nbdkit_next_ops *next_ops, void *nxdata,
> -                  void *handle)
> +swab_extents (struct nbdkit_next_ops *next_ops, void *nxdata,
> +              void *handle, uint32_t count, uint64_t offset, uint32_t flags,
> +              struct nbdkit_extents *extents, int *err)
>  {
> -  return 0;
> +  if (!is_aligned (count, offset)) return -1;
> +  return nbdkit_extents_aligned (next_ops, nxdata, count, offset, flags,
> +                                 bits/8, extents, err);
>  }
> 
>  /* Cache. */
> @@ -223,7 +223,7 @@ static struct nbdkit_filter filter = {
>    .pwrite            = swab_pwrite,
>    .trim              = swab_trim,
>    .zero              = swab_zero,
> -  .can_extents       = swab_can_extents,
> +  .extents           = swab_extents,
>    .cache             = swab_cache,
>  };
> 
> -- 
> 2.27.0
> 
> _______________________________________________
> Libguestfs mailing list
> Libguestfs at redhat.com
> https://www.redhat.com/mailman/listinfo/libguestfs

-- 
Richard Jones, Virtualization Group, Red Hat http://people.redhat.com/~rjones
Read my programming and virtualization blog: http://rwmj.wordpress.com
virt-df lists disk usage of guests without needing to install any
software inside the virtual machine.  Supports Linux and Windows.
http://people.redhat.com/~rjones/virt-df/




More information about the Libguestfs mailing list