[libvirt] [PATCH v2] add func to set shared drivers after libvirtd init

Mikhail Feoktistov mfeoktistov at virtuozzo.com
Thu Nov 19 12:22:53 UTC 2015


Diff from v1:
Remove vz prefix from the title of this letter. Because this is the common case
for all drivers in libvirt.

Description:
Built-in drivers in libvirt are initialized before libvirtd initialization.
Libvirt loads shared drivers on libvirtd initialization step.
For built-in drivers we can't set shared drivers, because they are not initialized yet.
This patch adds function to set shared drivers after libvirtd init.
---
 daemon/libvirtd.c        |  4 ++++
 src/libvirt.c            | 41 +++++++++++++++++++++++++++++++++++++++++
 src/libvirt_internal.h   |  1 +
 src/libvirt_private.syms |  1 +
 4 files changed, 47 insertions(+)

diff --git a/daemon/libvirtd.c b/daemon/libvirtd.c
index 250094b..aac1826 100644
--- a/daemon/libvirtd.c
+++ b/daemon/libvirtd.c
@@ -431,6 +431,10 @@ static void daemonInitialize(void)
     bhyveRegister();
 # endif
 #endif
+# ifdef WITH_VZ
+    virAssignSharedDrivers("vz");
+    virAssignSharedDrivers("Parallels");
+# endif
 }
 
 
diff --git a/src/libvirt.c b/src/libvirt.c
index 25a0040..1763be7 100644
--- a/src/libvirt.c
+++ b/src/libvirt.c
@@ -1433,3 +1433,44 @@ virTypedParameterValidateSet(virConnectPtr conn,
     }
     return 0;
 }
+
+/**
+ * virAssignSharedDrivers:
+ * @name: name of connection driver
+ *
+ * This function fills in any empty pointers for shared drivers
+ * in connect driver structure
+ *
+ * Returns 0 in case of success, -1 in case of error
+*/
+int
+virAssignSharedDrivers(const char *name)
+{
+    size_t i;
+
+    if (name == NULL) {
+        virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+                       _("Driver name must be specified"));
+        return -1;
+    }
+
+    for (i = 0; i < virConnectDriverTabCount; i++) {
+        if (STREQ(virConnectDriverTab[i]->hypervisorDriver->name, name)) {
+            if (virConnectDriverTab[i]->interfaceDriver == NULL)
+                virConnectDriverTab[i]->interfaceDriver = virSharedInterfaceDriver;
+            if (virConnectDriverTab[i]->networkDriver == NULL)
+                virConnectDriverTab[i]->networkDriver = virSharedNetworkDriver;
+            if (virConnectDriverTab[i]->nodeDeviceDriver == NULL)
+                virConnectDriverTab[i]->nodeDeviceDriver = virSharedNodeDeviceDriver;
+            if (virConnectDriverTab[i]->nwfilterDriver == NULL)
+                virConnectDriverTab[i]->nwfilterDriver = virSharedNWFilterDriver;
+            if (virConnectDriverTab[i]->secretDriver == NULL)
+                virConnectDriverTab[i]->secretDriver = virSharedSecretDriver;
+            if (virConnectDriverTab[i]->storageDriver == NULL)
+                virConnectDriverTab[i]->storageDriver = virSharedStorageDriver;
+            break;
+       }
+    }
+
+    return 0;
+}
diff --git a/src/libvirt_internal.h b/src/libvirt_internal.h
index 1313b58..2a7227b 100644
--- a/src/libvirt_internal.h
+++ b/src/libvirt_internal.h
@@ -289,4 +289,5 @@ virTypedParameterValidateSet(virConnectPtr conn,
                              virTypedParameterPtr params,
                              int nparams);
 
+int virAssignSharedDrivers(const char *name);
 #endif
diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
index a835f18..a0fcdf5 100644
--- a/src/libvirt_private.syms
+++ b/src/libvirt_private.syms
@@ -943,6 +943,7 @@ virFDStreamSetInternalCloseCb;
 
 
 # libvirt_internal.h
+virAssignSharedDrivers;
 virConnectSupportsFeature;
 virDomainMigrateBegin3;
 virDomainMigrateBegin3Params;
-- 
1.8.3.1




More information about the libvir-list mailing list