[libvirt] [PATCH 08/11] storage: Turn storage backends into dynamic modules

John Ferlan jferlan at redhat.com
Fri Feb 10 13:34:11 UTC 2017



On 02/08/2017 11:27 AM, Peter Krempa wrote:
> If driver modules are enabled turn storage driver backends into
> dynamically loadable objects. This will allow greater modularity for
> binary distributions, where heavyweight dependencies as rbd and gluster
> can be avoided by selecting only a subset of drivers if the rest is not
> necessary.
> 
> The storage modules are installed into 'LIBDIR/libvirt/storage-backend/'
> and users can't override the location by using
> 'LIBVIRT_STORAGE_BACKEND_DIR' environment variable.

can or can't?

> 
> rpm based distros will at this point install all the backends when
> libvirt-daemon-driver-storage package is installed.
> ---
>  libvirt.spec.in               | 17 +++++++++
>  src/Makefile.am               | 85 ++++++++++++++++++++++++++++++++++++++++++-
>  src/storage/storage_backend.c | 60 +++++++++++++++++++++++-------
>  tests/Makefile.am             |  4 +-
>  4 files changed, 151 insertions(+), 15 deletions(-)
> 
> diff --git a/libvirt.spec.in b/libvirt.spec.in
> index e8c272bd7..3098ed2dd 100644
> --- a/libvirt.spec.in
> +++ b/libvirt.spec.in
> @@ -1234,6 +1234,8 @@ rm -f $RPM_BUILD_ROOT%{_libdir}/libvirt/lock-driver/*.la
>  rm -f $RPM_BUILD_ROOT%{_libdir}/libvirt/lock-driver/*.a
>  rm -f $RPM_BUILD_ROOT%{_libdir}/libvirt/connection-driver/*.la
>  rm -f $RPM_BUILD_ROOT%{_libdir}/libvirt/connection-driver/*.a
> +rm -f $RPM_BUILD_ROOT%{_libdir}/libvirt/storage-backend/*.la
> +rm -f $RPM_BUILD_ROOT%{_libdir}/libvirt/storage-backend/*.a
>  %if %{with_wireshark}
>      %if 0%{fedora} >= 24
>  rm -f $RPM_BUILD_ROOT%{_libdir}/wireshark/plugins/libvirt.la
> @@ -1689,6 +1691,21 @@ exit 0
>  %files daemon-driver-storage
>  %attr(0755, root, root) %{_libexecdir}/libvirt_parthelper
>  %{_libdir}/%{name}/connection-driver/libvirt_driver_storage.so
> +%{_libdir}/%{name}/storage-backend/libvirt_storage_backend_fs.so
> +%{_libdir}/%{name}/storage-backend/libvirt_storage_backend_disk.so
> +%{_libdir}/%{name}/storage-backend/libvirt_storage_backend_logical.so
> +%{_libdir}/%{name}/storage-backend/libvirt_storage_backend_scsi.so
> +%{_libdir}/%{name}/storage-backend/libvirt_storage_backend_iscsi.so
> +%{_libdir}/%{name}/storage-backend/libvirt_storage_backend_mpath.so
> +%if %{with_storage_gluster}
> +%{_libdir}/%{name}/storage-backend/libvirt_storage_backend_gluster.so
> +%endif
> +%if %{with_storage_rbd}
> +%{_libdir}/%{name}/storage-backend/libvirt_storage_backend_rbd.so
> +%endif
> +%if %{with_storage_sheepdog}
> +%{_libdir}/%{name}/storage-backend/libvirt_storage_backend_sheepdog.so
> +%endif
> 

What about zfs and vstorage?

The changes seem OK... they build, etc., but this is out of my
wheelhouse. Hopefully someone else can chime in....

A very weak ACK ;-)

John

>  %if %{with_qemu}
>  %files daemon-driver-qemu
> diff --git a/src/Makefile.am b/src/Makefile.am
> index b71209a9d..cdac7a1b5 100644
> --- a/src/Makefile.am
> +++ b/src/Makefile.am
> @@ -970,9 +970,12 @@ SECRET_DRIVER_SOURCES =						\
>  		secret/secret_driver.h secret/secret_driver.c
> 
>  # Storage backend specific impls
> +STORAGE_DRIVER_BACKEND_SOURCES = \
> +		storage/storage_backend.h storage/storage_backend.c
> +
>  STORAGE_DRIVER_SOURCES =						\
>  		storage/storage_driver.h storage/storage_driver.c	\
> -		storage/storage_backend.h storage/storage_backend.c \
> +		$(STORAGE_DRIVER_BACKEND_SOURCES) \
>  		storage/storage_util.h storage/storage_util.c
> 
>  STORAGE_DRIVER_FS_SOURCES =					\
> @@ -1660,6 +1663,12 @@ if WITH_BLKID
>  libvirt_driver_storage_impl_la_CFLAGS += $(BLKID_CFLAGS)
>  libvirt_driver_storage_impl_la_LIBADD += $(BLKID_LIBS)
>  endif WITH_BLKID
> +
> +if WITH_DRIVER_MODULES
> +storagebackenddir = $(libdir)/libvirt/storage-backend
> +storagebackend_LTLIBRARIES =
> +endif WITH_DRIVER_MODULES
> +
>  if WITH_STORAGE
>  noinst_LTLIBRARIES += libvirt_driver_storage_impl.la
>  libvirt_driver_storage_la_SOURCES =
> @@ -1681,8 +1690,14 @@ libvirt_storage_backend_fs_la_CFLAGS =	\
>  	-I$(srcdir)/conf \
>  	$(AM_CFLAGS)
> 
> +if WITH_DRIVER_MODULES
> +storagebackend_LTLIBRARIES += libvirt_storage_backend_fs.la
> +libvirt_storage_backend_fs_la_LDFLAGS = \
> +	-module -avoid-version $(AM_LDFLAGS)
> +else ! WITH_DRIVER_MODULES
>  noinst_LTLIBRARIES += libvirt_storage_backend_fs.la
>  libvirt_driver_storage_impl_la_LIBADD += libvirt_storage_backend_fs.la
> +endif ! WITH_DRIVER_MODULES
>  endif WITH_STORAGE
> 
>  if WITH_STORAGE_LVM
> @@ -1692,9 +1707,15 @@ libvirt_storage_backend_logical_la_CFLAGS = \
>  	-I$(srcdir)/conf \
>  	$(AM_CFLAGS)
> 
> +if WITH_DRIVER_MODULES
> +storagebackend_LTLIBRARIES += libvirt_storage_backend_logical.la
> +libvirt_storage_backend_logical_la_LDFLAGS = \
> +	-module -avoid-version $(AM_LDFLAGS)
> +else ! WITH_DRIVER_MODULES
>  noinst_LTLIBRARIES += libvirt_storage_backend_logical.la
>  libvirt_driver_storage_impl_la_LIBADD += \
>  	libvirt_storage_backend_logical.la
> +endif ! WITH_DRIVER_MODULES
>  endif WITH_STORAGE_LVM
> 
>  if WITH_STORAGE_ISCSI
> @@ -1705,9 +1726,15 @@ libvirt_storage_backend_iscsi_la_CFLAGS = \
>  	-I$(srcdir)/secret \
>  	$(AM_CFLAGS)
> 
> +if WITH_DRIVER_MODULES
> +storagebackend_LTLIBRARIES += libvirt_storage_backend_iscsi.la
> +libvirt_storage_backend_iscsi_la_LDFLAGS = \
> +	-module -avoid-version $(AM_LDFLAGS)
> +else ! WITH_DRIVER_MODULES
>  noinst_LTLIBRARIES += libvirt_storage_backend_iscsi.la
>  libvirt_driver_storage_impl_la_LIBADD += \
>  	libvirt_storage_backend_iscsi.la
> +endif ! WITH_DRIVER_MODULES
>  endif WITH_STORAGE_ISCSI
> 
>  if WITH_STORAGE_SCSI
> @@ -1716,8 +1743,14 @@ libvirt_storage_backend_scsi_la_CFLAGS = \
>  	-I$(srcdir)/conf \
>  	$(AM_CFLAGS)
> 
> +if WITH_DRIVER_MODULES
> +storagebackend_LTLIBRARIES += libvirt_storage_backend_scsi.la
> +libvirt_storage_backend_scsi_la_LDFLAGS = \
> +	-module -avoid-version $(AM_LDFLAGS)
> +else ! WITH_DRIVER_MODULES
>  noinst_LTLIBRARIES += libvirt_storage_backend_scsi.la
>  libvirt_driver_storage_impl_la_LIBADD += libvirt_storage_backend_scsi.la
> +endif ! WITH_DRIVER_MODULES
>  endif WITH_STORAGE_SCSI
> 
>  if WITH_STORAGE_MPATH
> @@ -1729,9 +1762,15 @@ libvirt_storage_backend_mpath_la_CFLAGS =	\
>  	$(DEVMAPPER_CFLAGS) \
>  	$(AM_CFLAGS)
> 
> +if WITH_DRIVER_MODULES
> +storagebackend_LTLIBRARIES += libvirt_storage_backend_mpath.la
> +libvirt_storage_backend_mpath_la_LDFLAGS = \
> +	-module -avoid-version $(AM_LDFLAGS)
> +else ! WITH_DRIVER_MODULES
>  noinst_LTLIBRARIES += libvirt_storage_backend_mpath.la
>  libvirt_driver_storage_impl_la_LIBADD += \
>  	libvirt_storage_backend_mpath.la
> +endif ! WITH_DRIVER_MODULES
>  endif WITH_STORAGE_MPATH
> 
>  if WITH_STORAGE_DISK
> @@ -1740,8 +1779,14 @@ libvirt_storage_backend_disk_la_CFLAGS =	\
>  	-I$(srcdir)/conf \
>  	$(AM_CFLAGS)
> 
> +if WITH_DRIVER_MODULES
> +storagebackend_LTLIBRARIES += libvirt_storage_backend_disk.la
> +libvirt_storage_backend_disk_la_LDFLAGS = \
> +	-module -avoid-version $(AM_LDFLAGS)
> +else ! WITH_DRIVER_MODULES
>  noinst_LTLIBRARIES += libvirt_storage_backend_disk.la
>  libvirt_driver_storage_impl_la_LIBADD += libvirt_storage_backend_disk.la
> +endif ! WITH_DRIVER_MODULES
>  endif WITH_STORAGE_DISK
> 
>  if WITH_STORAGE_RBD
> @@ -1752,8 +1797,14 @@ libvirt_storage_backend_rbd_la_CFLAGS = \
>  	-I$(srcdir)/secret \
>  	$(AM_CFLAGS)
> 
> +if WITH_DRIVER_MODULES
> +storagebackend_LTLIBRARIES += libvirt_storage_backend_rbd.la
> +libvirt_storage_backend_rbd_la_LDFLAGS = \
> +	-module -avoid-version $(AM_LDFLAGS)
> +else ! WITH_DRIVER_MODULES
>  noinst_LTLIBRARIES += libvirt_storage_backend_rbd.la
>  libvirt_driver_storage_impl_la_LIBADD += libvirt_storage_backend_rbd.la
> +endif ! WITH_DRIVER_MODULES
>  endif WITH_STORAGE_RBD
> 
>  if WITH_STORAGE_SHEEPDOG
> @@ -1763,9 +1814,23 @@ libvirt_storage_backend_sheepdog_la_CFLAGS = \
>  	-I$(srcdir)/conf \
>  	$(AM_CFLAGS)
> 
> +libvirt_storage_backend_sheepdog_priv_la_SOURCES = \
> +	$(STORAGE_DRIVER_SHEEPDOG_SOURCES) \
> +	$(STORAGE_DRIVER_BACKEND_SOURCES)
> +libvirt_storage_backend_sheepdog_priv_la_CFLAGS = \
> +	-I$(srcdir)/conf \
> +	$(AM_CFLAGS)
> +noinst_LTLIBRARIES += libvirt_storage_backend_sheepdog_priv.la
> +
> +if WITH_DRIVER_MODULES
> +storagebackend_LTLIBRARIES += libvirt_storage_backend_sheepdog.la
> +libvirt_storage_backend_sheepdog_la_LDFLAGS = \
> +	-module -avoid-version $(AM_LDFLAGS)
> +else ! WITH_DRIVER_MODULES
>  noinst_LTLIBRARIES += libvirt_storage_backend_sheepdog.la
>  libvirt_driver_storage_impl_la_LIBADD += \
>  	libvirt_storage_backend_sheepdog.la
> +endif ! WITH_DRIVER_MODULES
>  endif WITH_STORAGE_SHEEPDOG
> 
>  if WITH_STORAGE_GLUSTER
> @@ -1777,9 +1842,15 @@ libvirt_storage_backend_gluster_la_CFLAGS = \
>  	$(GLUSTERFS_CFLAGS) \
>  	$(AM_CFLAGS)
> 
> +if WITH_DRIVER_MODULES
> +storagebackend_LTLIBRARIES += libvirt_storage_backend_gluster.la
> +libvirt_storage_backend_gluster_la_LDFLAGS = \
> +	-module -avoid-version $(AM_LDFLAGS)
> +else ! WITH_DRIVER_MODULES
>  noinst_LTLIBRARIES += libvirt_storage_backend_gluster.la
>  libvirt_driver_storage_impl_la_LIBADD += \
>  	libvirt_storage_backend_gluster.la
> +endif ! WITH_DRIVER_MODULES
>  endif WITH_STORAGE_GLUSTER
> 
>  if WITH_STORAGE_ZFS
> @@ -1788,8 +1859,14 @@ libvirt_storage_backend_zfs_la_CFLAGS =	\
>  	-I$(srcdir)/conf \
>  	$(AM_CFLAGS)
> 
> +if WITH_DRIVER_MODULES
> +storagebackend_LTLIBRARIES += libvirt_storage_backend_zfs.la
> +libvirt_storage_backend_zfs_la_LDFLAGS = \
> +	-module -avoid-version $(AM_LDFLAGS)
> +else ! WITH_DRIVER_MODULES
>  noinst_LTLIBRARIES += libvirt_storage_backend_zfs.la
>  libvirt_driver_storage_impl_la_LIBADD += libvirt_storage_backend_zfs.la
> +endif ! WITH_DRIVER_MODULES
>  endif WITH_STORAGE_ZFS
> 
>  if WITH_STORAGE_VSTORAGE
> @@ -1799,9 +1876,15 @@ libvirt_storage_backend_vstorage_la_CFLAGS =	\
>  	-I$(srcdir)/conf \
>  	$(AM_CFLAGS)
> 
> +if WITH_DRIVER_MODULES
> +storagebackend_LTLIBRARIES += libvirt_storage_backend_vstorage.la
> +libvirt_storage_backend_vstorage_la_LDFLAGS = \
> +	-module -avoid-version $(AM_LDFLAGS)
> +else ! WITH_DRIVER_MODULES
>  noinst_LTLIBRARIES += libvirt_storage_backend_vstorage.la
>  libvirt_driver_storage_impl_la_LIBADD += \
>  	libvirt_storage_backend_vstorage.la
> +endif ! WITH_DRIVER_MODULES
>  endif WITH_STORAGE_VSTORAGE
> 
>  if WITH_NODE_DEVICES
> diff --git a/src/storage/storage_backend.c b/src/storage/storage_backend.c
> index d8099be36..32f45e841 100644
> --- a/src/storage/storage_backend.c
> +++ b/src/storage/storage_backend.c
> @@ -33,6 +33,8 @@
>  #include "virstoragefile.h"
>  #include "storage_backend.h"
>  #include "virlog.h"
> +#include "virfile.h"
> +#include "configmake.h"
> 
>  #if WITH_STORAGE_LVM
>  # include "storage_backend_logical.h"
> @@ -79,45 +81,77 @@ static size_t virStorageBackendsCount;
>  static virStorageFileBackendPtr virStorageFileBackends[VIR_STORAGE_BACKENDS_MAX];
>  static size_t virStorageFileBackendsCount;
> 
> -#define VIR_STORAGE_BACKEND_REGISTER(name)                                     \
> -    if (name() < 0)                                                            \
> +#if WITH_DRIVER_MODULES
> +
> +# define STORAGE_BACKEND_MODULE_DIR LIBDIR "/libvirt/storage-backend"
> +
> +static int
> +virStorageDriverLoadBackendModule(const char *name,
> +                                  const char *regfunc)
> +{
> +    char *modfile = NULL;
> +    int ret;
> +
> +    if (!(modfile = virFileFindResourceFull(name,
> +                                            "libvirt_storage_backend_",
> +                                            ".so",
> +                                            abs_topbuilddir "/src/.libs",
> +                                            STORAGE_BACKEND_MODULE_DIR,
> +                                            "LIBVIRT_STORAGE_BACKEND_DIR")))
> +        return 1;
> +
> +    ret = virDriverLoadModuleFull(modfile, regfunc, NULL);
> +
> +    VIR_FREE(modfile);
> +
> +    return ret;
> +}
> +
> +
> +# define VIR_STORAGE_BACKEND_REGISTER(func, module)                            \
> +    if (virStorageDriverLoadBackendModule(module, #func) < 0)                  \
> +        return -1
> +#else
> +# define VIR_STORAGE_BACKEND_REGISTER(func, module)                            \
> +    if (func() < 0)                                                            \
>          return -1
> +#endif
> 
>  int
>  virStorageBackendDriversRegister(void)
>  {
>  #if WITH_STORAGE_DIR || WITH_STORAGE_FS
> -    VIR_STORAGE_BACKEND_REGISTER(virStorageBackendFsRegister);
> +    VIR_STORAGE_BACKEND_REGISTER(virStorageBackendFsRegister, "fs");
>  #endif
>  #if WITH_STORAGE_LVM
> -    VIR_STORAGE_BACKEND_REGISTER(virStorageBackendLogicalRegister);
> +    VIR_STORAGE_BACKEND_REGISTER(virStorageBackendLogicalRegister, "logical");
>  #endif
>  #if WITH_STORAGE_ISCSI
> -    VIR_STORAGE_BACKEND_REGISTER(virStorageBackendISCSIRegister);
> +    VIR_STORAGE_BACKEND_REGISTER(virStorageBackendISCSIRegister, "iscsi");
>  #endif
>  #if WITH_STORAGE_SCSI
> -    VIR_STORAGE_BACKEND_REGISTER(virStorageBackendSCSIRegister);
> +    VIR_STORAGE_BACKEND_REGISTER(virStorageBackendSCSIRegister, "scsi");
>  #endif
>  #if WITH_STORAGE_MPATH
> -    VIR_STORAGE_BACKEND_REGISTER(virStorageBackendMpathRegister);
> +    VIR_STORAGE_BACKEND_REGISTER(virStorageBackendMpathRegister, "mpath");
>  #endif
>  #if WITH_STORAGE_DISK
> -    VIR_STORAGE_BACKEND_REGISTER(virStorageBackendDiskRegister);
> +    VIR_STORAGE_BACKEND_REGISTER(virStorageBackendDiskRegister, "disk");
>  #endif
>  #if WITH_STORAGE_RBD
> -    VIR_STORAGE_BACKEND_REGISTER(virStorageBackendRBDRegister);
> +    VIR_STORAGE_BACKEND_REGISTER(virStorageBackendRBDRegister, "rbd");
>  #endif
>  #if WITH_STORAGE_SHEEPDOG
> -    VIR_STORAGE_BACKEND_REGISTER(virStorageBackendSheepdogRegister);
> +    VIR_STORAGE_BACKEND_REGISTER(virStorageBackendSheepdogRegister, "sheepdog");
>  #endif
>  #if WITH_STORAGE_GLUSTER
> -    VIR_STORAGE_BACKEND_REGISTER(virStorageBackendGlusterRegister);
> +    VIR_STORAGE_BACKEND_REGISTER(virStorageBackendGlusterRegister, "gluster");
>  #endif
>  #if WITH_STORAGE_ZFS
> -    VIR_STORAGE_BACKEND_REGISTER(virStorageBackendZFSRegister);
> +    VIR_STORAGE_BACKEND_REGISTER(virStorageBackendZFSRegister, "zfs");
>  #endif
>  #if WITH_STORAGE_VSTORAGE
> -    VIR_STORAGE_BACKEND_REGISTER(virStorageBackendVstorageRegister);
> +    VIR_STORAGE_BACKEND_REGISTER(virStorageBackendVstorageRegister, "vstorage");
>  #endif
> 
>      return 0;
> diff --git a/tests/Makefile.am b/tests/Makefile.am
> index e923178f2..401253da3 100644
> --- a/tests/Makefile.am
> +++ b/tests/Makefile.am
> @@ -804,7 +804,9 @@ storagebackendsheepdogtest_SOURCES = \
>  	storagebackendsheepdogtest.c \
>  	testutils.c testutils.h
>  storagebackendsheepdogtest_LDADD = \
> -	../src/libvirt_driver_storage_impl.la $(LDADDS)
> +	../src/libvirt_driver_storage_impl.la \
> +	../src/libvirt_storage_backend_sheepdog_priv.la \
> +	$(LDADDS)
>  else ! WITH_STORAGE_SHEEPDOG
>  EXTRA_DIST += storagebackendsheepdogtest.c
>  endif ! WITH_STORAGE_SHEEPDOG
> 




More information about the libvir-list mailing list