Signed-off-by: Chen Fan <chen.fan.fnst(a)cn.fujitsu.com>
---
src/qemu/qemu_driver.c | 8 ++++++++
src/qemu/qemu_process.c | 3 ++-
2 files changed, 10 insertions(+), 1 deletion(-)
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index 86d93d2..112acb1 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -3208,6 +3208,10 @@ qemuDomainSaveInternal(virQEMUDriverPtr driver, virDomainPtr dom,
/* Pause */
if (virDomainObjGetState(vm, NULL) == VIR_DOMAIN_RUNNING) {
was_running = true;
+ /* Detach ephemeral host devices first */
+ if (qemuMigrationDetachEphemeralDevices(driver, vm, true) < 0)
+ goto endjob;
+
if (qemuProcessStopCPUs(driver, vm, VIR_DOMAIN_PAUSED_SAVE,
QEMU_ASYNC_JOB_SAVE) < 0)
goto endjob;
@@ -3249,6 +3253,8 @@ qemuDomainSaveInternal(virQEMUDriverPtr driver, virDomainPtr dom,
VIR_DOMAIN_EVENT_SUSPENDED,
VIR_DOMAIN_EVENT_SUSPENDED_API_ERROR);
}
+ qemuMigrationRestoreEphemeralDevices(driver, dom->conn, vm, true);
+
virSetError(save_err);
virFreeError(save_err);
}
@@ -6404,6 +6410,8 @@ qemuDomainSaveImageStartVM(virConnectPtr conn,
if (event)
qemuDomainEventQueue(driver, event);
+ /* Restore ephemeral devices */
+ qemuMigrationRestoreEphemeralDevices(driver, NULL, vm, true);
/* If it was running before, resume it now unless caller requested pause. */
if (header->was_running && !start_paused) {
diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
index 904c447..6519477 100644
--- a/src/qemu/qemu_process.c
+++ b/src/qemu/qemu_process.c
@@ -4501,7 +4501,8 @@ int qemuProcessStart(virConnectPtr conn,
* during migration. hence we should remove the reserved
* PCI address for ephemeral device.
*/
- if (vmop == VIR_NETDEV_VPORT_PROFILE_OP_MIGRATE_IN_START)
+ if (vmop == VIR_NETDEV_VPORT_PROFILE_OP_MIGRATE_IN_START ||
+ vmop == VIR_NETDEV_VPORT_PROFILE_OP_RESTORE)
if (qemuMigrationDetachEphemeralDevices(driver, vm, false) < 0)
goto cleanup;
--
1.9.3