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
> 

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list

Reply via email to