[Libguestfs] [PATCH v2] lib: Use qemu-img info -U option to avoid locking error.

Richard W.M. Jones rjones at redhat.com
Fri Sep 21 09:53:52 UTC 2018


https://bugs.launchpad.net/qemu/+bug/1740364
---
 lib/guestfs-internal.h |  3 +++
 lib/handle.c           |  2 ++
 lib/info.c             | 39 +++++++++++++++++++++++++++++++++++++++
 3 files changed, 44 insertions(+)

diff --git a/lib/guestfs-internal.h b/lib/guestfs-internal.h
index adeb9478a..c66c55e70 100644
--- a/lib/guestfs-internal.h
+++ b/lib/guestfs-internal.h
@@ -510,6 +510,9 @@ struct guestfs_h {
   /* Cached features. */
   struct cached_feature *features;
   size_t nr_features;
+
+  /* Used by lib/info.c.  -1 = not tested or error; else 0 or 1. */
+  int qemu_img_supports_U_option;
 };
 
 /**
diff --git a/lib/handle.c b/lib/handle.c
index a47aaafab..297ff6d67 100644
--- a/lib/handle.c
+++ b/lib/handle.c
@@ -101,6 +101,8 @@ guestfs_create_flags (unsigned flags, ...)
 
   g->memsize = DEFAULT_MEMSIZE;
 
+  g->qemu_img_supports_U_option = -1; /* not tested, see lib/info.c */
+
   /* Start with large serial numbers so they are easy to spot
    * inside the protocol.
    */
diff --git a/lib/info.c b/lib/info.c
index 2eadc1c11..74e4424b8 100644
--- a/lib/info.c
+++ b/lib/info.c
@@ -57,6 +57,7 @@ cleanup_json_t_decref (void *ptr)
 #endif
 
 static json_t *get_json_output (guestfs_h *g, const char *filename);
+static int qemu_img_supports_U_option (guestfs_h *g);
 static void set_child_rlimits (struct command *);
 
 char *
@@ -149,6 +150,11 @@ get_json_output (guestfs_h *g, const char *filename)
 
   guestfs_int_cmd_add_arg (cmd, "qemu-img");
   guestfs_int_cmd_add_arg (cmd, "info");
+  switch (qemu_img_supports_U_option (g)) {
+  case -1: return NULL;
+  case 0:  break;
+  default: guestfs_int_cmd_add_arg (cmd, "-U");
+  }
   guestfs_int_cmd_add_arg (cmd, "--output");
   guestfs_int_cmd_add_arg (cmd, "json");
   if (filename[0] == '/')
@@ -218,3 +224,36 @@ set_child_rlimits (struct command *cmd)
   guestfs_int_cmd_set_child_rlimit (cmd, RLIMIT_CPU, 10 /* seconds */);
 #endif
 }
+
+/**
+ * Test if the qemu-img info command supports the C<-U> option to
+ * disable locking.  The result is memoized in the handle.
+ *
+ * Note this option was added in qemu 2.11.  We can remove this test
+ * when we can assume everyone is using qemu >= 2.11.
+ */
+static int
+qemu_img_supports_U_option (guestfs_h *g)
+{
+  if (g->qemu_img_supports_U_option >= 0)
+    return g->qemu_img_supports_U_option;
+
+  CLEANUP_CMD_CLOSE struct command *cmd = guestfs_int_new_command (g);
+  int r;
+
+  guestfs_int_cmd_add_string_unquoted (cmd,
+                                       "qemu-img info --help | "
+                                       "grep -sq -- 'info.*-U'");
+  r = guestfs_int_cmd_run (cmd);
+  if (r == -1)
+    return -1;
+  if (!WIFEXITED (r)) {
+    guestfs_int_external_command_failed (g, r,
+                                         "qemu-img info -U option test",
+                                         NULL);
+    return -1;
+  }
+
+  g->qemu_img_supports_U_option = WEXITSTATUS (r) == 0;
+  return g->qemu_img_supports_U_option;
+}
-- 
2.19.0.rc0




More information about the Libguestfs mailing list