lib: Use qemu-img info -U option to avoid locking error.

https://bugs.launchpad.net/qemu/+bug/1740364
(cherry picked from commit f00f920ad3)
This commit is contained in:
Richard W.M. Jones
2018-09-12 17:16:20 +01:00
committed by Pino Toscano
parent 06e5cfb90b
commit 4591419929
3 changed files with 44 additions and 0 deletions

View File

@@ -521,6 +521,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;
};
/**

View File

@@ -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.
*/

View File

@@ -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 --help | "
"grep -sqE -- '\\binfo\\b.*-U\\b'");
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;
}