[Libguestfs] [libnbd PATCH 4/4] copy: Ignore extents if we encountered earlier error

Eric Blake eblake at redhat.com
Tue Feb 1 19:44:50 UTC 2022


In practice, the nbd extents callback will only be called once per
nbd_aio_block_status, because we have only requested exactly one
metacontext id, and because compliant servers send only one reply
chunk per id.  In theory, a server could reply first with an error
chunk (perhaps meaning "I'm unable to get status beyond offset X")
followed by an extent chunk ("but here's what I was able to get")
while still being compliant.  And a non-compliant server can send
unexpected chunks, just to try and confuse us.  Right now, it would
take a custom NBD server to actually trigger any scenario where *error
would ever be non-zero on entry to next_extent() (nbdkit does not have
that much power).  So while *error ever being non-zero is unlikely,
our easiest course is to handle it the same way we would for a server
sending us an unexpected id: ignore the rest of the extent callback.
The later completion callback will handle the overall command failing.
---
 copy/nbd-ops.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/copy/nbd-ops.c b/copy/nbd-ops.c
index dfc62f20..ab30badd 100644
--- a/copy/nbd-ops.c
+++ b/copy/nbd-ops.c
@@ -1,5 +1,5 @@
 /* NBD client library in userspace.
- * Copyright (C) 2020 Red Hat Inc.
+ * Copyright (C) 2020-2022 Red Hat Inc.
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -337,7 +337,7 @@ add_extent (void *vp, const char *metacontext,
   extent_list *ret = vp;
   size_t i;

-  if (strcmp (metacontext, "base:allocation") != 0)
+  if (strcmp (metacontext, "base:allocation") != 0 || *error)
     return 0;

   for (i = 0; i < nr_entries; i += 2) {
-- 
2.34.1




More information about the Libguestfs mailing list