mirror of
https://github.com/libvirt/libvirt.git
synced 2025-02-13 00:46:03 -06:00
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.
This commit is contained in:
parent
08a72a7d89
commit
45ec297d6f
@ -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:
|
||||
|
@ -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;
|
||||
|
@ -457,26 +457,6 @@ cleanup:
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* Set up domain runtime state */
|
||||
static int
|
||||
testDomainStartState(virConnectPtr conn,
|
||||
virDomainObjPtr dom)
|
||||
{
|
||||
testConnPtr privconn = conn->privateData;
|
||||
int ret = -1;
|
||||
|
||||
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++;
|
||||
|
||||
ret = 0;
|
||||
cleanup:
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void
|
||||
testDomainShutdownState(virDomainPtr domain,
|
||||
virDomainObjPtr privdom)
|
||||
@ -489,7 +469,33 @@ testDomainShutdownState(virDomainPtr domain,
|
||||
|
||||
privdom->state = VIR_DOMAIN_SHUTOFF;
|
||||
privdom->def->id = -1;
|
||||
domain->id = -1;
|
||||
if (domain)
|
||||
domain->id = -1;
|
||||
}
|
||||
|
||||
/* Set up domain runtime state */
|
||||
static int
|
||||
testDomainStartState(virConnectPtr conn,
|
||||
virDomainObjPtr dom)
|
||||
{
|
||||
testConnPtr privconn = conn->privateData;
|
||||
int ret = -1;
|
||||
|
||||
if (testDomainUpdateVCPUs(conn, dom, dom->def->vcpus, 1) < 0)
|
||||
goto cleanup;
|
||||
|
||||
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 int testOpenDefault(virConnectPtr conn) {
|
||||
@ -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);
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user