diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c index 1443d969df..793e412070 100644 --- a/src/qemu/qemu_migration.c +++ b/src/qemu/qemu_migration.c @@ -3462,7 +3462,7 @@ qemuMigrationPrepareAny(virQEMUDriverPtr driver, goto stopjob; } - if (qemuProcessInit(driver, vm, true) < 0) + if (qemuProcessInit(driver, vm, true, false) < 0) goto stopjob; stopProcess = true; diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c index 13974ab465..fded697bcd 100644 --- a/src/qemu/qemu_process.c +++ b/src/qemu/qemu_process.c @@ -4401,6 +4401,32 @@ qemuProcessMakeDir(virQEMUDriverPtr driver, } +/** + * qemuProcessStartValidate: + * @vm: domain object + * @qemuCaps: emulator capabilities + * @migration: restoration of existing state + * + * This function aggregates checks independent from host state done prior to + * start of a VM. + */ +int +qemuProcessStartValidate(virDomainDefPtr def, + virQEMUCapsPtr qemuCaps, + bool migration, + bool snapshot) +{ + if (qemuValidateCpuCount(def, qemuCaps) < 0) + return -1; + + if (!migration && !snapshot && + virDomainDefCheckDuplicateDiskInfo(def) < 0) + return -1; + + return 0; +} + + /** * qemuProcessInit: * @@ -4412,7 +4438,8 @@ qemuProcessMakeDir(virQEMUDriverPtr driver, int qemuProcessInit(virQEMUDriverPtr driver, virDomainObjPtr vm, - bool migration) + bool migration, + bool snap) { virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver); virCapsPtr caps = NULL; @@ -4441,6 +4468,9 @@ qemuProcessInit(virQEMUDriverPtr driver, vm->def->os.machine))) goto cleanup; + if (qemuProcessStartValidate(vm->def, priv->qemuCaps, migration, snap) < 0) + goto cleanup; + /* Some things, paths, ... are generated here and we want them to persist. * Fill them in prior to setting the domain def as transient. */ VIR_DEBUG("Generating paths"); @@ -4641,9 +4671,6 @@ qemuProcessLaunch(virConnectPtr conn, } } - if (qemuValidateCpuCount(vm->def, priv->qemuCaps) < 0) - goto cleanup; - if (qemuAssignDeviceAliases(vm->def, priv->qemuCaps) < 0) goto cleanup; @@ -4667,10 +4694,6 @@ qemuProcessLaunch(virConnectPtr conn, goto cleanup; } - if (!incoming && !snapshot && - virDomainDefCheckDuplicateDiskInfo(vm->def) < 0) - goto cleanup; - /* "volume" type disk's source must be translated before * cgroup and security setting. */ @@ -5113,7 +5136,7 @@ qemuProcessStart(virConnectPtr conn, VIR_QEMU_PROCESS_START_PAUSED | VIR_QEMU_PROCESS_START_AUTODESTROY, cleanup); - if (qemuProcessInit(driver, vm, !!migrateFrom) < 0) + if (qemuProcessInit(driver, vm, !!migrateFrom, !!snapshot) < 0) goto cleanup; if (migrateFrom) { diff --git a/src/qemu/qemu_process.h b/src/qemu/qemu_process.h index cb5cee1626..907a58df3b 100644 --- a/src/qemu/qemu_process.h +++ b/src/qemu/qemu_process.h @@ -81,9 +81,16 @@ int qemuProcessStart(virConnectPtr conn, virNetDevVPortProfileOp vmop, unsigned int flags); + +int qemuProcessStartValidate(virDomainDefPtr def, + virQEMUCapsPtr qemuCaps, + bool migration, + bool snap); + int qemuProcessInit(virQEMUDriverPtr driver, virDomainObjPtr vm, - bool migration); + bool migration, + bool snap); int qemuProcessLaunch(virConnectPtr conn, virQEMUDriverPtr driver,