[Libguestfs] [nbdkit PATCH 2/3] extents: Add nbdkit_extents_aligned()

Eric Blake eblake at redhat.com
Wed Jul 8 14:34:23 UTC 2020


On 7/8/20 6:28 AM, Richard W.M. Jones wrote:
> On Tue, Jul 07, 2020 at 05:22:46PM -0500, Eric Blake wrote:
> [...]
>> +/* Compute aligned extents on behalf of a filter. */
>> +int
>> +nbdkit_extents_aligned (struct nbdkit_next_ops *next_ops,
>> +                        nbdkit_backend *nxdata,
>> +                        uint32_t count, uint64_t offset,
>> +                        uint32_t flags, uint32_t align,
>> +                        struct nbdkit_extents *exts, int *err)
>> +{
>> +  size_t i;
>> +  struct nbdkit_extent e, e2;

Found my bug.  Unless these are a pointers...

>> +
>> +  if (!IS_ALIGNED(count | offset, align)) {
>> +    nbdkit_error ("nbdkit_extents_aligned: unaligned request");
>> +    *err = EINVAL;
>> +    return -1;
>> +  }
> 
> I wonder if this also should be an assert?  This is less clear to me
> than the vector case however.

I'm fine with an assert.

> 
>> +  /* Perform an initial query, then scan for the first unaligned extent. */
>> +  if (next_ops->extents (nxdata, count, offset, flags, exts, err) == -1)
>> +    return -1;
>> +  for (i = 0; i < exts->extents.size; ++i) {
>> +    e = exts->extents.ptr[i];

...then this merely copies data,

>> +    if (!IS_ALIGNED(e.length, align)) {
>> +      /* If the unalignment is past align, just truncate and return early */
>> +      if (e.offset + e.length > offset + align) {
>> +        e.length = ROUND_DOWN (e.length, align);

...and manipulating the copy doesn't affect what gets returned.  With 
that fixed, my tests are now working as desired.


> So we're intersecting (&) the types defined as:
> 
> #define NBDKIT_EXTENT_HOLE    (1<<0) /* Same as NBD_STATE_HOLE */
> #define NBDKIT_EXTENT_ZERO    (1<<1) /* Same as NBD_STATE_ZERO */
> 
> If all extents are holes, then it's a hole.  If all extents are zero,
> then it's a zero.  Otherwise it's non-zero data.
> 
> This seems correct.

I'll add a comment somewhere why intersection is correct.

> 
> All looks good to me, so ACK.
> 
> Rich.
> 

-- 
Eric Blake, Principal Software Engineer
Red Hat, Inc.           +1-919-301-3226
Virtualization:  qemu.org | libvirt.org




More information about the Libguestfs mailing list