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 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list