From 45ec297d6fb63c65e9a876ebc7c013036be5868b Mon Sep 17 00:00:00 2001 From: Cole Robinson Date: Fri, 19 Nov 2010 13:36:29 -0500 Subject: [PATCH] Make state driver device hotplug/update actually transient The current semantics of non-persistent hotplug/update are confusing: the changes will persist as long as the in memory domain definition isn't overwritten. This means hotplug changes stay around until the domain is redefined or libvirtd is restarted. Call virDomainObjSetDefTransient at VM startup, so that we properly discard hotplug changes when the VM is shutdown. --- src/lxc/lxc_driver.c | 3 +++ src/qemu/qemu_driver.c | 5 +++++ src/test/test_driver.c | 42 ++++++++++++++++++++++++------------------ src/uml/uml_driver.c | 5 ++++- 4 files changed, 36 insertions(+), 19 deletions(-) diff --git a/src/lxc/lxc_driver.c b/src/lxc/lxc_driver.c index f5014cbd2c..f6ba137277 100644 --- a/src/lxc/lxc_driver.c +++ b/src/lxc/lxc_driver.c @@ -1532,6 +1532,9 @@ static int lxcVmStart(virConnectPtr conn, if (virDomainSaveConfig(driver->stateDir, vm->def) < 0) goto cleanup; + if (virDomainObjSetDefTransient(driver->caps, vm) < 0) + goto cleanup; + rc = 0; cleanup: diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index ed1ea6b715..18b3f16764 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -4235,6 +4235,11 @@ static int qemudStartVMDaemon(virConnectPtr conn, if (virDomainSaveStatus(driver->caps, driver->stateDir, vm) < 0) goto cleanup; + /* Do this last, since it depends on domain being active */ + DEBUG0("Setting running domain def as transient"); + if (virDomainObjSetDefTransient(driver->caps, vm) < 0) + goto cleanup; + VIR_FORCE_CLOSE(logfile); return 0; diff --git a/src/test/test_driver.c b/src/test/test_driver.c index 5693d7adba..5e737e8675 100644 --- a/src/test/test_driver.c +++ b/src/test/test_driver.c @@ -457,6 +457,22 @@ cleanup: return ret; } +static void +testDomainShutdownState(virDomainPtr domain, + virDomainObjPtr privdom) +{ + if (privdom->newDef) { + virDomainDefFree(privdom->def); + privdom->def = privdom->newDef; + privdom->newDef = NULL; + } + + privdom->state = VIR_DOMAIN_SHUTOFF; + privdom->def->id = -1; + if (domain) + domain->id = -1; +} + /* Set up domain runtime state */ static int testDomainStartState(virConnectPtr conn, @@ -468,30 +484,20 @@ testDomainStartState(virConnectPtr conn, if (testDomainUpdateVCPUs(conn, dom, dom->def->vcpus, 1) < 0) goto cleanup; - /* Set typical run state */ dom->state = VIR_DOMAIN_RUNNING; dom->def->id = privconn->nextDomID++; + if (virDomainObjSetDefTransient(privconn->caps, dom) < 0) { + goto cleanup; + } + ret = 0; cleanup: + if (ret < 0) + testDomainShutdownState(NULL, dom); return ret; } -static void -testDomainShutdownState(virDomainPtr domain, - virDomainObjPtr privdom) -{ - if (privdom->newDef) { - virDomainDefFree(privdom->def); - privdom->def = privdom->newDef; - privdom->newDef = NULL; - } - - privdom->state = VIR_DOMAIN_SHUTOFF; - privdom->def->id = -1; - domain->id = -1; -} - static int testOpenDefault(virConnectPtr conn) { int u; struct timeval tv; @@ -558,12 +564,12 @@ static int testOpenDefault(virConnectPtr conn) { goto error; domdef = NULL; + domobj->persistent = 1; if (testDomainStartState(conn, domobj) < 0) { virDomainObjUnlock(domobj); goto error; } - domobj->persistent = 1; virDomainObjUnlock(domobj); if (!(netdef = virNetworkDefParseString(defaultNetworkXML))) @@ -918,12 +924,12 @@ static int testOpenFromFile(virConnectPtr conn, goto error; } + dom->persistent = 1; if (testDomainStartState(conn, dom) < 0) { virDomainObjUnlock(dom); goto error; } - dom->persistent = 1; virDomainObjUnlock(dom); } VIR_FREE(domains); diff --git a/src/uml/uml_driver.c b/src/uml/uml_driver.c index ca4e7be695..eaa3509b5d 100644 --- a/src/uml/uml_driver.c +++ b/src/uml/uml_driver.c @@ -916,7 +916,11 @@ static int umlStartVMDaemon(virConnectPtr conn, VIR_EXEC_CLEAR_CAPS, NULL, NULL, NULL); VIR_FORCE_CLOSE(logfd); + if (ret < 0) + goto cleanup; + ret = virDomainObjSetDefTransient(driver->caps, vm); +cleanup: /* * At the moment, the only thing that populates keepfd is * umlBuildCommandLineChr. We want to close every fd it opens. @@ -940,7 +944,6 @@ static int umlStartVMDaemon(virConnectPtr conn, umlCleanupTapDevices(conn, vm); } - /* NB we don't mark it running here - we do that async with inotify */ /* XXX what if someone else tries to start it again -- GitLab