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

Gal Ben Haim gbenhaim at redhat.com
Tue Oct 2 11:06:24 UTC 2018


+1 LGTM.
Thanks Richard.

On Fri, Sep 21, 2018 at 12:53 PM Richard W.M. Jones <rjones at redhat.com>
wrote:

> 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
>
>

-- 
*GAL bEN HAIM*
RHV DEVOPS
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://listman.redhat.com/archives/libguestfs/attachments/20181002/3064dec3/attachment.htm>


More information about the Libguestfs mailing list