[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