mirror of
https://github.com/libguestfs/libguestfs.git
synced 2026-03-22 07:03:38 +00:00
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:
committed by
Pino Toscano
parent
06e5cfb90b
commit
4591419929
@@ -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;
|
||||
};
|
||||
|
||||
/**
|
||||
|
||||
@@ -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.
|
||||
*/
|
||||
|
||||
39
lib/info.c
39
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 --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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user