[Libguestfs] [PATCH nbdkit] server: Implement extents/can_extents calls for plugins and filters.
Martin Kletzander
mkletzan at redhat.com
Tue Mar 12 12:23:37 UTC 2019
On Tue, Mar 12, 2019 at 11:20:25AM +0000, Richard W.M. Jones wrote:
>This pair of calls allows plugins to describe which extents in the
>virtual disk are allocated, holes or zeroes.
>---
> docs/nbdkit-filter.pod | 22 +++++++++++
> docs/nbdkit-plugin.pod | 86 +++++++++++++++++++++++++++++++++++++++++
> include/nbdkit-common.h | 14 ++++++-
> include/nbdkit-filter.h | 12 +++++-
> include/nbdkit-plugin.h | 6 ++-
> server/internal.h | 7 +++-
> server/filters.c | 61 +++++++++++++++++++++++++++++
> server/plugins.c | 72 +++++++++++++++++++++++++++++++++-
> 8 files changed, 275 insertions(+), 5 deletions(-)
>
[...]
>diff --git a/docs/nbdkit-plugin.pod b/docs/nbdkit-plugin.pod
>index 47545f3..9cc62b6 100644
>--- a/docs/nbdkit-plugin.pod
>+++ b/docs/nbdkit-plugin.pod
[...]
>@@ -717,6 +731,78 @@ If there is an error, C<.zero> should call C<nbdkit_error> with an
> error message, and C<nbdkit_set_error> to record an appropriate error
> (unless C<errno> is sufficient), then return C<-1>.
>
>+=head2 C<.extents>
>+
>+ int zero (void *handle, uint32_t count, uint64_t offset, uint32_t flags,
s/zero/extents/
[...]
>diff --git a/server/filters.c b/server/filters.c
>index 5b7abc4..d6cc00f 100644
>--- a/server/filters.c
>+++ b/server/filters.c
[...]
>@@ -646,6 +680,31 @@ filter_zero (struct backend *b, struct connection *conn,
> count, offset, flags, err);
> }
>
>+static int
>+filter_extents (struct backend *b, struct connection *conn,
>+ uint32_t count, uint64_t offset, uint32_t flags,
>+ size_t *nr_extents, struct nbdkit_extent **extents,
>+ int *err)
>+{
>+ struct backend_filter *f = container_of (b, struct backend_filter, backend);
>+ void *handle = connection_get_handle (conn, f->backend.i);
>+ struct b_conn nxdata = { .b = f->backend.next, .conn = conn };
>+
>+ assert (!(flags & ~NBDKIT_FLAG_REQ_ONE));
>+
>+ debug ("%s: extents count=%" PRIu32 " offset=%" PRIu64 " flags=0x%" PRIx32,
>+ f->name, count, offset, flags);
>+
>+ if (f->filter.extents)
>+ return f->filter.extents (&next_ops, &nxdata, handle,
>+ count, offset, flags,
>+ nr_extents, extents, err);
>+ else
>+ return f->backend.next->extents (f->backend.next, conn,
>+ count, offset, flags,
>+ nr_extents, extents, err);
Do I understand it correctly that if a filter does not support extents, then its
function will only be applied on the allocated blocks? It makes sense, but I
feel like it would be nice to have that mentioned somewhere.
Other than that it looks OK to me, I'll try to cook up a test filter to test
this, but mainly as a fun exercise for myself.
Have a nice day,
Martin
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 833 bytes
Desc: not available
URL: <http://listman.redhat.com/archives/libguestfs/attachments/20190312/edc9212b/attachment.sig>
More information about the Libguestfs
mailing list