]> xenbits.xensource.com Git - libvirt.git/commitdiff
vbox: Register per partes
authorMichal Privoznik <mprivozn@redhat.com>
Fri, 22 Aug 2014 09:37:52 +0000 (11:37 +0200)
committerMartin Kletzander <mkletzan@redhat.com>
Wed, 27 Aug 2014 06:05:25 +0000 (08:05 +0200)
Since times when vbox moved to the daemon (due to some licensing
issue) the subdrivers that vbox implements were registered, but not
opened since our generic subdrivers took priority. I've tried to fix
this in 65b7d553f39ff9 but it was not correct. Apparently moving
vbox driver registration upfront changes the default connection URI
which makes some users sad. So, this commit breaks vbox into pieces
and register vbox's network and storage drivers first, and vbox driver
then at the end. This way, the vbox driver is registered in the order
it always was, but its subdrivers are registered prior the generic
ones.

Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
Signed-off-by: Martin Kletzander <mkletzan@redhat.com>
daemon/libvirtd.c
libvirt.spec.in
src/Makefile.am
src/vbox/vbox_driver.c
src/vbox/vbox_driver.h

index 87af9038f95c6bd039b7b6ab91488879f7625c62..0503cd025da01c42e6293bf8f28e274c10c93535 100644 (file)
@@ -383,7 +383,7 @@ static void daemonInitialize(void)
      * is not loaded they'll get a suitable error at that point
      */
 # ifdef WITH_VBOX
-    virDriverLoadModule("vbox");
+    virDriverLoadModule("vbox_network");
 # endif
 # ifdef WITH_NETWORK
     virDriverLoadModule("network");
@@ -391,6 +391,9 @@ static void daemonInitialize(void)
 # ifdef WITH_INTERFACE
     virDriverLoadModule("interface");
 # endif
+# ifdef WITH_VBOX
+    virDriverLoadModule("vbox_storage");
+# endif
 # ifdef WITH_STORAGE
     virDriverLoadModule("storage");
 # endif
@@ -418,12 +421,15 @@ static void daemonInitialize(void)
 # ifdef WITH_UML
     virDriverLoadModule("uml");
 # endif
+# ifdef WITH_VBOX
+    virDriverLoadModule("vbox");
+# endif
 # ifdef WITH_BHYVE
     virDriverLoadModule("bhyve");
 # endif
 #else
 # ifdef WITH_VBOX
-    vboxRegister();
+    vboxNetworkRegister();
 # endif
 # ifdef WITH_NETWORK
     networkRegister();
@@ -431,6 +437,9 @@ static void daemonInitialize(void)
 # ifdef WITH_INTERFACE
     interfaceRegister();
 # endif
+# ifdef WITH_VBOX
+    vboxStorageRegister();
+# endif
 # ifdef WITH_STORAGE
     storageRegister();
 # endif
@@ -458,6 +467,9 @@ static void daemonInitialize(void)
 # ifdef WITH_UML
     umlRegister();
 # endif
+# ifdef WITH_VBOX
+    vboxRegister();
+# endif
 # ifdef WITH_BHYVE
     bhyveRegister();
 # endif
index 9126277bc657bc955a16b8ca7432fb5ac9d1c0fd..b7a26a1e741b9288542a5ab85e87fc37999203d8 100644 (file)
@@ -2094,6 +2094,8 @@ exit 0
 %files daemon-driver-vbox
 %defattr(-, root, root)
 %{_libdir}/%{name}/connection-driver/libvirt_driver_vbox.so
+%{_libdir}/%{name}/connection-driver/libvirt_driver_vbox_network.so
+%{_libdir}/%{name}/connection-driver/libvirt_driver_vbox_storage.so
         %endif
     %endif # %{with_driver_modules}
 
index 538530e31a5b01c49f64c66c0e99c480877e9fdd..46e411e1fd3af16318ba61701381ac3389c59c7b 100644 (file)
@@ -1135,13 +1135,27 @@ libvirt_driver_vmware_la_SOURCES = $(VMWARE_DRIVER_SOURCES)
 endif WITH_VMWARE
 
 if WITH_VBOX
-noinst_LTLIBRARIES += libvirt_driver_vbox_impl.la
+noinst_LTLIBRARIES += \
+               libvirt_driver_vbox_impl.la     \
+               libvirt_driver_vbox_network_impl.la     \
+               libvirt_driver_vbox_storage_impl.la
 libvirt_driver_vbox_la_SOURCES =
 libvirt_driver_vbox_la_LIBADD = libvirt_driver_vbox_impl.la
+libvirt_driver_vbox_network_la_SOURCES =
+libvirt_driver_vbox_network_la_LIBADD = libvirt_driver_vbox_network_impl.la
+libvirt_driver_vbox_storage_la_SOURCES =
+libvirt_driver_vbox_storage_la_LIBADD = libvirt_driver_vbox_storage_impl.la
 if WITH_DRIVER_MODULES
-mod_LTLIBRARIES += libvirt_driver_vbox.la
+mod_LTLIBRARIES += \
+               libvirt_driver_vbox.la  \
+               libvirt_driver_vbox_network.la  \
+               libvirt_driver_vbox_storage.la
 libvirt_driver_vbox_la_LIBADD += ../gnulib/lib/libgnu.la
 libvirt_driver_vbox_la_LDFLAGS = -module -avoid-version $(AM_LDFLAGS)
+libvirt_driver_vbox_network_la_LIBADD += ../gnulib/lib/libgnu.la
+libvirt_driver_vbox_network_la_LDFLAGS = -module -avoid-version $(AM_LDFLAGS)
+libvirt_driver_vbox_storage_la_LIBADD += ../gnulib/lib/libgnu.la
+libvirt_driver_vbox_storage_la_LDFLAGS = -module -avoid-version $(AM_LDFLAGS)
 else ! WITH_DRIVER_MODULES
 noinst_LTLIBRARIES += libvirt_driver_vbox.la
 # GPLv2-only license requries that it be linked into
@@ -1151,12 +1165,33 @@ endif ! WITH_DRIVER_MODULES
 
 libvirt_driver_vbox_impl_la_CFLAGS =                           \
                -I$(top_srcdir)/src/conf                        \
-               $(AM_CFLAGS)
+               $(AM_CFLAGS)    \
+               -DVBOX_DRIVER
 libvirt_driver_vbox_impl_la_LDFLAGS = $(AM_LDFLAGS)
 libvirt_driver_vbox_impl_la_LIBADD =  $(DLOPEN_LIBS)           \
                $(MSCOM_LIBS)                                   \
                $(LIBXML_LIBS)
 libvirt_driver_vbox_impl_la_SOURCES = $(VBOX_DRIVER_SOURCES)
+
+libvirt_driver_vbox_network_impl_la_CFLAGS =   \
+               -I$(top_srcdir)/src/conf        \
+               $(AM_CFLAGS)    \
+               -DVBOX_NETWORK_DRIVER
+libvirt_driver_vbox_network_impl_la_LDFLAGS = $(AM_LDFLAGS)
+libvirt_driver_vbox_network_impl_la_LIBADD = $(DLOPEN_LIBS)            \
+               $(MSCOM_LIBS)                                   \
+               $(LIBXML_LIBS)
+libvirt_driver_vbox_network_impl_la_SOURCES = $(VBOX_DRIVER_SOURCES)
+
+libvirt_driver_vbox_storage_impl_la_CFLAGS =   \
+               -I$(top_srcdir)/src/conf        \
+               $(AM_CFLAGS)    \
+               -DVBOX_STORAGE_DRIVER
+libvirt_driver_vbox_storage_impl_la_LDFLAGS = $(AM_LDFLAGS)
+libvirt_driver_vbox_storage_impl_la_LIBADD = $(DLOPEN_LIBS)            \
+               $(MSCOM_LIBS)                                   \
+               $(LIBXML_LIBS)
+libvirt_driver_vbox_storage_impl_la_SOURCES = $(VBOX_DRIVER_SOURCES)
 endif WITH_VBOX
 
 if WITH_XENAPI
index 498be71530c1f40ac9d54cec0cd2730b8df76eb8..d33f78f2b8030226c88301c93736b7268782d201 100644 (file)
@@ -75,12 +75,15 @@ static virDriver vboxDriverDummy;
 
 #define VIR_FROM_THIS VIR_FROM_VBOX
 
-int vboxRegister(void)
+static void
+vboxGetDrivers(virDriverPtr *driver_ret,
+               virNetworkDriverPtr *networkDriver_ret,
+               virStorageDriverPtr *storageDriver_ret)
 {
-    virDriverPtr        driver;
+    virDriverPtr driver;
     virNetworkDriverPtr networkDriver;
     virStorageDriverPtr storageDriver;
-    uint32_t            uVersion;
+    uint32_t uVersion;
 
     /*
      * If the glue layer does not initialize, we register a driver
@@ -157,15 +160,52 @@ int vboxRegister(void)
         VIR_DEBUG("VBoxCGlueInit failed, using dummy driver");
     }
 
-    if (virRegisterDriver(driver) < 0)
-        return -1;
+    if (driver_ret)
+        *driver_ret = driver;
+    if (networkDriver_ret)
+        *networkDriver_ret = networkDriver;
+    if (storageDriver_ret)
+        *storageDriver_ret = storageDriver;
+}
+
+
+#if !defined(WITH_DRIVER_MODULES) || defined(VBOX_NETWORK_DRIVER)
+int vboxNetworkRegister(void)
+{
+    virNetworkDriverPtr networkDriver;
+
+    vboxGetDrivers(NULL, &networkDriver, NULL);
     if (virRegisterNetworkDriver(networkDriver) < 0)
         return -1;
+    return 0;
+}
+#endif
+
+#if !defined(WITH_DRIVER_MODULES) || defined(VBOX_STORAGE_DRIVER)
+int vboxStorageRegister(void)
+{
+    virStorageDriverPtr storageDriver;
+
+    vboxGetDrivers(NULL, NULL, &storageDriver);
+
     if (virRegisterStorageDriver(storageDriver) < 0)
         return -1;
+    return 0;
+}
+#endif
 
+#if !defined(WITH_DRIVER_MODULES) || defined(VBOX_DRIVER)
+int vboxRegister(void)
+{
+    virDriverPtr driver;
+
+    vboxGetDrivers(&driver, NULL, NULL);
+
+    if (virRegisterDriver(driver) < 0)
+        return -1;
     return 0;
 }
+#endif
 
 static virDrvOpenStatus dummyConnectOpen(virConnectPtr conn,
                                          virConnectAuthPtr auth ATTRIBUTE_UNUSED,
index 399e4c67f46ccc46d635ab8ac9cae10eaac431ee..ccd331a410b05ccd6104f433c819623e528a4987 100644 (file)
 
 # include "internal.h"
 
+# if !defined(WITH_DRIVER_MODULES) || defined(VBOX_NETWORK_DRIVER)
+int vboxNetworkRegister(void);
+# endif
+
+# if !defined(WITH_DRIVER_MODULES) || defined(VBOX_STORAGE_DRIVER)
+int vboxStorageRegister(void);
+# endif
+
+# if !defined(WITH_DRIVER_MODULES) || defined(VBOX_DRIVER)
 int vboxRegister(void);
+# endif
 
 #endif