Skip to content

Commit

Permalink
qemu: Use qemuDomainCheckABIStability where needed
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
jirkade committed Jun 14, 2017
1 parent 063b2b8 commit f0a3fe1
Show file tree
Hide file tree
Showing 2 changed files with 43 additions and 32 deletions.
73 changes: 42 additions & 31 deletions src/qemu/qemu_driver.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
Expand Down Expand Up @@ -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;
Expand Down
2 changes: 1 addition & 1 deletion src/qemu/qemu_migration.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down

0 comments on commit f0a3fe1

Please sign in to comment.