[libvirt] [PATCH 06/11] storage: backend: Refactor registration of the backend drivers

John Ferlan jferlan at redhat.com
Fri Feb 10 13:19:33 UTC 2017



On 02/08/2017 11:27 AM, Peter Krempa wrote:
> Add APIs that allow to dynamically register driver backends so that the
> list of available drivers does not need to be known during compile time.
> 
> This will allow us to modularize the storage driver on runtime.
> ---
>  src/storage/storage_backend.c          | 111 ++++++++++++++++++++++-----------
>  src/storage/storage_backend.h          |   5 ++
>  src/storage/storage_backend_disk.c     |   7 +++
>  src/storage/storage_backend_disk.h     |   4 +-
>  src/storage/storage_backend_fs.c       |  27 ++++++++
>  src/storage/storage_backend_fs.h       |  11 +---
>  src/storage/storage_backend_gluster.c  |  13 +++-
>  src/storage/storage_backend_gluster.h  |   5 +-
>  src/storage/storage_backend_iscsi.c    |   7 +++
>  src/storage/storage_backend_iscsi.h    |   4 +-
>  src/storage/storage_backend_logical.c  |   7 +++
>  src/storage/storage_backend_logical.h  |   4 +-
>  src/storage/storage_backend_mpath.c    |   8 +++
>  src/storage/storage_backend_mpath.h    |   4 +-
>  src/storage/storage_backend_rbd.c      |   7 +++
>  src/storage/storage_backend_rbd.h      |   4 +-
>  src/storage/storage_backend_scsi.c     |   7 +++
>  src/storage/storage_backend_scsi.h     |   4 +-
>  src/storage/storage_backend_sheepdog.c |   7 +++
>  src/storage/storage_backend_sheepdog.h |   4 +-
>  src/storage/storage_backend_vstorage.c |   7 +++
>  src/storage/storage_backend_vstorage.h |   4 +-
>  src/storage/storage_backend_zfs.c      |   7 +++
>  src/storage/storage_backend_zfs.h      |   4 +-
>  src/storage/storage_driver.c           |   2 +
>  tests/virstoragetest.c                 |   4 ++
>  26 files changed, 200 insertions(+), 78 deletions(-)
> 

[1] The one difference I note with these patches is that
virStorageFileBackendDir *is* included for the virStorageFileBackends;
whereas, prior to this patch it was not included in fileBackends.

It's not a problem per se, but just wanted to make sure it was
intentional...

ACK for what's here though

John
> diff --git a/src/storage/storage_backend.c b/src/storage/storage_backend.c
> index 500d7567d..d8099be36 100644
> --- a/src/storage/storage_backend.c
> +++ b/src/storage/storage_backend.c
> @@ -72,67 +72,106 @@
> 
>  VIR_LOG_INIT("storage.storage_backend");
> 
> -static virStorageBackendPtr backends[] = {
> -#if WITH_STORAGE_DIR
> -    &virStorageBackendDirectory,
> -#endif
> -#if WITH_STORAGE_FS
> -    &virStorageBackendFileSystem,
> -    &virStorageBackendNetFileSystem,
> +#define VIR_STORAGE_BACKENDS_MAX 20
> +
> +static virStorageBackendPtr virStorageBackends[VIR_STORAGE_BACKENDS_MAX];
> +static size_t virStorageBackendsCount;
> +static virStorageFileBackendPtr virStorageFileBackends[VIR_STORAGE_BACKENDS_MAX];
> +static size_t virStorageFileBackendsCount;
> +
> +#define VIR_STORAGE_BACKEND_REGISTER(name)                                     \
> +    if (name() < 0)                                                            \
> +        return -1
> +
> +int
> +virStorageBackendDriversRegister(void)
> +{
> +#if WITH_STORAGE_DIR || WITH_STORAGE_FS
> +    VIR_STORAGE_BACKEND_REGISTER(virStorageBackendFsRegister);
>  #endif
>  #if WITH_STORAGE_LVM
> -    &virStorageBackendLogical,
> +    VIR_STORAGE_BACKEND_REGISTER(virStorageBackendLogicalRegister);
>  #endif
>  #if WITH_STORAGE_ISCSI
> -    &virStorageBackendISCSI,
> +    VIR_STORAGE_BACKEND_REGISTER(virStorageBackendISCSIRegister);
>  #endif
>  #if WITH_STORAGE_SCSI
> -    &virStorageBackendSCSI,
> +    VIR_STORAGE_BACKEND_REGISTER(virStorageBackendSCSIRegister);
>  #endif
>  #if WITH_STORAGE_MPATH
> -    &virStorageBackendMpath,
> +    VIR_STORAGE_BACKEND_REGISTER(virStorageBackendMpathRegister);
>  #endif
>  #if WITH_STORAGE_DISK
> -    &virStorageBackendDisk,
> +    VIR_STORAGE_BACKEND_REGISTER(virStorageBackendDiskRegister);
>  #endif
>  #if WITH_STORAGE_RBD
> -    &virStorageBackendRBD,
> +    VIR_STORAGE_BACKEND_REGISTER(virStorageBackendRBDRegister);
>  #endif
>  #if WITH_STORAGE_SHEEPDOG
> -    &virStorageBackendSheepdog,
> +    VIR_STORAGE_BACKEND_REGISTER(virStorageBackendSheepdogRegister);
>  #endif
>  #if WITH_STORAGE_GLUSTER
> -    &virStorageBackendGluster,
> +    VIR_STORAGE_BACKEND_REGISTER(virStorageBackendGlusterRegister);
>  #endif
>  #if WITH_STORAGE_ZFS
> -    &virStorageBackendZFS,
> +    VIR_STORAGE_BACKEND_REGISTER(virStorageBackendZFSRegister);
>  #endif
>  #if WITH_STORAGE_VSTORAGE
> -    &virStorageBackendVstorage,
> +    VIR_STORAGE_BACKEND_REGISTER(virStorageBackendVstorageRegister);
>  #endif
> -    NULL
> -};
> 
> +    return 0;
> +}
> +#undef VIR_STORAGE_BACKEND_REGISTER
> 
> -static virStorageFileBackendPtr fileBackends[] = {
> -#if WITH_STORAGE_FS
> -    &virStorageFileBackendFile,
> -    &virStorageFileBackendBlock,
> -#endif
> -#if WITH_STORAGE_GLUSTER
> -    &virStorageFileBackendGluster,
> -#endif
> -    NULL
> -};

[1] the virStorageFileBackendDir is not in this list...

> +
> +int
> +virStorageBackendRegister(virStorageBackendPtr backend)
> +{
> +    VIR_DEBUG("Registering storage backend '%s'",
> +              virStorageTypeToString(backend->type));
> +
> +    if (virStorageBackendsCount >= VIR_STORAGE_BACKENDS_MAX) {
> +        virReportError(VIR_ERR_INTERNAL_ERROR,
> +                       _("Too many drivers, cannot register storage backend '%s'"),
> +                       virStorageTypeToString(backend->type));
> +        return -1;
> +    }
> +
> +    virStorageBackends[virStorageBackendsCount] = backend;
> +    virStorageBackendsCount++;
> +    return 0;
> +}
> +
> +
> +int
> +virStorageBackendFileRegister(virStorageFileBackendPtr backend)
> +{
> +    VIR_DEBUG("Registering storage file backend '%s' protocol '%s'",
> +              virStorageTypeToString(backend->type),
> +              virStorageNetProtocolTypeToString(backend->protocol));
> +
> +    if (virStorageFileBackendsCount >= VIR_STORAGE_BACKENDS_MAX) {
> +        virReportError(VIR_ERR_INTERNAL_ERROR,
> +                       _("Too many drivers, cannot register storage file "
> +                         "backend '%s'"),
> +                       virStorageTypeToString(backend->type));
> +        return -1;
> +    }
> +
> +    virStorageFileBackends[virStorageFileBackendsCount] = backend;
> +    virStorageFileBackendsCount++;
> +    return 0;
> +}
> 

[...]

> diff --git a/src/storage/storage_backend_fs.c b/src/storage/storage_backend_fs.c
> index 54bcc5777..551fd945d 100644
> --- a/src/storage/storage_backend_fs.c
> +++ b/src/storage/storage_backend_fs.c
> @@ -877,3 +877,30 @@ virStorageFileBackend virStorageFileBackendDir = {
> 
>      .storageFileGetUniqueIdentifier = virStorageFileBackendFileGetUniqueIdentifier,
>  };
> +
> +
> +int
> +virStorageBackendFsRegister(void)
> +{
> +    if (virStorageBackendRegister(&virStorageBackendDirectory) < 0)
> +        return -1;
> +
> +#if WITH_STORAGE_FS
> +    if (virStorageBackendRegister(&virStorageBackendFileSystem) < 0)
> +        return -1;
> +
> +    if (virStorageBackendRegister(&virStorageBackendNetFileSystem) < 0)
> +        return -1;
> +#endif /* WITH_STORAGE_FS */
> +
> +    if (virStorageBackendFileRegister(&virStorageFileBackendFile) < 0)
> +        return -1;
> +
> +    if (virStorageBackendFileRegister(&virStorageFileBackendBlock) < 0)
> +        return -1;
> +
> +    if (virStorageBackendFileRegister(&virStorageFileBackendDir) < 0)
> +        return -1;

[1] now will be added in the file backend table.

> +
> +    return 0;
> +}

[...]




More information about the libvir-list mailing list