]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
qemu: Use qemuDomainCheckABIStability where needed
authorJiri Denemark <jdenemar@redhat.com>
Wed, 14 Jun 2017 12:56:21 +0000 (14:56 +0200)
committerJiri Denemark <jdenemar@redhat.com>
Wed, 14 Jun 2017 15:13:24 +0000 (17:13 +0200)
Most places which want to check ABI stability for an active domain need
to call this API rather than the original
qemuDomainDefCheckABIStability. The only exception is in snapshots where
we need to decide what to do depending on the saved image data.

https://bugzilla.redhat.com/show_bug.cgi?id=1460952

Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
Reviewed-by: Pavel Hrdina <phrdina@redhat.com>
src/qemu/qemu_driver.c
src/qemu/qemu_migration.c

index ba1dba5b7e4676dcbed946899cabb140b38d52d8..d3526da8cddcf32f8bdbab6864ef1dccfee2423a 100644 (file)
@@ -3340,7 +3340,7 @@ qemuDomainSaveInternal(virQEMUDriverPtr driver, virDomainPtr dom,
                                             VIR_DOMAIN_DEF_PARSE_SKIP_VALIDATE))) {
             goto endjob;
         }
-        if (!qemuDomainDefCheckABIStability(driver, vm->def, def)) {
+        if (!qemuDomainCheckABIStability(driver, vm, def)) {
             virDomainDefFree(def);
             goto endjob;
         }
@@ -15412,39 +15412,50 @@ qemuDomainRevertToSnapshot(virDomainSnapshotPtr snapshot,
          * to have finer control.  */
         if (virDomainObjIsActive(vm)) {
             /* Transitions 5, 6, 8, 9 */
-            /* Replace the CPU in config and put the original one in priv
-             * once we're done.
-             */
-            if (cookie && cookie->cpu && config->cpu) {
-                origCPU = config->cpu;
-                if (!(config->cpu = virCPUDefCopy(cookie->cpu)))
-                    goto endjob;
-            }
-
             /* Check for ABI compatibility. We need to do this check against
              * the migratable XML or it will always fail otherwise */
-            if (config &&
-                !qemuDomainDefCheckABIStability(driver, vm->def, config)) {
-                virErrorPtr err = virGetLastError();
-
-                if (!(flags & VIR_DOMAIN_SNAPSHOT_REVERT_FORCE)) {
-                    /* Re-spawn error using correct category. */
-                    if (err->code == VIR_ERR_CONFIG_UNSUPPORTED)
-                        virReportError(VIR_ERR_SNAPSHOT_REVERT_RISKY, "%s",
-                                       err->str2);
-                    goto endjob;
+            if (config) {
+                bool compatible;
+
+                /* Replace the CPU in config and put the original one in priv
+                 * once we're done. When we have the updated CPU def in the
+                 * cookie, we don't want to replace the CPU in migratable def
+                 * when doing ABI checks to make sure the current CPU exactly
+                 * matches the one used at the time the snapshot was taken.
+                 */
+                if (cookie && cookie->cpu && config->cpu) {
+                    origCPU = config->cpu;
+                    if (!(config->cpu = virCPUDefCopy(cookie->cpu)))
+                        goto endjob;
+
+                    compatible = qemuDomainDefCheckABIStability(driver, vm->def,
+                                                                config);
+                } else {
+                    compatible = qemuDomainCheckABIStability(driver, vm, config);
+                }
+
+                if (!compatible) {
+                    virErrorPtr err = virGetLastError();
+
+                    if (!(flags & VIR_DOMAIN_SNAPSHOT_REVERT_FORCE)) {
+                        /* Re-spawn error using correct category. */
+                        if (err->code == VIR_ERR_CONFIG_UNSUPPORTED)
+                            virReportError(VIR_ERR_SNAPSHOT_REVERT_RISKY, "%s",
+                                           err->str2);
+                        goto endjob;
+                    }
+                    virResetError(err);
+                    qemuProcessStop(driver, vm,
+                                    VIR_DOMAIN_SHUTOFF_FROM_SNAPSHOT,
+                                    QEMU_ASYNC_JOB_START, 0);
+                    virDomainAuditStop(vm, "from-snapshot");
+                    detail = VIR_DOMAIN_EVENT_STOPPED_FROM_SNAPSHOT;
+                    event = virDomainEventLifecycleNewFromObj(vm,
+                                                     VIR_DOMAIN_EVENT_STOPPED,
+                                                     detail);
+                    qemuDomainEventQueue(driver, event);
+                    goto load;
                 }
-                virResetError(err);
-                qemuProcessStop(driver, vm,
-                                VIR_DOMAIN_SHUTOFF_FROM_SNAPSHOT,
-                                QEMU_ASYNC_JOB_START, 0);
-                virDomainAuditStop(vm, "from-snapshot");
-                detail = VIR_DOMAIN_EVENT_STOPPED_FROM_SNAPSHOT;
-                event = virDomainEventLifecycleNewFromObj(vm,
-                                                 VIR_DOMAIN_EVENT_STOPPED,
-                                                 detail);
-                qemuDomainEventQueue(driver, event);
-                goto load;
             }
 
             priv = vm->privateData;
index dce2504a3ba1f4f3da526efb1fd83b6b7bbed8ea..8129dcd406384356ffb4243f9fef13d4f3ac3fe0 100644 (file)
@@ -2059,7 +2059,7 @@ qemuMigrationBeginPhase(virQEMUDriverPtr driver,
                                             VIR_DOMAIN_DEF_PARSE_SKIP_VALIDATE)))
             goto cleanup;
 
-        if (!qemuDomainDefCheckABIStability(driver, vm->def, def))
+        if (!qemuDomainCheckABIStability(driver, vm, def))
             goto cleanup;
 
         rv = qemuDomainDefFormatLive(driver, def, NULL, false, true);