diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index c8c4f61cda..db030cc001 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -2981,6 +2981,25 @@ virDomainObjSetDefTransient(virCapsPtr caps, return ret; } + +/* + * Remove the running configuration and replace it with the persistent one. + * + * @param domain domain object pointer + */ +void +virDomainObjRemoveTransientDef(virDomainObjPtr domain) +{ + if (!domain->newDef) + return; + + virDomainDefFree(domain->def); + domain->def = domain->newDef; + domain->def->id = -1; + domain->newDef = NULL; +} + + /* * Return the persistent domain configuration. If domain is transient, * return the running config. diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index 0fe4154553..79dda1c321 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -2577,6 +2577,7 @@ void virDomainObjAssignDef(virDomainObjPtr domain, int virDomainObjSetDefTransient(virCapsPtr caps, virDomainXMLOptionPtr xmlopt, virDomainObjPtr domain); +void virDomainObjRemoveTransientDef(virDomainObjPtr domain); virDomainDefPtr virDomainObjGetPersistentDef(virCapsPtr caps, virDomainXMLOptionPtr xmlopt, diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index a5fa30562f..6a77e469f1 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -421,6 +421,7 @@ virDomainObjGetShortName; virDomainObjGetState; virDomainObjNew; virDomainObjParseNode; +virDomainObjRemoveTransientDef; virDomainObjSetDefTransient; virDomainObjSetMetadata; virDomainObjSetState; diff --git a/src/libxl/libxl_domain.c b/src/libxl/libxl_domain.c index a85dd75946..43f4a7f32b 100644 --- a/src/libxl/libxl_domain.c +++ b/src/libxl/libxl_domain.c @@ -811,13 +811,7 @@ libxlDomainCleanup(libxlDriverPrivatePtr driver, VIR_FREE(xml); } - if (vm->newDef) { - virDomainDefFree(vm->def); - vm->def = vm->newDef; - vm->def->id = -1; - vm->newDef = NULL; - } - + virDomainObjRemoveTransientDef(vm); virObjectUnref(cfg); } diff --git a/src/lxc/lxc_process.c b/src/lxc/lxc_process.c index 7703fe18fe..bce6a2f70e 100644 --- a/src/lxc/lxc_process.c +++ b/src/lxc/lxc_process.c @@ -246,12 +246,7 @@ static void virLXCProcessCleanup(virLXCDriverPtr driver, VIR_FREE(xml); } - if (vm->newDef) { - virDomainDefFree(vm->def); - vm->def = vm->newDef; - vm->def->id = -1; - vm->newDef = NULL; - } + virDomainObjRemoveTransientDef(vm); virObjectUnref(cfg); } diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c index e6e91dffd8..75965798e4 100644 --- a/src/qemu/qemu_process.c +++ b/src/qemu/qemu_process.c @@ -6039,12 +6039,7 @@ void qemuProcessStop(virQEMUDriverPtr driver, VIR_FREE(xml); } - if (vm->newDef) { - virDomainDefFree(vm->def); - vm->def = vm->newDef; - vm->def->id = -1; - vm->newDef = NULL; - } + virDomainObjRemoveTransientDef(vm); endjob: if (asyncJob != QEMU_ASYNC_JOB_NONE) diff --git a/src/test/test_driver.c b/src/test/test_driver.c index 53cfa3cf78..8dd7579874 100644 --- a/src/test/test_driver.c +++ b/src/test/test_driver.c @@ -588,14 +588,9 @@ testDomainShutdownState(virDomainPtr domain, virDomainObjPtr privdom, virDomainShutoffReason reason) { - if (privdom->newDef) { - virDomainDefFree(privdom->def); - privdom->def = privdom->newDef; - privdom->newDef = NULL; - } - + virDomainObjRemoveTransientDef(privdom); virDomainObjSetState(privdom, VIR_DOMAIN_SHUTOFF, reason); - privdom->def->id = -1; + if (domain) domain->id = -1; } diff --git a/src/uml/uml_driver.c b/src/uml/uml_driver.c index b9784538d8..4f25f76c4e 100644 --- a/src/uml/uml_driver.c +++ b/src/uml/uml_driver.c @@ -1135,12 +1135,7 @@ static int umlStartVMDaemon(virConnectPtr conn, if (ret < 0) { virDomainConfVMNWFilterTeardown(vm); umlCleanupTapDevices(vm); - if (vm->newDef) { - virDomainDefFree(vm->def); - vm->def = vm->newDef; - vm->def->id = -1; - vm->newDef = NULL; - } + virDomainObjRemoveTransientDef(vm); } /* NB we don't mark it running here - we do that async @@ -1182,12 +1177,7 @@ static void umlShutdownVMDaemon(struct uml_driver *driver, /* Stop autodestroy in case guest is restarted */ umlProcessAutoDestroyRemove(driver, vm); - if (vm->newDef) { - virDomainDefFree(vm->def); - vm->def = vm->newDef; - vm->def->id = -1; - vm->newDef = NULL; - } + virDomainObjRemoveTransientDef(vm); driver->nactive--; if (!driver->nactive && driver->inhibitCallback)