[libvirt] [PATCH] qemu: Run lzop with '--ignore-warn'
Jiri Denemark
jdenemar at redhat.com
Tue Feb 19 17:57:56 UTC 2013
On Tue, Feb 19, 2013 at 18:12:13 +0100, Michal Privoznik wrote:
> 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 | 68 ++++++++++++++++++++++++++++++++++----------------
> 1 file changed, 46 insertions(+), 22 deletions(-)
>
> diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
> index dc35b91..41c6168 100644
> --- a/src/qemu/qemu_driver.c
> +++ b/src/qemu/qemu_driver.c
> @@ -2507,6 +2507,36 @@ 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;
> + }
> +
> + if (!(ret = virCommandNew(prog))) {
> + virReportOOMError();
> + return NULL;
> + }
Wrong, checking the result of virCommandNew is useless. Moreover, you
should move the "-dc" options into this function too, it's quite strange
to see arguments being added in several places. Thus, you can just copy
the original line here:
ret = virCommandNewArgList(prog, "-dc", NULL);
> +
> + switch (compression) {
> + case QEMU_SAVE_FORMAT_LZOP:
> + virCommandAddArg(ret, "--ignore-warn");
> + break;
> + default:
> + /* Don't add nothing for now */
Is this double negative intentional? Should we perhaps rewrite the error
message above as "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 +4805,26 @@ 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);
> + virCommandAddArg(cmd, "-dc");
The line above should be moved to qemuCompressGetCommand().
> + 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) {
> + virReportError(VIR_ERR_INTERNAL_ERROR,
> + _("Failed to start decompression binary %s"),
> + qemuCompressProgramName(header->compressed));
I know this is not your fault but we should really avoid overwriting
already reported errors.
> + *fd = intermediatefd;
> + goto cleanup;
> }
> }
Jirka
More information about the libvir-list
mailing list