[Libguestfs] [PATCH nbdkit v4 04/15] blocksize: Implement extents.

Richard W.M. Jones rjones at redhat.com
Tue Mar 26 21:17:13 UTC 2019


---
 filters/blocksize/nbdkit-blocksize-filter.pod |  4 ++--
 filters/blocksize/blocksize.c                 | 19 +++++++++++++++++++
 2 files changed, 21 insertions(+), 2 deletions(-)

diff --git a/filters/blocksize/nbdkit-blocksize-filter.pod b/filters/blocksize/nbdkit-blocksize-filter.pod
index b6cf4dd..0abed2f 100644
--- a/filters/blocksize/nbdkit-blocksize-filter.pod
+++ b/filters/blocksize/nbdkit-blocksize-filter.pod
@@ -56,8 +56,8 @@ of 1024.
 
 =item B<maxlen=>SIZE
 
-The maximum length for any single transaction without data (trim and
-zero).  If omitted, this defaults to 0xffffffff rounded down to
+The maximum length for any single transaction without data (trim, zero
+or extents).  If omitted, this defaults to 0xffffffff rounded down to
 C<minsize> alignment (that is, the inherent 32-bit limit of the NBD
 protocol).  This need not be a power of two, but must be an integer
 multiple of C<minblock>, and should be at least as large as
diff --git a/filters/blocksize/blocksize.c b/filters/blocksize/blocksize.c
index 9e0e713..55b2d59 100644
--- a/filters/blocksize/blocksize.c
+++ b/filters/blocksize/blocksize.c
@@ -45,6 +45,7 @@
 #include <nbdkit-filter.h>
 
 #include "minmax.h"
+#include "rounding.h"
 
 /* XXX See design comment in filters/cow/cow.c. */
 #define THREAD_MODEL NBDKIT_THREAD_MODEL_SERIALIZE_ALL_REQUESTS
@@ -372,6 +373,23 @@ blocksize_zero (struct nbdkit_next_ops *next_ops, void *nxdata,
   return 0;
 }
 
+static int
+blocksize_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)
+{
+  /* Ask the plugin for blocksize-aligned data.  Since the extents
+   * list start is set to the real offset, everything before the
+   * offset is ignored automatically.  Also we only need to ask for
+   * maxlen of data, because it's fine to return less than the full
+   * count as long as we're making progress.
+   */
+  return next_ops->extents (nxdata,
+                            MIN (count, maxlen),
+                            ROUND_DOWN (offset, minblock),
+                            flags, extents, err);
+}
+
 static struct nbdkit_filter filter = {
   .name              = "blocksize",
   .longname          = "nbdkit blocksize filter",
@@ -386,6 +404,7 @@ static struct nbdkit_filter filter = {
   .pwrite            = blocksize_pwrite,
   .trim              = blocksize_trim,
   .zero              = blocksize_zero,
+  .extents           = blocksize_extents,
 };
 
 NBDKIT_REGISTER_FILTER(filter)
-- 
2.20.1




More information about the Libguestfs mailing list