[Libguestfs] [nbdkit PATCH 2/3] server: Fix NBDKIT_CACHE_EMULATE

Eric Blake eblake at redhat.com
Fri Jun 10 15:55:26 UTC 2022


When support for NBD_CMD_CACHE was first introduced, I coded up a
generic fallback under NBDKIT_CACHE_EMULATE that defers to .pread.
But due to a bug, the fallback repeatedly re-reads the first 64M of
the request, rather than actually advancing over the entire cache
request.  Sadly, I didn't even notice the bug when moving the
NBDKIT_CACHE_EMULATE code to the backend for use by all filters and
plugins, in 14eb056c (v1.15.1).

The next patch will add testsuite coverage.

Fixes: fdf06817 ("server: Internal hooks for implementing NBD_CMD_CACHE", v1.13.4)
---
 docs/nbdkit-filter.pod | 4 ++--
 docs/nbdkit-plugin.pod | 3 ++-
 server/backend.c       | 1 +
 3 files changed, 5 insertions(+), 3 deletions(-)

diff --git a/docs/nbdkit-filter.pod b/docs/nbdkit-filter.pod
index c4ec1004..f3d83b6e 100644
--- a/docs/nbdkit-filter.pod
+++ b/docs/nbdkit-filter.pod
@@ -1054,8 +1054,8 @@ cache requests.

 This function will not be called if C<.can_cache> returned
 C<NBDKIT_CACHE_NONE> or C<NBDKIT_CACHE_EMULATE>; in turn, the filter
-should not call C<next-E<gt>cache> unless
-C<next-E<gt>can_cache> returned C<NBDKIT_CACHE_NATIVE>.
+should not call C<next-E<gt>cache> if
+C<next-E<gt>can_cache> returned C<NBDKIT_CACHE_NONE>.

 The parameter C<flags> exists in case of future NBD protocol
 extensions; at this time, it will be 0 on input, and the filter should
diff --git a/docs/nbdkit-plugin.pod b/docs/nbdkit-plugin.pod
index 383dcffe..6a1d5ea5 100644
--- a/docs/nbdkit-plugin.pod
+++ b/docs/nbdkit-plugin.pod
@@ -1101,7 +1101,8 @@ result.

 =item C<NBDKIT_CACHE_NATIVE>

-The C<.cache> callback will be called.
+Cache support is advertised to the client.  The C<.cache> callback will
+be called if it exists, otherwise all cache requests instantly succeed.

 =back

diff --git a/server/backend.c b/server/backend.c
index 30ec4c24..3bbba601 100644
--- a/server/backend.c
+++ b/server/backend.c
@@ -828,6 +828,7 @@ backend_cache (struct context *c,
       if (backend_pread (c, buf, limit, offset, flags, err) == -1)
         return -1;
       count -= limit;
+      offset += limit;
     }
     return 0;
   }
-- 
2.36.1



More information about the Libguestfs mailing list