]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
Allow for a driver specific private data blob in virDomainObjPtr
authorDaniel P. Berrange <berrange@redhat.com>
Tue, 6 Oct 2009 11:50:58 +0000 (12:50 +0100)
committerDaniel P. Berrange <berrange@redhat.com>
Mon, 2 Nov 2009 16:03:10 +0000 (11:03 -0500)
The virDomainObjPtr object stores state about a running domain.
This object is shared across all drivers so it is not appropriate
to include driver specific state here. This patch adds the ability
to request a blob of private data per domain object instance. The
driver must provide a allocator & deallocator for this purpose

THis patch abuses the virCapabilitiesPtr structure for storing the
allocator/deallocator callbacks, since it is already being abused
for other internal things relating to parsing. This should be moved
out into a separate object at some point.

* src/conf/capabilities.h: Add privateDataAllocFunc and
  privateDataFreeFunc fields
* src/conf/domain_conf.c: Invoke the driver allocators / deallocators
  when creating/freeing virDomainObjPtr instances.
* src/conf/domain_conf.h: Pass virCapsPtr into virDomainAssignDef
  to allow access to the driver specific allocator function
* src/lxc/lxc_driver.c, src/opennebula/one_driver.c,
  src/openvz/openvz_driver.c, src/qemu/qemu_driver.c,
  src/test/test_driver.c, src/uml/uml_driver.c: Update for
  change in virDomainAssignDef contract

src/conf/capabilities.h
src/conf/domain_conf.c
src/conf/domain_conf.h
src/lxc/lxc_driver.c
src/opennebula/one_driver.c
src/openvz/openvz_driver.c
src/qemu/qemu_driver.c
src/test/test_driver.c
src/uml/uml_driver.c

index 2f24605b55f00ba220b58a06662b64d53fdf6dea..7234cf4ae1b496c6964d6faf9adfa1b71b167d43 100644 (file)
@@ -115,6 +115,8 @@ struct _virCaps {
     virCapsGuestPtr *guests;
     unsigned char macPrefix[VIR_MAC_PREFIX_BUFLEN];
     unsigned int emulatorRequired : 1;
+    void *(*privateDataAllocFunc)(void);
+    void (*privateDataFreeFunc)(void *);
 };
 
 
index de07e13e2890f1742cf16848a2c34e06c7c27370..0dd2b3f68f7eea9ec66f7e8aed8ae43531e01fcf 100644 (file)
@@ -594,12 +594,16 @@ void virDomainObjFree(virDomainObjPtr dom)
 
     VIR_FREE(dom->vcpupids);
 
+    if (dom->privateDataFreeFunc)
+        (dom->privateDataFreeFunc)(dom->privateData);
+
     virMutexDestroy(&dom->lock);
 
     VIR_FREE(dom);
 }
 
-static virDomainObjPtr virDomainObjNew(virConnectPtr conn)
+static virDomainObjPtr virDomainObjNew(virConnectPtr conn,
+                                       virCapsPtr caps)
 {
     virDomainObjPtr domain;
 
@@ -608,9 +612,19 @@ static virDomainObjPtr virDomainObjNew(virConnectPtr conn)
         return NULL;
     }
 
+    if (caps->privateDataAllocFunc &&
+        !(domain->privateData = (caps->privateDataAllocFunc)())) {
+        virReportOOMError(conn);
+        VIR_FREE(domain);
+        return NULL;
+    }
+    domain->privateDataFreeFunc = caps->privateDataFreeFunc;
+
     if (virMutexInit(&domain->lock) < 0) {
         virDomainReportError(conn, VIR_ERR_INTERNAL_ERROR,
                              "%s", _("cannot initialize mutex"));
+        if (domain->privateDataFreeFunc)
+            (domain->privateDataFreeFunc)(domain->privateData);
         VIR_FREE(domain);
         return NULL;
     }
@@ -624,6 +638,7 @@ static virDomainObjPtr virDomainObjNew(virConnectPtr conn)
 }
 
 virDomainObjPtr virDomainAssignDef(virConnectPtr conn,
+                                   virCapsPtr caps,
                                    virDomainObjListPtr doms,
                                    const virDomainDefPtr def)
 {
@@ -643,7 +658,7 @@ virDomainObjPtr virDomainAssignDef(virConnectPtr conn,
         return domain;
     }
 
-    if (!(domain = virDomainObjNew(conn)))
+    if (!(domain = virDomainObjNew(conn, caps)))
         return NULL;
     domain->def = def;
 
@@ -3187,7 +3202,7 @@ static virDomainObjPtr virDomainObjParseXML(virConnectPtr conn,
     xmlNodePtr *nodes = NULL;
     int n, i;
 
-    if (!(obj = virDomainObjNew(conn)))
+    if (!(obj = virDomainObjNew(conn, caps)))
         return NULL;
 
     if (!(config = virXPathNode(conn, "./domain", ctxt))) {
@@ -4768,7 +4783,7 @@ virDomainObjPtr virDomainLoadConfig(virConnectPtr conn,
         newVM = 0;
     }
 
-    if (!(dom = virDomainAssignDef(conn, doms, def)))
+    if (!(dom = virDomainAssignDef(conn, caps, doms, def)))
         goto error;
 
     dom->autostart = autostart;
index 389e259c74aa4cbab41db1da60e6493e7d6cef2e..8a8bfb0f3a0bc001296d7c81193096b0f2835ea9 100644 (file)
@@ -636,6 +636,9 @@ struct _virDomainObj {
 
     virDomainDefPtr def; /* The current definition */
     virDomainDefPtr newDef; /* New definition to activate at shutdown */
+
+    void *privateData;
+    void (*privateDataFreeFunc)(void *);
 };
 
 typedef struct _virDomainObjList virDomainObjList;
@@ -678,6 +681,7 @@ void virDomainDefFree(virDomainDefPtr vm);
 void virDomainObjFree(virDomainObjPtr vm);
 
 virDomainObjPtr virDomainAssignDef(virConnectPtr conn,
+                                   virCapsPtr caps,
                                    virDomainObjListPtr doms,
                                    const virDomainDefPtr def);
 void virDomainRemoveInactive(virDomainObjListPtr doms,
index 4f0787b7445b548a204255788e34aeb7326a348c..116f3aef20e61cbd5fd6a628c03ed3f2331d0908 100644 (file)
@@ -315,7 +315,8 @@ static virDomainPtr lxcDomainDefine(virConnectPtr conn, const char *xml)
         goto cleanup;
     }
 
-    if (!(vm = virDomainAssignDef(conn, &driver->domains, def)))
+    if (!(vm = virDomainAssignDef(conn, driver->caps,
+                                  &driver->domains, def)))
         goto cleanup;
     def = NULL;
     vm->persistent = 1;
@@ -1312,7 +1313,8 @@ lxcDomainCreateAndStart(virConnectPtr conn,
     }
 
 
-    if (!(vm = virDomainAssignDef(conn, &driver->domains, def)))
+    if (!(vm = virDomainAssignDef(conn, driver->caps,
+                                  &driver->domains, def)))
         goto cleanup;
     def = NULL;
 
index 0b807ad8a46f941f28fdfa4d80268faa8de7c265..beb48ceca2579e14edf95f94e82c5def9e151f42 100644 (file)
@@ -235,7 +235,8 @@ static virDomainPtr oneDomainDefine(virConnectPtr conn, const char *xml)
                                         VIR_DOMAIN_XML_INACTIVE)))
         goto return_point;
 
-    if (!(vm = virDomainAssignDef(conn, &driver->domains, def))) {
+    if (!(vm = virDomainAssignDef(conn, driver->caps,
+                                  &driver->domains, def))) {
         virDomainDefFree(def);
         goto return_point;
     }
@@ -439,7 +440,8 @@ oneDomainCreateAndStart(virConnectPtr conn,
         goto return_point;
     }
 
-    if (!(vm = virDomainAssignDef(conn, &driver->domains, def))) {
+    if (!(vm = virDomainAssignDef(conn, driver->caps,
+                                  &driver->domains, def))) {
         virDomainDefFree(def);
         goto return_point;
     }
index b0092cda71cfcadb33a1591a363dce3d42ece722..d33423572c617180ad786a6da75b2b63bb4cebe2 100644 (file)
@@ -774,7 +774,8 @@ openvzDomainDefineXML(virConnectPtr conn, const char *xml)
                   vmdef->name);
         goto cleanup;
     }
-    if (!(vm = virDomainAssignDef(conn, &driver->domains, vmdef)))
+    if (!(vm = virDomainAssignDef(conn, driver->caps,
+                                  &driver->domains, vmdef)))
         goto cleanup;
     vmdef = NULL;
 
@@ -841,7 +842,8 @@ openvzDomainCreateXML(virConnectPtr conn, const char *xml,
                   vmdef->name);
         goto cleanup;
     }
-    if (!(vm = virDomainAssignDef(conn, &driver->domains, vmdef)))
+    if (!(vm = virDomainAssignDef(conn, driver->caps,
+                                  &driver->domains, vmdef)))
         goto cleanup;
     vmdef = NULL;
 
index a91c60fbd723509ee6a6c2bad741548f0feb787e..ddce2baae4221a8f9047b5ce58b5af568bf684bf 100644 (file)
@@ -2697,6 +2697,7 @@ static virDomainPtr qemudDomainCreate(virConnectPtr conn, const char *xml,
     }
 
     if (!(vm = virDomainAssignDef(conn,
+                                  driver->caps,
                                   &driver->domains,
                                   def)))
         goto cleanup;
@@ -3757,6 +3758,7 @@ static int qemudDomainRestore(virConnectPtr conn,
     }
 
     if (!(vm = virDomainAssignDef(conn,
+                                  driver->caps,
                                   &driver->domains,
                                   def))) {
         qemudReportError(conn, NULL, NULL, VIR_ERR_OPERATION_FAILED,
@@ -4243,6 +4245,7 @@ static virDomainPtr qemudDomainDefine(virConnectPtr conn, const char *xml) {
         goto cleanup;
 
     if (!(vm = virDomainAssignDef(conn,
+                                  driver->caps,
                                   &driver->domains,
                                   def))) {
         goto cleanup;
@@ -6101,6 +6104,7 @@ qemudDomainMigratePrepareTunnel(virConnectPtr dconn,
     }
 
     if (!(vm = virDomainAssignDef(dconn,
+                                  driver->caps,
                                   &driver->domains,
                                   def))) {
         qemudReportError(dconn, NULL, NULL, VIR_ERR_OPERATION_FAILED,
@@ -6339,6 +6343,7 @@ qemudDomainMigratePrepare2 (virConnectPtr dconn,
     }
 
     if (!(vm = virDomainAssignDef(dconn,
+                                  driver->caps,
                                   &driver->domains,
                                   def))) {
         qemudReportError (dconn, NULL, NULL, VIR_ERR_OPERATION_FAILED,
index 40c95ade05adc5789b251a83c2b8bc3a352f41e8..f9919e9019c41d09762df16f4663fdb91cbe423b 100644 (file)
@@ -387,7 +387,8 @@ static int testOpenDefault(virConnectPtr conn) {
         goto error;
     if (testDomainGenerateIfnames(conn, domdef) < 0)
         goto error;
-    if (!(domobj = virDomainAssignDef(conn, &privconn->domains, domdef)))
+    if (!(domobj = virDomainAssignDef(conn, privconn->caps,
+                                      &privconn->domains, domdef)))
         goto error;
     domdef = NULL;
     domobj->def->id = privconn->nextDomID++;
@@ -739,7 +740,8 @@ static int testOpenFromFile(virConnectPtr conn,
         }
 
         if (testDomainGenerateIfnames(conn, def) < 0 ||
-            !(dom = virDomainAssignDef(conn, &privconn->domains, def))) {
+            !(dom = virDomainAssignDef(conn, privconn->caps,
+                                       &privconn->domains, def))) {
             virDomainDefFree(def);
             goto error;
         }
@@ -1091,7 +1093,8 @@ testDomainCreateXML(virConnectPtr conn, const char *xml,
 
     if (testDomainGenerateIfnames(conn, def) < 0)
         goto cleanup;
-    if (!(dom = virDomainAssignDef(conn, &privconn->domains, def)))
+    if (!(dom = virDomainAssignDef(conn, privconn->caps,
+                                   &privconn->domains, def)))
         goto cleanup;
     def = NULL;
     dom->state = VIR_DOMAIN_RUNNING;
@@ -1639,7 +1642,8 @@ static int testDomainRestore(virConnectPtr conn,
 
     if (testDomainGenerateIfnames(conn, def) < 0)
         goto cleanup;
-    if (!(dom = virDomainAssignDef(conn, &privconn->domains, def)))
+    if (!(dom = virDomainAssignDef(conn, privconn->caps,
+                                   &privconn->domains, def)))
         goto cleanup;
     def = NULL;
 
@@ -1913,7 +1917,8 @@ static virDomainPtr testDomainDefineXML(virConnectPtr conn,
 
     if (testDomainGenerateIfnames(conn, def) < 0)
         goto cleanup;
-    if (!(dom = virDomainAssignDef(conn, &privconn->domains, def)))
+    if (!(dom = virDomainAssignDef(conn, privconn->caps,
+                                   &privconn->domains, def)))
         goto cleanup;
     def = NULL;
     dom->persistent = 1;
index 80cf477483db1d41376ecc3fb05b011a2447013f..4fb04d9e18a1fc30d290b85776ceb9db7e31cd03 100644 (file)
@@ -1212,6 +1212,7 @@ static virDomainPtr umlDomainCreate(virConnectPtr conn, const char *xml,
     }
 
     if (!(vm = virDomainAssignDef(conn,
+                                  driver->caps,
                                   &driver->domains,
                                   def)))
         goto cleanup;
@@ -1546,6 +1547,7 @@ static virDomainPtr umlDomainDefine(virConnectPtr conn, const char *xml) {
         goto cleanup;
 
     if (!(vm = virDomainAssignDef(conn,
+                                  driver->caps,
                                   &driver->domains,
                                   def)))
         goto cleanup;