[libvirt] [PATCH 1/2] qemu: Fix checking of ABI stability when restoring external checkpoints

Ján Tomko jtomko at redhat.com
Tue Sep 17 08:51:18 UTC 2013


On 09/16/2013 02:36 PM, Peter Krempa wrote:
> External checkpoints have a bug in the implementation where they use the
> normal definition instead of the "migratable" one. This causes errors
> when the snapshot is being reverted using the workaround method via
> qemuDomainRestoreFlags() with a custom XML. This issue was introduced
> when commit 07966f6a8b5ccb5bb4c716b25deb8ba2e572cc67 changed the code to
> compare "migratable" XMLs from the user as we should have used
> migratable in the image too.
> 
> This patch adds a compatibility layer, so that fixing the snapshot code
> won't make existing snapshots fail to load.
> 
> Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1008340
> ---
>  src/qemu/qemu_driver.c | 22 +++++++++++++++++++---
>  1 file changed, 19 insertions(+), 3 deletions(-)
> 
> diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
> index ae1948f..22497f0 100644
> --- a/src/qemu/qemu_driver.c
> +++ b/src/qemu/qemu_driver.c
> @@ -5251,14 +5251,30 @@ qemuDomainSaveImageOpen(virQEMUDriverPtr driver,
>              goto error;
> 
>          newdef = qemuDomainDefCopy(driver, def2, VIR_DOMAIN_XML_MIGRATABLE);
> -        virDomainDefFree(def2);

You removed the freeing of def2 here and only free it on errors.

> -        if (!newdef)
> +        if (!newdef) {
> +            virDomainDefFree(def2);
>              goto error;
> +        }
> 
>          if (!virDomainDefCheckABIStability(def, newdef)) {
>              virDomainDefFree(newdef);
> -            goto error;
> +            virResetLastError();
> +
> +            /* Due to a bug in external snapshot creation code, the XML saved
> +             * in the save image was not a migratable XML. To ensure backwards
> +             * compatibility with the change of the saved XML type, we need
> +             * to check the ABI compatibility against the user provided XML if
> +             * the check against the migratable XML fails. */
> +            if (!virDomainDefCheckABIStability(def, def2)) {
> +                virDomainDefFree(def2);
> +                goto error;
> +            }
> +
> +            /* use the user provided XML */
> +            newdef = def2;

> +            def2 = NULL;

def2 is not used after this assignment.

>          }
> +
>          virDomainDefFree(def);
>          def = newdef;
>      }
> 

Jan




More information about the libvir-list mailing list