[Libguestfs] [nbdkit PATCH 05/10] plugins: Wire up file-based plugin support for NBD_INFO_INIT_STATE

Richard W.M. Jones rjones at redhat.com
Tue Feb 11 10:52:01 UTC 2020


On Mon, Feb 10, 2020 at 03:43:58PM -0600, Eric Blake wrote:
> @@ -214,6 +217,52 @@ file_open (int readonly)
>    h->can_fallocate = true;
>    h->can_zeroout = h->is_block_device;
> 
> +  h->can_extents = false;
> +  h->init_sparse = false;
> +  h->init_zero = false;
> +#ifdef SEEK_HOLE
> +  if (!h->is_block_device) {
> +    off_t r;
> +
> +    /* A simple test to see whether SEEK_DATA/SEEK_HOLE are likely to work on
> +     * the current filesystem, and to see if the image is sparse or zero.
> +     */
> +    ACQUIRE_LOCK_FOR_CURRENT_SCOPE (&lseek_lock);
> +    r = lseek (h->fd, 0, SEEK_DATA);
> +    if (r == -1) {
> +      if (errno == ENXIO) {
> +        nbdkit_debug ("extents enabled, entire image is hole");
> +        h->can_extents = true;
> +        h->init_sparse = true;
> +        h->init_zero = true;
> +      } else {
> +        nbdkit_debug ("extents disabled: lseek(SEEK_DATA): %m");
> +      }
> +    }
> +    else {
> +      h->can_extents = true;
> +      if (r > 0) {
> +        nbdkit_debug ("extents enabled, image includes hole before data");
> +        h->init_sparse = true;
> +      }
> +      else {
> +        r = lseek (h->fd, 0, SEEK_HOLE);
> +        if (r == -1) {
> +          nbdkit_debug ("extents disabled: lseek(SEEK_HOLE): %m");
> +          h->can_extents = false;
> +        }
> +        else if (r == statbuf.st_size) {
> +          nbdkit_debug ("extents enabled, image currently all data");
> +        }
> +        else {
> +          nbdkit_debug ("extents enabled, image includes data before hole");
> +          h->init_sparse = true;
> +        }
> +      }
> +    }
> +  }

In the non-block case, can't we stat(2) the file and look at statbuf.st_blocks?

> +requires nbdsh -c 'exit (not hasattr (h, "get_init_flags"))'

Not wrong, but it's easier to do it like this:

https://github.com/libguestfs/nbdkit/blob/5e4745641bb4676f607fdb3f8750dbf6e9516877/tests/test-vsock.sh#L48

Rich.

-- 
Richard Jones, Virtualization Group, Red Hat http://people.redhat.com/~rjones
Read my programming and virtualization blog: http://rwmj.wordpress.com
virt-p2v converts physical machines to virtual machines.  Boot with a
live CD or over the network (PXE) and turn machines into KVM guests.
http://libguestfs.org/virt-v2v




More information about the Libguestfs mailing list