Currently drivers can only do a bulk load of config / status files for
their guests. This exposes some helper methods to allow individual
guests to be loaded.
Signed-off-by: Daniel P. Berrange <berrange(a)redhat.com>
---
src/conf/virdomainobjlist.c | 98 ++++++++++++++++++++++++++++++++-------------
src/conf/virdomainobjlist.h | 17 ++++++++
src/libvirt_private.syms | 2 +
3 files changed, 89 insertions(+), 28 deletions(-)
diff --git a/src/conf/virdomainobjlist.c b/src/conf/virdomainobjlist.c
index 87a742b1ea..37f795fe6d 100644
--- a/src/conf/virdomainobjlist.c
+++ b/src/conf/virdomainobjlist.c
@@ -443,16 +443,15 @@ void virDomainObjListRemoveLocked(virDomainObjListPtr doms,
virObjectUnlock(dom);
}
-
static virDomainObjPtr
-virDomainObjListLoadConfig(virDomainObjListPtr doms,
- virCapsPtr caps,
- virDomainXMLOptionPtr xmlopt,
- const char *configDir,
- const char *autostartDir,
- const char *name,
- virDomainLoadConfigNotify notify,
- void *opaque)
+virDomainObjListLoadConfigLocked(virDomainObjListPtr doms,
+ virCapsPtr caps,
+ virDomainXMLOptionPtr xmlopt,
+ const char *configDir,
+ const char *autostartDir,
+ const char *name,
+ virDomainLoadConfigNotify notify,
+ void *opaque)
{
char *configFile = NULL, *autostartLink = NULL;
virDomainDefPtr def = NULL;
@@ -496,14 +495,36 @@ virDomainObjListLoadConfig(virDomainObjListPtr doms,
}
-static virDomainObjPtr
-virDomainObjListLoadStatus(virDomainObjListPtr doms,
- const char *statusDir,
- const char *name,
+virDomainObjPtr
+virDomainObjListLoadConfig(virDomainObjListPtr doms,
virCapsPtr caps,
virDomainXMLOptionPtr xmlopt,
+ const char *configDir,
+ const char *autostartDir,
+ const char *name,
virDomainLoadConfigNotify notify,
void *opaque)
+{
+ virDomainObjPtr vm = NULL;
+ virObjectRWLockWrite(doms);
+
+ vm = virDomainObjListLoadConfigLocked(doms, caps, xmlopt, configDir,
+ autostartDir, name, notify, opaque);
+ virObjectRef(vm);
+
+ virObjectRWUnlock(doms);
+ return vm;
+}
+
+
+static virDomainObjPtr
+virDomainObjListLoadStatusLocked(virDomainObjListPtr doms,
+ const char *statusDir,
+ const char *name,
+ virCapsPtr caps,
+ virDomainXMLOptionPtr xmlopt,
+ virDomainLoadConfigNotify notify,
+ void *opaque)
{
char *statusFile = NULL;
virDomainObjPtr obj = NULL;
@@ -555,6 +576,27 @@ virDomainObjListLoadStatus(virDomainObjListPtr doms,
}
+virDomainObjPtr
+virDomainObjListLoadStatus(virDomainObjListPtr doms,
+ const char *statusDir,
+ const char *name,
+ virCapsPtr caps,
+ virDomainXMLOptionPtr xmlopt,
+ virDomainLoadConfigNotify notify,
+ void *opaque)
+{
+ virDomainObjPtr vm = NULL;
+ virObjectRWLockWrite(doms);
+
+ vm = virDomainObjListLoadStatusLocked(doms, statusDir, name, caps, xmlopt,
+ notify, opaque);
+ virObjectRef(vm);
+
+ virObjectRWUnlock(doms);
+ return vm;
+}
+
+
int
virDomainObjListLoadAllConfigs(virDomainObjListPtr doms,
const char *configDir,
@@ -587,22 +629,22 @@ virDomainObjListLoadAllConfigs(virDomainObjListPtr doms,
kill the whole process */
VIR_INFO("Loading config file '%s.xml'", entry->d_name);
if (liveStatus)
- dom = virDomainObjListLoadStatus(doms,
- configDir,
- entry->d_name,
- caps,
- xmlopt,
- notify,
- opaque);
+ dom = virDomainObjListLoadStatusLocked(doms,
+ configDir,
+ entry->d_name,
+ caps,
+ xmlopt,
+ notify,
+ opaque);
else
- dom = virDomainObjListLoadConfig(doms,
- caps,
- xmlopt,
- configDir,
- autostartDir,
- entry->d_name,
- notify,
- opaque);
+ dom = virDomainObjListLoadConfigLocked(doms,
+ caps,
+ xmlopt,
+ configDir,
+ autostartDir,
+ entry->d_name,
+ notify,
+ opaque);
if (dom) {
if (!liveStatus)
dom->persistent = 1;
diff --git a/src/conf/virdomainobjlist.h b/src/conf/virdomainobjlist.h
index bb186bde30..4aee8fae13 100644
--- a/src/conf/virdomainobjlist.h
+++ b/src/conf/virdomainobjlist.h
@@ -77,6 +77,23 @@ int virDomainObjListLoadAllConfigs(virDomainObjListPtr doms,
virDomainXMLOptionPtr xmlopt,
virDomainLoadConfigNotify notify,
void *opaque);
+virDomainObjPtr
+virDomainObjListLoadConfig(virDomainObjListPtr doms,
+ virCapsPtr caps,
+ virDomainXMLOptionPtr xmlopt,
+ const char *configDir,
+ const char *autostartDir,
+ const char *name,
+ virDomainLoadConfigNotify notify,
+ void *opaque);
+virDomainObjPtr
+virDomainObjListLoadStatus(virDomainObjListPtr doms,
+ const char *statusDir,
+ const char *name,
+ virCapsPtr caps,
+ virDomainXMLOptionPtr xmlopt,
+ virDomainLoadConfigNotify notify,
+ void *opaque);
int virDomainObjListNumOfDomains(virDomainObjListPtr doms,
bool active,
diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
index a0fde65dba..be631e3dd7 100644
--- a/src/libvirt_private.syms
+++ b/src/libvirt_private.syms
@@ -938,6 +938,8 @@ virDomainObjListForEach;
virDomainObjListGetActiveIDs;
virDomainObjListGetInactiveNames;
virDomainObjListLoadAllConfigs;
+virDomainObjListLoadConfig;
+virDomainObjListLoadStatus;
virDomainObjListNew;
virDomainObjListNumOfDomains;
virDomainObjListRemove;
--
2.14.3