mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-03-07 17:28:15 +00:00
Stop accessing driver->caps directly in LXC driver
The 'driver->caps' pointer can be changed on the fly. Accessing it currently requires the global driver lock. Isolate this access in a single helper, so a future patch can relax the locking constraints.
This commit is contained in:
parent
c86950533a
commit
64ec738e58
@ -59,7 +59,7 @@ VIR_ONCE_GLOBAL_INIT(virLXCConfig)
|
|||||||
|
|
||||||
|
|
||||||
/* Functions */
|
/* Functions */
|
||||||
virCapsPtr lxcCapsInit(virLXCDriverPtr driver)
|
virCapsPtr virLXCDriverCapsInit(virLXCDriverPtr driver)
|
||||||
{
|
{
|
||||||
virCapsPtr caps;
|
virCapsPtr caps;
|
||||||
virCapsGuestPtr guest;
|
virCapsGuestPtr guest;
|
||||||
@ -153,6 +153,33 @@ error:
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* virLXCDriverGetCapabilities:
|
||||||
|
*
|
||||||
|
* Get a reference to the virCapsPtr instance for the
|
||||||
|
* driver. If @refresh is true, the capabilities will be
|
||||||
|
* rebuilt first
|
||||||
|
*
|
||||||
|
* The caller must release the reference with virObjetUnref
|
||||||
|
*
|
||||||
|
* Returns: a reference to a virCapsPtr instance or NULL
|
||||||
|
*/
|
||||||
|
virCapsPtr virLXCDriverGetCapabilities(virLXCDriverPtr driver,
|
||||||
|
bool refresh)
|
||||||
|
{
|
||||||
|
if (refresh) {
|
||||||
|
virCapsPtr caps = NULL;
|
||||||
|
if ((caps = virLXCDriverCapsInit(driver)) == NULL)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
virObjectUnref(driver->caps);
|
||||||
|
driver->caps = caps;
|
||||||
|
}
|
||||||
|
|
||||||
|
return virObjectRef(driver->caps);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
virDomainXMLOptionPtr
|
virDomainXMLOptionPtr
|
||||||
lxcDomainXMLConfInit(void)
|
lxcDomainXMLConfInit(void)
|
||||||
{
|
{
|
||||||
|
@ -72,7 +72,8 @@ struct _virLXCDriver {
|
|||||||
* then lockless thereafter */
|
* then lockless thereafter */
|
||||||
virLXCDriverConfigPtr config;
|
virLXCDriverConfigPtr config;
|
||||||
|
|
||||||
/* Require lock while using. Unsafe. XXX */
|
/* Require lock to get a reference on the object,
|
||||||
|
* lockless access thereafter */
|
||||||
virCapsPtr caps;
|
virCapsPtr caps;
|
||||||
|
|
||||||
|
|
||||||
@ -110,7 +111,9 @@ virLXCDriverConfigPtr virLXCDriverConfigNew(void);
|
|||||||
virLXCDriverConfigPtr virLXCDriverGetConfig(virLXCDriverPtr driver);
|
virLXCDriverConfigPtr virLXCDriverGetConfig(virLXCDriverPtr driver);
|
||||||
int virLXCLoadDriverConfig(virLXCDriverConfigPtr cfg,
|
int virLXCLoadDriverConfig(virLXCDriverConfigPtr cfg,
|
||||||
const char *filename);
|
const char *filename);
|
||||||
virCapsPtr lxcCapsInit(virLXCDriverPtr driver);
|
virCapsPtr virLXCDriverCapsInit(virLXCDriverPtr driver);
|
||||||
|
virCapsPtr virLXCDriverGetCapabilities(virLXCDriverPtr driver,
|
||||||
|
bool refresh);
|
||||||
virDomainXMLOptionPtr lxcDomainXMLConfInit(void);
|
virDomainXMLOptionPtr lxcDomainXMLConfInit(void);
|
||||||
|
|
||||||
static inline void lxcDriverLock(virLXCDriverPtr driver)
|
static inline void lxcDriverLock(virLXCDriverPtr driver)
|
||||||
|
@ -162,7 +162,7 @@ static virLXCControllerPtr virLXCControllerNew(const char *name)
|
|||||||
if (VIR_STRDUP(ctrl->name, name) < 0)
|
if (VIR_STRDUP(ctrl->name, name) < 0)
|
||||||
goto error;
|
goto error;
|
||||||
|
|
||||||
if ((caps = lxcCapsInit(NULL)) == NULL)
|
if (!(caps = virLXCDriverCapsInit(NULL)))
|
||||||
goto error;
|
goto error;
|
||||||
|
|
||||||
if (!(xmlopt = lxcDomainXMLConfInit()))
|
if (!(xmlopt = lxcDomainXMLConfInit()))
|
||||||
|
@ -193,16 +193,23 @@ static int lxcConnectIsAlive(virConnectPtr conn ATTRIBUTE_UNUSED)
|
|||||||
|
|
||||||
static char *lxcConnectGetCapabilities(virConnectPtr conn) {
|
static char *lxcConnectGetCapabilities(virConnectPtr conn) {
|
||||||
virLXCDriverPtr driver = conn->privateData;
|
virLXCDriverPtr driver = conn->privateData;
|
||||||
|
virCapsPtr caps;
|
||||||
char *xml;
|
char *xml;
|
||||||
|
|
||||||
if (virConnectGetCapabilitiesEnsureACL(conn) < 0)
|
if (virConnectGetCapabilitiesEnsureACL(conn) < 0)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
lxcDriverLock(driver);
|
lxcDriverLock(driver);
|
||||||
if ((xml = virCapabilitiesFormatXML(driver->caps)) == NULL)
|
if (!(caps = virLXCDriverGetCapabilities(driver, false))) {
|
||||||
|
lxcDriverUnlock(driver);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((xml = virCapabilitiesFormatXML(caps)) == NULL)
|
||||||
virReportOOMError();
|
virReportOOMError();
|
||||||
lxcDriverUnlock(driver);
|
lxcDriverUnlock(driver);
|
||||||
|
|
||||||
|
virObjectUnref(caps);
|
||||||
return xml;
|
return xml;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -457,11 +464,15 @@ static virDomainPtr lxcDomainDefineXML(virConnectPtr conn, const char *xml)
|
|||||||
virDomainEventPtr event = NULL;
|
virDomainEventPtr event = NULL;
|
||||||
virDomainDefPtr oldDef = NULL;
|
virDomainDefPtr oldDef = NULL;
|
||||||
virLXCDriverConfigPtr cfg = NULL;
|
virLXCDriverConfigPtr cfg = NULL;
|
||||||
|
virCapsPtr caps = NULL;
|
||||||
|
|
||||||
lxcDriverLock(driver);
|
lxcDriverLock(driver);
|
||||||
cfg = virLXCDriverGetConfig(driver);
|
cfg = virLXCDriverGetConfig(driver);
|
||||||
|
|
||||||
if (!(def = virDomainDefParseString(xml, driver->caps, driver->xmlopt,
|
if (!(caps = virLXCDriverGetCapabilities(driver, false)))
|
||||||
|
goto cleanup;
|
||||||
|
|
||||||
|
if (!(def = virDomainDefParseString(xml, caps, driver->xmlopt,
|
||||||
1 << VIR_DOMAIN_VIRT_LXC,
|
1 << VIR_DOMAIN_VIRT_LXC,
|
||||||
VIR_DOMAIN_XML_INACTIVE)))
|
VIR_DOMAIN_XML_INACTIVE)))
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
@ -509,6 +520,7 @@ cleanup:
|
|||||||
virObjectUnlock(vm);
|
virObjectUnlock(vm);
|
||||||
if (event)
|
if (event)
|
||||||
virDomainEventStateQueue(driver->domainEventState, event);
|
virDomainEventStateQueue(driver->domainEventState, event);
|
||||||
|
virObjectUnref(caps);
|
||||||
lxcDriverUnlock(driver);
|
lxcDriverUnlock(driver);
|
||||||
virObjectUnref(cfg);
|
virObjectUnref(cfg);
|
||||||
return dom;
|
return dom;
|
||||||
@ -1138,17 +1150,21 @@ lxcDomainCreateXMLWithFiles(virConnectPtr conn,
|
|||||||
unsigned int flags) {
|
unsigned int flags) {
|
||||||
virLXCDriverPtr driver = conn->privateData;
|
virLXCDriverPtr driver = conn->privateData;
|
||||||
virDomainObjPtr vm = NULL;
|
virDomainObjPtr vm = NULL;
|
||||||
virDomainDefPtr def;
|
virDomainDefPtr def = NULL;
|
||||||
virDomainPtr dom = NULL;
|
virDomainPtr dom = NULL;
|
||||||
virDomainEventPtr event = NULL;
|
virDomainEventPtr event = NULL;
|
||||||
virLXCDriverConfigPtr cfg = NULL;
|
virLXCDriverConfigPtr cfg = NULL;
|
||||||
|
virCapsPtr caps = NULL;
|
||||||
|
|
||||||
virCheckFlags(VIR_DOMAIN_START_AUTODESTROY, NULL);
|
virCheckFlags(VIR_DOMAIN_START_AUTODESTROY, NULL);
|
||||||
|
|
||||||
lxcDriverLock(driver);
|
lxcDriverLock(driver);
|
||||||
cfg = virLXCDriverGetConfig(driver);
|
cfg = virLXCDriverGetConfig(driver);
|
||||||
|
|
||||||
if (!(def = virDomainDefParseString(xml, driver->caps, driver->xmlopt,
|
if (!(caps = virLXCDriverGetCapabilities(driver, false)))
|
||||||
|
goto cleanup;
|
||||||
|
|
||||||
|
if (!(def = virDomainDefParseString(xml, caps, driver->xmlopt,
|
||||||
1 << VIR_DOMAIN_VIRT_LXC,
|
1 << VIR_DOMAIN_VIRT_LXC,
|
||||||
VIR_DOMAIN_XML_INACTIVE)))
|
VIR_DOMAIN_XML_INACTIVE)))
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
@ -1198,6 +1214,7 @@ cleanup:
|
|||||||
virObjectUnlock(vm);
|
virObjectUnlock(vm);
|
||||||
if (event)
|
if (event)
|
||||||
virDomainEventStateQueue(driver->domainEventState, event);
|
virDomainEventStateQueue(driver->domainEventState, event);
|
||||||
|
virObjectUnref(caps);
|
||||||
lxcDriverUnlock(driver);
|
lxcDriverUnlock(driver);
|
||||||
virObjectUnref(cfg);
|
virObjectUnref(cfg);
|
||||||
return dom;
|
return dom;
|
||||||
@ -1285,6 +1302,7 @@ static int lxcNodeGetSecurityModel(virConnectPtr conn,
|
|||||||
virSecurityModelPtr secmodel)
|
virSecurityModelPtr secmodel)
|
||||||
{
|
{
|
||||||
virLXCDriverPtr driver = conn->privateData;
|
virLXCDriverPtr driver = conn->privateData;
|
||||||
|
virCapsPtr caps = NULL;
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
|
|
||||||
lxcDriverLock(driver);
|
lxcDriverLock(driver);
|
||||||
@ -1293,12 +1311,15 @@ static int lxcNodeGetSecurityModel(virConnectPtr conn,
|
|||||||
if (virNodeGetSecurityModelEnsureACL(conn) < 0)
|
if (virNodeGetSecurityModelEnsureACL(conn) < 0)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
/* we treat no driver as success, but simply return no data in *secmodel */
|
if (!(caps = virLXCDriverGetCapabilities(driver, false)))
|
||||||
if (driver->caps->host.nsecModels == 0
|
|
||||||
|| driver->caps->host.secModels[0].model == NULL)
|
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
if (!virStrcpy(secmodel->model, driver->caps->host.secModels[0].model,
|
/* we treat no driver as success, but simply return no data in *secmodel */
|
||||||
|
if (caps->host.nsecModels == 0
|
||||||
|
|| caps->host.secModels[0].model == NULL)
|
||||||
|
goto cleanup;
|
||||||
|
|
||||||
|
if (!virStrcpy(secmodel->model, caps->host.secModels[0].model,
|
||||||
VIR_SECURITY_MODEL_BUFLEN)) {
|
VIR_SECURITY_MODEL_BUFLEN)) {
|
||||||
virReportError(VIR_ERR_INTERNAL_ERROR,
|
virReportError(VIR_ERR_INTERNAL_ERROR,
|
||||||
_("security model string exceeds max %d bytes"),
|
_("security model string exceeds max %d bytes"),
|
||||||
@ -1307,7 +1328,7 @@ static int lxcNodeGetSecurityModel(virConnectPtr conn,
|
|||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!virStrcpy(secmodel->doi, driver->caps->host.secModels[0].doi,
|
if (!virStrcpy(secmodel->doi, caps->host.secModels[0].doi,
|
||||||
VIR_SECURITY_DOI_BUFLEN)) {
|
VIR_SECURITY_DOI_BUFLEN)) {
|
||||||
virReportError(VIR_ERR_INTERNAL_ERROR,
|
virReportError(VIR_ERR_INTERNAL_ERROR,
|
||||||
_("security DOI string exceeds max %d bytes"),
|
_("security DOI string exceeds max %d bytes"),
|
||||||
@ -1317,6 +1338,7 @@ static int lxcNodeGetSecurityModel(virConnectPtr conn,
|
|||||||
}
|
}
|
||||||
|
|
||||||
cleanup:
|
cleanup:
|
||||||
|
virObjectUnref(caps);
|
||||||
lxcDriverUnlock(driver);
|
lxcDriverUnlock(driver);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
@ -1526,6 +1548,7 @@ static int lxcStateInitialize(bool privileged,
|
|||||||
virStateInhibitCallback callback ATTRIBUTE_UNUSED,
|
virStateInhibitCallback callback ATTRIBUTE_UNUSED,
|
||||||
void *opaque ATTRIBUTE_UNUSED)
|
void *opaque ATTRIBUTE_UNUSED)
|
||||||
{
|
{
|
||||||
|
virCapsPtr caps = NULL;
|
||||||
char *ld;
|
char *ld;
|
||||||
virLXCDriverConfigPtr cfg = NULL;
|
virLXCDriverConfigPtr cfg = NULL;
|
||||||
|
|
||||||
@ -1585,7 +1608,7 @@ static int lxcStateInitialize(bool privileged,
|
|||||||
if ((lxc_driver->activeUsbHostdevs = virUSBDeviceListNew()) == NULL)
|
if ((lxc_driver->activeUsbHostdevs = virUSBDeviceListNew()) == NULL)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
if ((lxc_driver->caps = lxcCapsInit(lxc_driver)) == NULL)
|
if ((virLXCDriverGetCapabilities(lxc_driver, true)) == NULL)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
if (!(lxc_driver->xmlopt = lxcDomainXMLConfInit()))
|
if (!(lxc_driver->xmlopt = lxcDomainXMLConfInit()))
|
||||||
@ -1594,11 +1617,14 @@ static int lxcStateInitialize(bool privileged,
|
|||||||
if (!(lxc_driver->closeCallbacks = virCloseCallbacksNew()))
|
if (!(lxc_driver->closeCallbacks = virCloseCallbacksNew()))
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
|
if (!(caps = virLXCDriverGetCapabilities(lxc_driver, false)))
|
||||||
|
goto cleanup;
|
||||||
|
|
||||||
/* Get all the running persistent or transient configs first */
|
/* Get all the running persistent or transient configs first */
|
||||||
if (virDomainObjListLoadAllConfigs(lxc_driver->domains,
|
if (virDomainObjListLoadAllConfigs(lxc_driver->domains,
|
||||||
cfg->stateDir,
|
cfg->stateDir,
|
||||||
NULL, 1,
|
NULL, 1,
|
||||||
lxc_driver->caps,
|
caps,
|
||||||
lxc_driver->xmlopt,
|
lxc_driver->xmlopt,
|
||||||
1 << VIR_DOMAIN_VIRT_LXC,
|
1 << VIR_DOMAIN_VIRT_LXC,
|
||||||
NULL, NULL) < 0)
|
NULL, NULL) < 0)
|
||||||
@ -1610,7 +1636,7 @@ static int lxcStateInitialize(bool privileged,
|
|||||||
if (virDomainObjListLoadAllConfigs(lxc_driver->domains,
|
if (virDomainObjListLoadAllConfigs(lxc_driver->domains,
|
||||||
cfg->configDir,
|
cfg->configDir,
|
||||||
cfg->autostartDir, 0,
|
cfg->autostartDir, 0,
|
||||||
lxc_driver->caps,
|
caps,
|
||||||
lxc_driver->xmlopt,
|
lxc_driver->xmlopt,
|
||||||
1 << VIR_DOMAIN_VIRT_LXC,
|
1 << VIR_DOMAIN_VIRT_LXC,
|
||||||
NULL, NULL) < 0)
|
NULL, NULL) < 0)
|
||||||
@ -1624,6 +1650,7 @@ static int lxcStateInitialize(bool privileged,
|
|||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
cleanup:
|
cleanup:
|
||||||
|
virObjectUnref(caps);
|
||||||
lxcDriverUnlock(lxc_driver);
|
lxcDriverUnlock(lxc_driver);
|
||||||
lxcStateCleanup();
|
lxcStateCleanup();
|
||||||
return -1;
|
return -1;
|
||||||
@ -1652,21 +1679,28 @@ static void lxcNotifyLoadDomain(virDomainObjPtr vm, int newVM, void *opaque)
|
|||||||
static int
|
static int
|
||||||
lxcStateReload(void) {
|
lxcStateReload(void) {
|
||||||
virLXCDriverConfigPtr cfg = NULL;
|
virLXCDriverConfigPtr cfg = NULL;
|
||||||
|
virCapsPtr caps = NULL;
|
||||||
|
|
||||||
if (!lxc_driver)
|
if (!lxc_driver)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
lxcDriverLock(lxc_driver);
|
lxcDriverLock(lxc_driver);
|
||||||
|
if (!(caps = virLXCDriverGetCapabilities(lxc_driver, false))) {
|
||||||
|
lxcDriverUnlock(lxc_driver);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
cfg = virLXCDriverGetConfig(lxc_driver);
|
cfg = virLXCDriverGetConfig(lxc_driver);
|
||||||
|
|
||||||
virDomainObjListLoadAllConfigs(lxc_driver->domains,
|
virDomainObjListLoadAllConfigs(lxc_driver->domains,
|
||||||
cfg->configDir,
|
cfg->configDir,
|
||||||
cfg->autostartDir, 0,
|
cfg->autostartDir, 0,
|
||||||
lxc_driver->caps,
|
caps,
|
||||||
lxc_driver->xmlopt,
|
lxc_driver->xmlopt,
|
||||||
1 << VIR_DOMAIN_VIRT_LXC,
|
1 << VIR_DOMAIN_VIRT_LXC,
|
||||||
lxcNotifyLoadDomain, lxc_driver);
|
lxcNotifyLoadDomain, lxc_driver);
|
||||||
lxcDriverUnlock(lxc_driver);
|
lxcDriverUnlock(lxc_driver);
|
||||||
|
virObjectUnref(caps);
|
||||||
virObjectUnref(cfg);
|
virObjectUnref(cfg);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -1894,6 +1928,7 @@ lxcDomainSetSchedulerParametersFlags(virDomainPtr dom,
|
|||||||
unsigned int flags)
|
unsigned int flags)
|
||||||
{
|
{
|
||||||
virLXCDriverPtr driver = dom->conn->privateData;
|
virLXCDriverPtr driver = dom->conn->privateData;
|
||||||
|
virCapsPtr caps = NULL;
|
||||||
size_t i;
|
size_t i;
|
||||||
virDomainObjPtr vm = NULL;
|
virDomainObjPtr vm = NULL;
|
||||||
virDomainDefPtr vmdef = NULL;
|
virDomainDefPtr vmdef = NULL;
|
||||||
@ -1930,13 +1965,16 @@ lxcDomainSetSchedulerParametersFlags(virDomainPtr dom,
|
|||||||
if (virDomainSetSchedulerParametersFlagsEnsureACL(dom->conn, vm->def, flags) < 0)
|
if (virDomainSetSchedulerParametersFlagsEnsureACL(dom->conn, vm->def, flags) < 0)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
if (virDomainLiveConfigHelperMethod(driver->caps, driver->xmlopt,
|
if (!(caps = virLXCDriverGetCapabilities(driver, false)))
|
||||||
|
goto cleanup;
|
||||||
|
|
||||||
|
if (virDomainLiveConfigHelperMethod(caps, driver->xmlopt,
|
||||||
vm, &flags, &vmdef) < 0)
|
vm, &flags, &vmdef) < 0)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
if (flags & VIR_DOMAIN_AFFECT_CONFIG) {
|
if (flags & VIR_DOMAIN_AFFECT_CONFIG) {
|
||||||
/* Make a copy for updated domain. */
|
/* Make a copy for updated domain. */
|
||||||
vmdef = virDomainObjCopyPersistentDef(vm, driver->caps, driver->xmlopt);
|
vmdef = virDomainObjCopyPersistentDef(vm, caps, driver->xmlopt);
|
||||||
if (!vmdef)
|
if (!vmdef)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
@ -2015,6 +2053,7 @@ cleanup:
|
|||||||
virDomainDefFree(vmdef);
|
virDomainDefFree(vmdef);
|
||||||
if (vm)
|
if (vm)
|
||||||
virObjectUnlock(vm);
|
virObjectUnlock(vm);
|
||||||
|
virObjectUnref(caps);
|
||||||
lxcDriverUnlock(driver);
|
lxcDriverUnlock(driver);
|
||||||
virObjectUnref(cfg);
|
virObjectUnref(cfg);
|
||||||
return ret;
|
return ret;
|
||||||
@ -2035,6 +2074,7 @@ lxcDomainGetSchedulerParametersFlags(virDomainPtr dom,
|
|||||||
unsigned int flags)
|
unsigned int flags)
|
||||||
{
|
{
|
||||||
virLXCDriverPtr driver = dom->conn->privateData;
|
virLXCDriverPtr driver = dom->conn->privateData;
|
||||||
|
virCapsPtr caps = NULL;
|
||||||
virDomainObjPtr vm = NULL;
|
virDomainObjPtr vm = NULL;
|
||||||
virDomainDefPtr persistentDef;
|
virDomainDefPtr persistentDef;
|
||||||
unsigned long long shares = 0;
|
unsigned long long shares = 0;
|
||||||
@ -2070,7 +2110,10 @@ lxcDomainGetSchedulerParametersFlags(virDomainPtr dom,
|
|||||||
cpu_bw_status = !!rc;
|
cpu_bw_status = !!rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (virDomainLiveConfigHelperMethod(driver->caps, driver->xmlopt,
|
if (!(caps = virLXCDriverGetCapabilities(driver, false)))
|
||||||
|
goto cleanup;
|
||||||
|
|
||||||
|
if (virDomainLiveConfigHelperMethod(caps, driver->xmlopt,
|
||||||
vm, &flags, &persistentDef) < 0)
|
vm, &flags, &persistentDef) < 0)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
@ -2133,6 +2176,7 @@ out:
|
|||||||
cleanup:
|
cleanup:
|
||||||
if (vm)
|
if (vm)
|
||||||
virObjectUnlock(vm);
|
virObjectUnlock(vm);
|
||||||
|
virObjectUnref(caps);
|
||||||
lxcDriverUnlock(driver);
|
lxcDriverUnlock(driver);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
@ -2153,6 +2197,7 @@ lxcDomainSetBlkioParameters(virDomainPtr dom,
|
|||||||
unsigned int flags)
|
unsigned int flags)
|
||||||
{
|
{
|
||||||
virLXCDriverPtr driver = dom->conn->privateData;
|
virLXCDriverPtr driver = dom->conn->privateData;
|
||||||
|
virCapsPtr caps = NULL;
|
||||||
size_t i;
|
size_t i;
|
||||||
virDomainObjPtr vm = NULL;
|
virDomainObjPtr vm = NULL;
|
||||||
virDomainDefPtr persistentDef = NULL;
|
virDomainDefPtr persistentDef = NULL;
|
||||||
@ -2184,7 +2229,10 @@ lxcDomainSetBlkioParameters(virDomainPtr dom,
|
|||||||
if (virDomainSetBlkioParametersEnsureACL(dom->conn, vm->def, flags) < 0)
|
if (virDomainSetBlkioParametersEnsureACL(dom->conn, vm->def, flags) < 0)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
if (virDomainLiveConfigHelperMethod(driver->caps, driver->xmlopt,
|
if (!(caps = virLXCDriverGetCapabilities(driver, false)))
|
||||||
|
goto cleanup;
|
||||||
|
|
||||||
|
if (virDomainLiveConfigHelperMethod(caps, driver->xmlopt,
|
||||||
vm, &flags, &persistentDef) < 0)
|
vm, &flags, &persistentDef) < 0)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
@ -2242,6 +2290,7 @@ lxcDomainSetBlkioParameters(virDomainPtr dom,
|
|||||||
cleanup:
|
cleanup:
|
||||||
if (vm)
|
if (vm)
|
||||||
virObjectUnlock(vm);
|
virObjectUnlock(vm);
|
||||||
|
virObjectUnref(caps);
|
||||||
lxcDriverUnlock(driver);
|
lxcDriverUnlock(driver);
|
||||||
virObjectUnref(cfg);
|
virObjectUnref(cfg);
|
||||||
return ret;
|
return ret;
|
||||||
@ -2256,6 +2305,7 @@ lxcDomainGetBlkioParameters(virDomainPtr dom,
|
|||||||
unsigned int flags)
|
unsigned int flags)
|
||||||
{
|
{
|
||||||
virLXCDriverPtr driver = dom->conn->privateData;
|
virLXCDriverPtr driver = dom->conn->privateData;
|
||||||
|
virCapsPtr caps = NULL;
|
||||||
size_t i;
|
size_t i;
|
||||||
virDomainObjPtr vm = NULL;
|
virDomainObjPtr vm = NULL;
|
||||||
virDomainDefPtr persistentDef = NULL;
|
virDomainDefPtr persistentDef = NULL;
|
||||||
@ -2287,7 +2337,10 @@ lxcDomainGetBlkioParameters(virDomainPtr dom,
|
|||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (virDomainLiveConfigHelperMethod(driver->caps, driver->xmlopt,
|
if (!(caps = virLXCDriverGetCapabilities(driver, false)))
|
||||||
|
goto cleanup;
|
||||||
|
|
||||||
|
if (virDomainLiveConfigHelperMethod(caps, driver->xmlopt,
|
||||||
vm, &flags, &persistentDef) < 0)
|
vm, &flags, &persistentDef) < 0)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
@ -2348,6 +2401,7 @@ lxcDomainGetBlkioParameters(virDomainPtr dom,
|
|||||||
cleanup:
|
cleanup:
|
||||||
if (vm)
|
if (vm)
|
||||||
virObjectUnlock(vm);
|
virObjectUnlock(vm);
|
||||||
|
virObjectUnref(caps);
|
||||||
lxcDriverUnlock(driver);
|
lxcDriverUnlock(driver);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
@ -4348,6 +4402,7 @@ static int lxcDomainAttachDeviceFlags(virDomainPtr dom,
|
|||||||
unsigned int flags)
|
unsigned int flags)
|
||||||
{
|
{
|
||||||
virLXCDriverPtr driver = dom->conn->privateData;
|
virLXCDriverPtr driver = dom->conn->privateData;
|
||||||
|
virCapsPtr caps = NULL;
|
||||||
virDomainObjPtr vm = NULL;
|
virDomainObjPtr vm = NULL;
|
||||||
virDomainDefPtr vmdef = NULL;
|
virDomainDefPtr vmdef = NULL;
|
||||||
virDomainDeviceDefPtr dev = NULL, dev_copy = NULL;
|
virDomainDeviceDefPtr dev = NULL, dev_copy = NULL;
|
||||||
@ -4391,6 +4446,9 @@ static int lxcDomainAttachDeviceFlags(virDomainPtr dom,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!(caps = virLXCDriverGetCapabilities(driver, false)))
|
||||||
|
goto cleanup;
|
||||||
|
|
||||||
if ((flags & VIR_DOMAIN_AFFECT_CONFIG) && !vm->persistent) {
|
if ((flags & VIR_DOMAIN_AFFECT_CONFIG) && !vm->persistent) {
|
||||||
virReportError(VIR_ERR_OPERATION_INVALID, "%s",
|
virReportError(VIR_ERR_OPERATION_INVALID, "%s",
|
||||||
_("cannot modify device on transient domain"));
|
_("cannot modify device on transient domain"));
|
||||||
@ -4398,7 +4456,7 @@ static int lxcDomainAttachDeviceFlags(virDomainPtr dom,
|
|||||||
}
|
}
|
||||||
|
|
||||||
dev = dev_copy = virDomainDeviceDefParse(xml, vm->def,
|
dev = dev_copy = virDomainDeviceDefParse(xml, vm->def,
|
||||||
driver->caps, driver->xmlopt,
|
caps, driver->xmlopt,
|
||||||
VIR_DOMAIN_XML_INACTIVE);
|
VIR_DOMAIN_XML_INACTIVE);
|
||||||
if (dev == NULL)
|
if (dev == NULL)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
@ -4410,7 +4468,7 @@ static int lxcDomainAttachDeviceFlags(virDomainPtr dom,
|
|||||||
* to CONFIG takes one instance.
|
* to CONFIG takes one instance.
|
||||||
*/
|
*/
|
||||||
dev_copy = virDomainDeviceDefCopy(dev, vm->def,
|
dev_copy = virDomainDeviceDefCopy(dev, vm->def,
|
||||||
driver->caps, driver->xmlopt);
|
caps, driver->xmlopt);
|
||||||
if (!dev_copy)
|
if (!dev_copy)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
@ -4420,7 +4478,7 @@ static int lxcDomainAttachDeviceFlags(virDomainPtr dom,
|
|||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
/* Make a copy for updated domain. */
|
/* Make a copy for updated domain. */
|
||||||
vmdef = virDomainObjCopyPersistentDef(vm, driver->caps, driver->xmlopt);
|
vmdef = virDomainObjCopyPersistentDef(vm, caps, driver->xmlopt);
|
||||||
if (!vmdef)
|
if (!vmdef)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
if ((ret = lxcDomainAttachDeviceConfig(vmdef, dev)) < 0)
|
if ((ret = lxcDomainAttachDeviceConfig(vmdef, dev)) < 0)
|
||||||
@ -4460,6 +4518,7 @@ cleanup:
|
|||||||
virDomainDeviceDefFree(dev);
|
virDomainDeviceDefFree(dev);
|
||||||
if (vm)
|
if (vm)
|
||||||
virObjectUnlock(vm);
|
virObjectUnlock(vm);
|
||||||
|
virObjectUnref(caps);
|
||||||
lxcDriverUnlock(driver);
|
lxcDriverUnlock(driver);
|
||||||
virObjectUnref(cfg);
|
virObjectUnref(cfg);
|
||||||
return ret;
|
return ret;
|
||||||
@ -4479,6 +4538,7 @@ static int lxcDomainUpdateDeviceFlags(virDomainPtr dom,
|
|||||||
unsigned int flags)
|
unsigned int flags)
|
||||||
{
|
{
|
||||||
virLXCDriverPtr driver = dom->conn->privateData;
|
virLXCDriverPtr driver = dom->conn->privateData;
|
||||||
|
virCapsPtr caps = NULL;
|
||||||
virDomainObjPtr vm = NULL;
|
virDomainObjPtr vm = NULL;
|
||||||
virDomainDefPtr vmdef = NULL;
|
virDomainDefPtr vmdef = NULL;
|
||||||
virDomainDeviceDefPtr dev = NULL, dev_copy = NULL;
|
virDomainDeviceDefPtr dev = NULL, dev_copy = NULL;
|
||||||
@ -4529,8 +4589,11 @@ static int lxcDomainUpdateDeviceFlags(virDomainPtr dom,
|
|||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!(caps = virLXCDriverGetCapabilities(driver, false)))
|
||||||
|
goto cleanup;
|
||||||
|
|
||||||
dev = dev_copy = virDomainDeviceDefParse(xml, vm->def,
|
dev = dev_copy = virDomainDeviceDefParse(xml, vm->def,
|
||||||
driver->caps, driver->xmlopt,
|
caps, driver->xmlopt,
|
||||||
VIR_DOMAIN_XML_INACTIVE);
|
VIR_DOMAIN_XML_INACTIVE);
|
||||||
if (dev == NULL)
|
if (dev == NULL)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
@ -4542,7 +4605,7 @@ static int lxcDomainUpdateDeviceFlags(virDomainPtr dom,
|
|||||||
* to CONFIG takes one instance.
|
* to CONFIG takes one instance.
|
||||||
*/
|
*/
|
||||||
dev_copy = virDomainDeviceDefCopy(dev, vm->def,
|
dev_copy = virDomainDeviceDefCopy(dev, vm->def,
|
||||||
driver->caps, driver->xmlopt);
|
caps, driver->xmlopt);
|
||||||
if (!dev_copy)
|
if (!dev_copy)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
@ -4552,7 +4615,7 @@ static int lxcDomainUpdateDeviceFlags(virDomainPtr dom,
|
|||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
/* Make a copy for updated domain. */
|
/* Make a copy for updated domain. */
|
||||||
vmdef = virDomainObjCopyPersistentDef(vm, driver->caps, driver->xmlopt);
|
vmdef = virDomainObjCopyPersistentDef(vm, caps, driver->xmlopt);
|
||||||
if (!vmdef)
|
if (!vmdef)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
if ((ret = lxcDomainUpdateDeviceConfig(vmdef, dev)) < 0)
|
if ((ret = lxcDomainUpdateDeviceConfig(vmdef, dev)) < 0)
|
||||||
@ -4585,6 +4648,7 @@ cleanup:
|
|||||||
virDomainDeviceDefFree(dev);
|
virDomainDeviceDefFree(dev);
|
||||||
if (vm)
|
if (vm)
|
||||||
virObjectUnlock(vm);
|
virObjectUnlock(vm);
|
||||||
|
virObjectUnref(caps);
|
||||||
lxcDriverUnlock(driver);
|
lxcDriverUnlock(driver);
|
||||||
virObjectUnref(cfg);
|
virObjectUnref(cfg);
|
||||||
return ret;
|
return ret;
|
||||||
@ -4596,6 +4660,7 @@ static int lxcDomainDetachDeviceFlags(virDomainPtr dom,
|
|||||||
unsigned int flags)
|
unsigned int flags)
|
||||||
{
|
{
|
||||||
virLXCDriverPtr driver = dom->conn->privateData;
|
virLXCDriverPtr driver = dom->conn->privateData;
|
||||||
|
virCapsPtr caps = NULL;
|
||||||
virDomainObjPtr vm = NULL;
|
virDomainObjPtr vm = NULL;
|
||||||
virDomainDefPtr vmdef = NULL;
|
virDomainDefPtr vmdef = NULL;
|
||||||
virDomainDeviceDefPtr dev = NULL, dev_copy = NULL;
|
virDomainDeviceDefPtr dev = NULL, dev_copy = NULL;
|
||||||
@ -4645,8 +4710,11 @@ static int lxcDomainDetachDeviceFlags(virDomainPtr dom,
|
|||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!(caps = virLXCDriverGetCapabilities(driver, false)))
|
||||||
|
goto cleanup;
|
||||||
|
|
||||||
dev = dev_copy = virDomainDeviceDefParse(xml, vm->def,
|
dev = dev_copy = virDomainDeviceDefParse(xml, vm->def,
|
||||||
driver->caps, driver->xmlopt,
|
caps, driver->xmlopt,
|
||||||
VIR_DOMAIN_XML_INACTIVE);
|
VIR_DOMAIN_XML_INACTIVE);
|
||||||
if (dev == NULL)
|
if (dev == NULL)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
@ -4658,7 +4726,7 @@ static int lxcDomainDetachDeviceFlags(virDomainPtr dom,
|
|||||||
* to CONFIG takes one instance.
|
* to CONFIG takes one instance.
|
||||||
*/
|
*/
|
||||||
dev_copy = virDomainDeviceDefCopy(dev, vm->def,
|
dev_copy = virDomainDeviceDefCopy(dev, vm->def,
|
||||||
driver->caps, driver->xmlopt);
|
caps, driver->xmlopt);
|
||||||
if (!dev_copy)
|
if (!dev_copy)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
@ -4668,7 +4736,7 @@ static int lxcDomainDetachDeviceFlags(virDomainPtr dom,
|
|||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
/* Make a copy for updated domain. */
|
/* Make a copy for updated domain. */
|
||||||
vmdef = virDomainObjCopyPersistentDef(vm, driver->caps, driver->xmlopt);
|
vmdef = virDomainObjCopyPersistentDef(vm, caps, driver->xmlopt);
|
||||||
if (!vmdef)
|
if (!vmdef)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
@ -4709,6 +4777,7 @@ cleanup:
|
|||||||
virDomainDeviceDefFree(dev);
|
virDomainDeviceDefFree(dev);
|
||||||
if (vm)
|
if (vm)
|
||||||
virObjectUnlock(vm);
|
virObjectUnlock(vm);
|
||||||
|
virObjectUnref(caps);
|
||||||
lxcDriverUnlock(driver);
|
lxcDriverUnlock(driver);
|
||||||
virObjectUnref(cfg);
|
virObjectUnref(cfg);
|
||||||
return ret;
|
return ret;
|
||||||
|
@ -986,6 +986,7 @@ int virLXCProcessStart(virConnectPtr conn,
|
|||||||
char *timestamp;
|
char *timestamp;
|
||||||
virCommandPtr cmd = NULL;
|
virCommandPtr cmd = NULL;
|
||||||
virLXCDomainObjPrivatePtr priv = vm->privateData;
|
virLXCDomainObjPrivatePtr priv = vm->privateData;
|
||||||
|
virCapsPtr caps = NULL;
|
||||||
virErrorPtr err = NULL;
|
virErrorPtr err = NULL;
|
||||||
virLXCDriverConfigPtr cfg = virLXCDriverGetConfig(driver);
|
virLXCDriverConfigPtr cfg = virLXCDriverGetConfig(driver);
|
||||||
|
|
||||||
@ -1027,12 +1028,15 @@ int virLXCProcessStart(virConnectPtr conn,
|
|||||||
cfg->logDir, vm->def->name) < 0)
|
cfg->logDir, vm->def->name) < 0)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
|
if (!(caps = virLXCDriverGetCapabilities(driver, false)))
|
||||||
|
goto cleanup;
|
||||||
|
|
||||||
/* Do this up front, so any part of the startup process can add
|
/* Do this up front, so any part of the startup process can add
|
||||||
* runtime state to vm->def that won't be persisted. This let's us
|
* runtime state to vm->def that won't be persisted. This let's us
|
||||||
* report implicit runtime defaults in the XML, like vnc listen/socket
|
* report implicit runtime defaults in the XML, like vnc listen/socket
|
||||||
*/
|
*/
|
||||||
VIR_DEBUG("Setting current domain def as transient");
|
VIR_DEBUG("Setting current domain def as transient");
|
||||||
if (virDomainObjSetDefTransient(driver->caps, driver->xmlopt, vm, true) < 0)
|
if (virDomainObjSetDefTransient(caps, driver->xmlopt, vm, true) < 0)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
/* Run an early hook to set-up missing devices */
|
/* Run an early hook to set-up missing devices */
|
||||||
@ -1227,7 +1231,7 @@ int virLXCProcessStart(virConnectPtr conn,
|
|||||||
conn, lxcProcessAutoDestroy) < 0)
|
conn, lxcProcessAutoDestroy) < 0)
|
||||||
goto error;
|
goto error;
|
||||||
|
|
||||||
if (virDomainObjSetDefTransient(driver->caps, driver->xmlopt,
|
if (virDomainObjSetDefTransient(caps, driver->xmlopt,
|
||||||
vm, false) < 0)
|
vm, false) < 0)
|
||||||
goto error;
|
goto error;
|
||||||
|
|
||||||
@ -1301,6 +1305,7 @@ cleanup:
|
|||||||
VIR_FORCE_CLOSE(handshakefds[1]);
|
VIR_FORCE_CLOSE(handshakefds[1]);
|
||||||
VIR_FREE(logfile);
|
VIR_FREE(logfile);
|
||||||
virObjectUnref(cfg);
|
virObjectUnref(cfg);
|
||||||
|
virObjectUnref(caps);
|
||||||
|
|
||||||
if (err) {
|
if (err) {
|
||||||
virSetError(err);
|
virSetError(err);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user