[Libguestfs] [libnbd PATCH] generator: Trace return even when in wrong state

Eric Blake eblake at redhat.com
Fri Jul 31 22:11:38 UTC 2020


Place the tracing of return values after any generated 'out:' label,
as it is important to see even the errors caused by calling a function
in the wrong handle state.

Fixes: 9df088bfa9
---

Multiple bugs found today, but only time to submit one patch so far.
I found them all while trying to implement .list_exports in nbdkit.

Bug 1: 'nbdinfo --list --json $uri' produces invalid JSON if there are
0 or more than 1 exports.  We need to move the '"exports":[' and ']'
into list_all_exports(), not list_one_export(), and manage correct
trailing comma output.  (We only tested nbdinfo with qemu-nbd, which
only lists one export, explaining how we missed this)

Bug 2: nbd_get_nr_list_exports() fails if the handle is still in READY
state, even though there were exports listed and available in that
case.  I see no reason to forbid this during READY; but I've also
mentioned that there are probably more changes coming to the way we do
list export handling in libnbd to allow the reuse of a single handle
rather than our current hacks of one handle per export.  (We only
tested nbdinfo with qemu-nbd, which generally does NOT allow
NBD_OPT_GO on the '' export if it was advertising some other export;
nbdkit is more forgiving, explaining why I hit a case where nbdinfo
was calling this function in the wrong state)

Bug 3: this patch.  When a function fails due to use in the wrong
state, the debug output was useless in telling me why.

 generator/C.ml | 10 +++++-----
 1 file changed, 5 insertions(+), 5 deletions(-)

diff --git a/generator/C.ml b/generator/C.ml
index 4a0b45d..2c62d4e 100644
--- a/generator/C.ml
+++ b/generator/C.ml
@@ -542,13 +542,13 @@ let generate_lib_api_c () =
     pr "  ret = nbd_unlocked_%s " name;
     print_arg_list ~wrap:true ~types:false ~handle:true args optargs;
     pr ";\n";
-    if may_set_error then (
-      pr "\n";
-      print_trace_leave ret;
-      pr "\n"
-    );
+    pr "\n";
     if !need_out_label then
       pr " out:\n";
+    if may_set_error then (
+      print_trace_leave ret;
+      pr "\n"
+    );
     if is_locked then (
       pr "  if (h->public_state != get_next_state (h))\n";
       pr "    h->public_state = get_next_state (h);\n";
-- 
2.28.0




More information about the Libguestfs mailing list