On 06/06/2016 09:37 AM, Peter Krempa wrote:
On Fri, Jun 03, 2016 at 06:42:09 -0400, John Ferlan wrote:
> Since we support QEMU 0.12 and later, checking for support of specific flags
> added prior to that isn't necessary.
>
> Thus start with the base of having the "-o options" available for the
> qemu-img create option and then determine whether we have the compat
> option for qcow2 files (which would be necessary up through qemu 2.0
> where the default changes to compat 0.11).
>
> NOTE: Keeping old tests around since it's still possible to create in
> the old format.
>
> Signed-off-by: John Ferlan <jferlan(a)redhat.com>
> ---
> src/storage/storage_backend.c | 66 ++++++++++++++++---------------------------
> 1 file changed, 24 insertions(+), 42 deletions(-)
>
> diff --git a/src/storage/storage_backend.c b/src/storage/storage_backend.c
> index 2076155..4c40e43 100644
> --- a/src/storage/storage_backend.c
> +++ b/src/storage/storage_backend.c
> @@ -869,9 +869,19 @@ virStoragePloopResize(virStorageVolDefPtr vol,
> return ret;
> }
>
> +/* Flag values shared w/ storagevolxml2argvtest.c.
> + * Since it's still possible to provide the old format args, just
> + * keep them; however, prefix with an "X_" (similar to
qemu_capabilities.c)
> + * to indicate the are older.
We use that approach as we can't delete the already existing flags since
we wouldn't be able to parse the status XML. For qemu-img we don't store
the flags anywhere so the old ones can be deleted.
> + *
> + * QEMU_IMG_BACKING_FORMAT_OPTIONS (added in qemu 0.11)
> + * QEMU_IMG_BACKING_FORMAT_OPTIONS_COMPAT
> + * was made necessary due to 2.0 change to change the default
> + * qcow2 file format from 0.10 to 1.1.
> + */
> enum {
> - QEMU_IMG_BACKING_FORMAT_NONE = 0,
> - QEMU_IMG_BACKING_FORMAT_FLAG,
> + X_QEMU_IMG_BACKING_FORMAT_NONE = 0,
So this can be dropped entirely after the hunk below.
> + X_QEMU_IMG_BACKING_FORMAT_FLAG,
This will be never set either after the hunk below.
> QEMU_IMG_BACKING_FORMAT_OPTIONS,
> QEMU_IMG_BACKING_FORMAT_OPTIONS_COMPAT,
> };
> @@ -904,46 +914,18 @@ virStorageBackendQemuImgSupportsCompat(const char *qemuimg)
> static int
> virStorageBackendQEMUImgBackingFormat(const char *qemuimg)
> {
> - char *help = NULL;
> - char *start;
> - char *end;
> - char *tmp;
> - int ret = -1;
> - int exitstatus;
> - virCommandPtr cmd = virCommandNewArgList(qemuimg, "-h", NULL);
> -
> - virCommandAddEnvString(cmd, "LC_ALL=C");
> - virCommandSetOutputBuffer(cmd, &help);
> - virCommandClearCaps(cmd);
> -
> - /* qemuimg doesn't return zero exit status on -h,
> - * therefore we need to provide pointer for storing
> - * exit status, although we don't parse it any later */
> - if (virCommandRun(cmd, &exitstatus) < 0)
> - goto cleanup;
> + /* As of QEMU 0.11 the [-o options] support was added via qemu
> + * commit id '9ea2ea71', so we start with that base and figure
> + * out what else we have */
> + int ret = QEMU_IMG_BACKING_FORMAT_OPTIONS;
So this flag can basically be completely removed as it should be always
present in qemu-img 0.12
> +
> + /* QEMU 2.0 changed to using a format that only QEMU 1.1 and newer
> + * understands. Since we still support QEMU 0.12 and newer, we need
> + * to be able to handle the previous format as can be set via a
> + * compat=0.10 option. */
> + if (virStorageBackendQemuImgSupportsCompat(qemuimg))
> + ret = QEMU_IMG_BACKING_FORMAT_OPTIONS_COMPAT;
Yup, we need this.
>
> - if ((start = strstr(help, " create ")) == NULL ||
> - (end = strstr(start, "\n")) == NULL) {
> - virReportError(VIR_ERR_INTERNAL_ERROR,
> - _("unable to parse qemu-img output '%s'"),
> - help);
> - goto cleanup;
> - }
> - if (((tmp = strstr(start, "-F fmt")) && tmp < end) ||
> - ((tmp = strstr(start, "-F backing_fmt")) && tmp < end))
{
> - ret = QEMU_IMG_BACKING_FORMAT_FLAG;
> - } else if ((tmp = strstr(start, "[-o options]")) && tmp <
end) {
> - if (virStorageBackendQemuImgSupportsCompat(qemuimg))
> - ret = QEMU_IMG_BACKING_FORMAT_OPTIONS_COMPAT;
> - else
> - ret = QEMU_IMG_BACKING_FORMAT_OPTIONS;
> - } else {
> - ret = QEMU_IMG_BACKING_FORMAT_NONE;
> - }
> -
> - cleanup:
> - virCommandFree(cmd);
> - VIR_FREE(help);
> return ret;
> }
>
> @@ -1219,7 +1201,7 @@ virStorageBackendCreateQemuImgCmdFromVol(virConnectPtr conn,
> VIR_FREE(opts);
> } else {
> if (info.backingPath) {
> - if (imgformat == QEMU_IMG_BACKING_FORMAT_FLAG)
> + if (imgformat == X_QEMU_IMG_BACKING_FORMAT_FLAG)
So ... if the above is never set, why aren't you dropping this entire
case?
It wasn't clear if tests/storagevolxml2argvtest.c should then be
removed, adjusted, or otherwise. It replicated the flags I put the X_ in
front of as:
enum {
FMT_NONE = 0,
FMT_FLAG,
FMT_OPTIONS,
FMT_COMPAT,
};
Whether we care or not to support/test all those old options was unclear
to me. I would think at some point in time qemu-img would drop those in
preference for the new arguments.
I you think essentially doing away with all those old options is fine, I
can certain do/add that.
John
> virCommandAddArgList(cmd, "-F",
backingType, NULL);
> else
> VIR_DEBUG("Unable to set backing store format for %s with
%s",