Currently, if lzop decompression binary produces a warning, it
doesn't exit with zero status but 2 instead. Terrifying, but
true. However, warnings may be ignored using '--ignore-warn'
command line argument. Moreover, in which case, the exit status
will be zero.
---
src/qemu/qemu_driver.c | 62 ++++++++++++++++++++++++++++++++------------------
1 file changed, 40 insertions(+), 22 deletions(-)
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index dc35b91..a0a1f04 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -2507,6 +2507,34 @@ qemuCompressProgramName(int compress)
qemuSaveCompressionTypeToString(compress));
}
+static virCommandPtr
+qemuCompressGetCommand(virQEMUSaveFormat compression)
+{
+ virCommandPtr ret = NULL;
+ const char *prog = qemuSaveCompressionTypeToString(compression);
+
+ if (!prog) {
+ virReportError(VIR_ERR_OPERATION_FAILED,
+ _("Invalid compressed save format %d"),
+ compression);
+ return NULL;
+ }
+
+ ret = virCommandNew(prog);
+ virCommandAddArg(ret, "-dc");
+
+ switch (compression) {
+ case QEMU_SAVE_FORMAT_LZOP:
+ virCommandAddArg(ret, "--ignore-warn");
+ break;
+ default:
+ /* Ain't no valid compressed save format */
+ break;
+ }
+
+ return ret;
+}
+
/* Internal function to properly create or open existing files, with
* ownership affected by qemu driver setup. */
static int
@@ -4775,32 +4803,22 @@ qemuDomainSaveImageStartVM(virConnectPtr conn,
if (!(caps = virQEMUDriverGetCapabilities(driver, false)))
goto cleanup;
- if (header->version == 2) {
- const char *prog = qemuSaveCompressionTypeToString(header->compressed);
- if (prog == NULL) {
- virReportError(VIR_ERR_OPERATION_FAILED,
- _("Invalid compressed save format %d"),
- header->compressed);
+ if ((header->version == 2) &&
+ (header->compressed != QEMU_SAVE_FORMAT_RAW)) {
+ if (!(cmd = qemuCompressGetCommand(header->compressed)))
goto cleanup;
- }
- if (header->compressed != QEMU_SAVE_FORMAT_RAW) {
- cmd = virCommandNewArgList(prog, "-dc", NULL);
- intermediatefd = *fd;
- *fd = -1;
+ intermediatefd = *fd;
+ *fd = -1;
- virCommandSetInputFD(cmd, intermediatefd);
- virCommandSetOutputFD(cmd, fd);
- virCommandSetErrorBuffer(cmd, &errbuf);
- virCommandDoAsyncIO(cmd);
+ virCommandSetInputFD(cmd, intermediatefd);
+ virCommandSetOutputFD(cmd, fd);
+ virCommandSetErrorBuffer(cmd, &errbuf);
+ virCommandDoAsyncIO(cmd);
- if (virCommandRunAsync(cmd, NULL) < 0) {
- virReportError(VIR_ERR_INTERNAL_ERROR,
- _("Failed to start decompression binary %s"),
- prog);
- *fd = intermediatefd;
- goto cleanup;
- }
+ if (virCommandRunAsync(cmd, NULL) < 0) {
+ *fd = intermediatefd;
+ goto cleanup;
}
}
--
1.8.1.2