---
src/Makefile.am | 1 +
src/lxc/lxc_conf.c | 8 ++++++++
src/lxc/lxc_conf.h | 2 ++
src/lxc/lxc_controller.c | 7 ++++++-
src/lxc/lxc_domain.c | 13 ++++++-------
src/lxc/lxc_domain.h | 2 +-
src/lxc/lxc_driver.c | 43 ++++++++++++++++++++++++-------------------
src/lxc/lxc_process.c | 9 +++++----
8 files changed, 53 insertions(+), 32 deletions(-)
diff --git a/src/Makefile.am b/src/Makefile.am
index c1659a4..60935f4 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -493,6 +493,7 @@ LXC_CONTROLLER_SOURCES = \
lxc/lxc_conf.c lxc/lxc_conf.h \
lxc/lxc_container.c lxc/lxc_container.h \
lxc/lxc_cgroup.c lxc/lxc_cgroup.h \
+ lxc/lxc_domain.c lxc/lxc_domain.h \
lxc/lxc_fuse.c lxc/lxc_fuse.h \
lxc/lxc_controller.c
diff --git a/src/lxc/lxc_conf.c b/src/lxc/lxc_conf.c
index 7b808e7..c723e77 100644
--- a/src/lxc/lxc_conf.c
+++ b/src/lxc/lxc_conf.c
@@ -27,6 +27,7 @@
#include <config.h>
#include "lxc_conf.h"
+#include "lxc_domain.h"
#include "nodeinfo.h"
#include "virerror.h"
#include "virconf.h"
@@ -154,6 +155,13 @@ error:
return NULL;
}
+
+virDomainXMLConfPtr
+lxcDomainXMLConfInit(void)
+{
+ return virDomainXMLConfNew(&virLXCDriverPrivateDataCallbacks, NULL);
+}
+
int lxcLoadDriverConfig(virLXCDriverPtr driver)
{
char *filename;
diff --git a/src/lxc/lxc_conf.h b/src/lxc/lxc_conf.h
index 2649cd6..b46dc32 100644
--- a/src/lxc/lxc_conf.h
+++ b/src/lxc/lxc_conf.h
@@ -51,6 +51,7 @@ struct _virLXCDriver {
virMutex lock;
virCapsPtr caps;
+ virDomainXMLConfPtr xmlconf;
virCgroupPtr cgroup;
@@ -83,6 +84,7 @@ struct _virLXCDriver {
int lxcLoadDriverConfig(virLXCDriverPtr driver);
virCapsPtr lxcCapsInit(virLXCDriverPtr driver);
+virDomainXMLConfPtr lxcDomainXMLConfInit(void);
static inline void lxcDriverLock(virLXCDriverPtr driver)
{
diff --git a/src/lxc/lxc_controller.c b/src/lxc/lxc_controller.c
index ce46070..50967f3 100644
--- a/src/lxc/lxc_controller.c
+++ b/src/lxc/lxc_controller.c
@@ -151,6 +151,7 @@ static virLXCControllerPtr virLXCControllerNew(const char *name)
{
virLXCControllerPtr ctrl = NULL;
virCapsPtr caps = NULL;
+ virDomainXMLConfPtr xmlconf = NULL;
char *configFile = NULL;
if (VIR_ALLOC(ctrl) < 0)
@@ -165,11 +166,14 @@ static virLXCControllerPtr virLXCControllerNew(const char *name)
if ((caps = lxcCapsInit(NULL)) == NULL)
goto error;
+ if (!(xmlconf = lxcDomainXMLConfInit()))
+ goto error;
+
if ((configFile = virDomainConfigFile(LXC_STATE_DIR,
ctrl->name)) == NULL)
goto error;
- if ((ctrl->def = virDomainDefParseFile(caps,
+ if ((ctrl->def = virDomainDefParseFile(caps, xmlconf,
configFile,
1 << VIR_DOMAIN_VIRT_LXC,
0)) == NULL)
@@ -183,6 +187,7 @@ static virLXCControllerPtr virLXCControllerNew(const char *name)
cleanup:
VIR_FREE(configFile);
virObjectUnref(caps);
+ virObjectUnref(xmlconf);
return ctrl;
no_memory:
diff --git a/src/lxc/lxc_domain.c b/src/lxc/lxc_domain.c
index 1b02aa5..08cf8f6 100644
--- a/src/lxc/lxc_domain.c
+++ b/src/lxc/lxc_domain.c
@@ -73,10 +73,9 @@ static int virLXCDomainObjPrivateXMLParse(xmlXPathContextPtr ctxt, void
*data)
return 0;
}
-void virLXCDomainSetPrivateDataHooks(virCapsPtr caps)
-{
- caps->privateDataAllocFunc = virLXCDomainObjPrivateAlloc;
- caps->privateDataFreeFunc = virLXCDomainObjPrivateFree;
- caps->privateDataXMLFormat = virLXCDomainObjPrivateXMLFormat;
- caps->privateDataXMLParse = virLXCDomainObjPrivateXMLParse;
-}
+virDomainXMLPrivateDataCallbacks virLXCDriverPrivateDataCallbacks = {
+ .alloc = virLXCDomainObjPrivateAlloc,
+ .free = virLXCDomainObjPrivateFree,
+ .format = virLXCDomainObjPrivateXMLFormat,
+ .parse = virLXCDomainObjPrivateXMLParse,
+};
diff --git a/src/lxc/lxc_domain.h b/src/lxc/lxc_domain.h
index 882f34a..007ea84 100644
--- a/src/lxc/lxc_domain.h
+++ b/src/lxc/lxc_domain.h
@@ -38,6 +38,6 @@ struct _virLXCDomainObjPrivate {
pid_t initpid;
};
-void virLXCDomainSetPrivateDataHooks(virCapsPtr caps);
+extern virDomainXMLPrivateDataCallbacks virLXCDriverPrivateDataCallbacks;
#endif /* __LXC_DOMAIN_H__ */
diff --git a/src/lxc/lxc_driver.c b/src/lxc/lxc_driver.c
index f136df2..59bb786 100644
--- a/src/lxc/lxc_driver.c
+++ b/src/lxc/lxc_driver.c
@@ -413,7 +413,7 @@ static virDomainPtr lxcDomainDefine(virConnectPtr conn, const char
*xml)
virDomainDefPtr oldDef = NULL;
lxcDriverLock(driver);
- if (!(def = virDomainDefParseString(driver->caps, xml,
+ if (!(def = virDomainDefParseString(driver->caps, driver->xmlconf, xml,
1 << VIR_DOMAIN_VIRT_LXC,
VIR_DOMAIN_XML_INACTIVE)))
goto cleanup;
@@ -428,7 +428,7 @@ static virDomainPtr lxcDomainDefine(virConnectPtr conn, const char
*xml)
}
if (!(vm = virDomainObjListAdd(driver->domains,
- driver->caps,
+ driver->xmlconf,
def,
0,
&oldDef)))
@@ -1069,7 +1069,7 @@ lxcDomainCreateAndStart(virConnectPtr conn,
virCheckFlags(VIR_DOMAIN_START_AUTODESTROY, NULL);
lxcDriverLock(driver);
- if (!(def = virDomainDefParseString(driver->caps, xml,
+ if (!(def = virDomainDefParseString(driver->caps, driver->xmlconf, xml,
1 << VIR_DOMAIN_VIRT_LXC,
VIR_DOMAIN_XML_INACTIVE)))
goto cleanup;
@@ -1085,7 +1085,7 @@ lxcDomainCreateAndStart(virConnectPtr conn,
if (!(vm = virDomainObjListAdd(driver->domains,
- driver->caps,
+ driver->xmlconf,
def,
VIR_DOMAIN_OBJ_LIST_ADD_CHECK_LIVE,
NULL)))
@@ -1472,7 +1472,8 @@ static int lxcStartup(bool privileged,
if ((lxc_driver->caps = lxcCapsInit(lxc_driver)) == NULL)
goto cleanup;
- virLXCDomainSetPrivateDataHooks(lxc_driver->caps);
+ if (!(lxc_driver->xmlconf = lxcDomainXMLConfInit()))
+ goto cleanup;
if (virLXCProcessAutoDestroyInit(lxc_driver) < 0)
goto cleanup;
@@ -1480,6 +1481,7 @@ static int lxcStartup(bool privileged,
/* Get all the running persistent or transient configs first */
if (virDomainObjListLoadAllConfigs(lxc_driver->domains,
lxc_driver->caps,
+ lxc_driver->xmlconf,
lxc_driver->stateDir,
NULL,
1, 1 << VIR_DOMAIN_VIRT_LXC,
@@ -1491,6 +1493,7 @@ static int lxcStartup(bool privileged,
/* Then inactive persistent configs */
if (virDomainObjListLoadAllConfigs(lxc_driver->domains,
lxc_driver->caps,
+ lxc_driver->xmlconf,
lxc_driver->configDir,
lxc_driver->autostartDir,
0, 1 << VIR_DOMAIN_VIRT_LXC,
@@ -1538,6 +1541,7 @@ lxcReload(void) {
lxcDriverLock(lxc_driver);
virDomainObjListLoadAllConfigs(lxc_driver->domains,
lxc_driver->caps,
+ lxc_driver->xmlconf,
lxc_driver->configDir,
lxc_driver->autostartDir,
0, 1 << VIR_DOMAIN_VIRT_LXC,
@@ -1561,6 +1565,7 @@ static int lxcShutdown(void)
virObjectUnref(lxc_driver->caps);
virObjectUnref(lxc_driver->securityManager);
+ virObjectUnref(lxc_driver->xmlconf);
VIR_FREE(lxc_driver->configDir);
VIR_FREE(lxc_driver->autostartDir);
VIR_FREE(lxc_driver->stateDir);
@@ -1782,13 +1787,13 @@ lxcSetSchedulerParametersFlags(virDomainPtr dom,
goto cleanup;
}
- if (virDomainLiveConfigHelperMethod(driver->caps, vm, &flags,
- &vmdef) < 0)
+ if (virDomainLiveConfigHelperMethod(driver->caps, driver->xmlconf,
+ vm, &flags, &vmdef) < 0)
goto cleanup;
if (flags & VIR_DOMAIN_AFFECT_CONFIG) {
/* Make a copy for updated domain. */
- vmdef = virDomainObjCopyPersistentDef(driver->caps, vm);
+ vmdef = virDomainObjCopyPersistentDef(driver->caps, driver->xmlconf, vm);
if (!vmdef)
goto cleanup;
}
@@ -1854,7 +1859,7 @@ lxcSetSchedulerParametersFlags(virDomainPtr dom,
}
}
- if (virDomainSaveStatus(driver->caps, driver->stateDir, vm) < 0)
+ if (virDomainSaveStatus(driver->xmlconf, driver->stateDir, vm) < 0)
goto cleanup;
@@ -1924,8 +1929,8 @@ lxcGetSchedulerParametersFlags(virDomainPtr dom,
goto cleanup;
}
- if (virDomainLiveConfigHelperMethod(driver->caps, vm, &flags,
- &persistentDef) < 0)
+ if (virDomainLiveConfigHelperMethod(driver->caps, driver->xmlconf,
+ vm, &flags, &persistentDef) < 0)
goto cleanup;
if (flags & VIR_DOMAIN_AFFECT_CONFIG) {
@@ -2037,8 +2042,8 @@ lxcDomainSetBlkioParameters(virDomainPtr dom,
goto cleanup;
}
- if (virDomainLiveConfigHelperMethod(driver->caps, vm, &flags,
- &persistentDef) < 0)
+ if (virDomainLiveConfigHelperMethod(driver->caps, driver->xmlconf,
+ vm, &flags, &persistentDef) < 0)
goto cleanup;
if (flags & VIR_DOMAIN_AFFECT_LIVE) {
@@ -2142,8 +2147,8 @@ lxcDomainGetBlkioParameters(virDomainPtr dom,
goto cleanup;
}
- if (virDomainLiveConfigHelperMethod(driver->caps, vm, &flags,
- &persistentDef) < 0)
+ if (virDomainLiveConfigHelperMethod(driver->caps, driver->xmlconf,
+ vm, &flags, &persistentDef) < 0)
goto cleanup;
if (flags & VIR_DOMAIN_AFFECT_LIVE) {
@@ -2508,7 +2513,7 @@ static int lxcDomainSuspend(virDomainPtr dom)
VIR_DOMAIN_EVENT_SUSPENDED_PAUSED);
}
- if (virDomainSaveStatus(driver->caps, driver->stateDir, vm) < 0)
+ if (virDomainSaveStatus(driver->xmlconf, driver->stateDir, vm) < 0)
goto cleanup;
ret = 0;
@@ -2574,7 +2579,7 @@ static int lxcDomainResume(virDomainPtr dom)
VIR_DOMAIN_EVENT_RESUMED_UNPAUSED);
}
- if (virDomainSaveStatus(driver->caps, driver->stateDir, vm) < 0)
+ if (virDomainSaveStatus(driver->xmlconf, driver->stateDir, vm) < 0)
goto cleanup;
ret = 0;
@@ -4353,7 +4358,7 @@ lxcDomainModifyDeviceFlags(virDomainPtr dom, const char *xml,
goto cleanup;
/* Make a copy for updated domain. */
- vmdef = virDomainObjCopyPersistentDef(driver->caps, vm);
+ vmdef = virDomainObjCopyPersistentDef(driver->caps, driver->xmlconf, vm);
if (!vmdef)
goto cleanup;
switch (action) {
@@ -4401,7 +4406,7 @@ lxcDomainModifyDeviceFlags(virDomainPtr dom, const char *xml,
* changed even if we failed to attach the device. For example,
* a new controller may be created.
*/
- if (virDomainSaveStatus(driver->caps, driver->stateDir, vm) < 0) {
+ if (virDomainSaveStatus(driver->xmlconf, driver->stateDir, vm) < 0) {
ret = -1;
goto cleanup;
}
diff --git a/src/lxc/lxc_process.c b/src/lxc/lxc_process.c
index d96c69c..cad6402 100644
--- a/src/lxc/lxc_process.c
+++ b/src/lxc/lxc_process.c
@@ -682,7 +682,7 @@ static void virLXCProcessMonitorInitNotify(virLXCMonitorPtr mon
ATTRIBUTE_UNUSED
}
virDomainAuditInit(vm, initpid, inode);
- if (virDomainSaveStatus(lxc_driver->caps, lxc_driver->stateDir, vm) < 0)
+ if (virDomainSaveStatus(lxc_driver->xmlconf, lxc_driver->stateDir, vm) < 0)
VIR_WARN("Cannot update XML with PID for LXC %s",
vm->def->name);
}
@@ -1043,7 +1043,7 @@ int virLXCProcessStart(virConnectPtr conn,
* report implicit runtime defaults in the XML, like vnc listen/socket
*/
VIR_DEBUG("Setting current domain def as transient");
- if (virDomainObjSetDefTransient(driver->caps, vm, true) < 0)
+ if (virDomainObjSetDefTransient(driver->caps, driver->xmlconf, vm, true) <
0)
goto cleanup;
/* Run an early hook to set-up missing devices */
@@ -1241,7 +1241,8 @@ int virLXCProcessStart(virConnectPtr conn,
virLXCProcessAutoDestroyAdd(driver, vm, conn) < 0)
goto error;
- if (virDomainObjSetDefTransient(driver->caps, vm, false) < 0)
+ if (virDomainObjSetDefTransient(driver->caps, driver->xmlconf,
+ vm, false) < 0)
goto error;
/* Write domain status to disk.
@@ -1250,7 +1251,7 @@ int virLXCProcessStart(virConnectPtr conn,
* location for the benefit of libvirt_lxc. We're now overwriting
* it with the live status XML instead. This is a (currently
* harmless) inconsistency we should fix one day */
- if (virDomainSaveStatus(driver->caps, driver->stateDir, vm) < 0)
+ if (virDomainSaveStatus(driver->xmlconf, driver->stateDir, vm) < 0)
goto error;
/* finally we can call the 'started' hook script if any */
--
1.8.1.5