]> xenbits.xensource.com Git - libvirt.git/commitdiff
storage: backend: Refactor registration of the backend drivers
authorPeter Krempa <pkrempa@redhat.com>
Fri, 13 Jan 2017 15:50:11 +0000 (16:50 +0100)
committerPeter Krempa <pkrempa@redhat.com>
Tue, 21 Feb 2017 08:34:30 +0000 (09:34 +0100)
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.

26 files changed:
src/storage/storage_backend.c
src/storage/storage_backend.h
src/storage/storage_backend_disk.c
src/storage/storage_backend_disk.h
src/storage/storage_backend_fs.c
src/storage/storage_backend_fs.h
src/storage/storage_backend_gluster.c
src/storage/storage_backend_gluster.h
src/storage/storage_backend_iscsi.c
src/storage/storage_backend_iscsi.h
src/storage/storage_backend_logical.c
src/storage/storage_backend_logical.h
src/storage/storage_backend_mpath.c
src/storage/storage_backend_mpath.h
src/storage/storage_backend_rbd.c
src/storage/storage_backend_rbd.h
src/storage/storage_backend_scsi.c
src/storage/storage_backend_scsi.h
src/storage/storage_backend_sheepdog.c
src/storage/storage_backend_sheepdog.h
src/storage/storage_backend_vstorage.c
src/storage/storage_backend_vstorage.h
src/storage/storage_backend_zfs.c
src/storage/storage_backend_zfs.h
src/storage/storage_driver.c
tests/virstoragetest.c

index 500d7567dd1631dd5a1dff47a752a8f7801c89c6..d8099be3689e5250000eaf3ca1364da379d4174d 100644 (file)
 
 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
-};
+
+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;
+}
 
 
 virStorageBackendPtr
 virStorageBackendForType(int type)
 {
     size_t i;
-    for (i = 0; backends[i]; i++)
-        if (backends[i]->type == type)
-            return backends[i];
+    for (i = 0; i < virStorageBackendsCount; i++)
+        if (virStorageBackends[i]->type == type)
+            return virStorageBackends[i];
 
     virReportError(VIR_ERR_INTERNAL_ERROR,
                    _("missing backend for pool type %d (%s)"),
@@ -148,13 +187,13 @@ virStorageFileBackendForTypeInternal(int type,
 {
     size_t i;
 
-    for (i = 0; fileBackends[i]; i++) {
-        if (fileBackends[i]->type == type) {
+    for (i = 0; i < virStorageFileBackendsCount; i++) {
+        if (virStorageFileBackends[i]->type == type) {
             if (type == VIR_STORAGE_TYPE_NETWORK &&
-                fileBackends[i]->protocol != protocol)
+                virStorageFileBackends[i]->protocol != protocol)
                 continue;
 
-            return fileBackends[i];
+            return virStorageFileBackends[i];
         }
     }
 
index b8fb368bb73888cd729c93509a4db5114c20c36f..ca6c19c4579e72f4b2a2a117d6ac3926f3d6f84c 100644 (file)
@@ -198,4 +198,9 @@ struct _virStorageFileBackend {
     virStorageFileBackendChown  storageFileChown;
 };
 
+int virStorageBackendDriversRegister(void);
+
+int virStorageBackendRegister(virStorageBackendPtr backend);
+int virStorageBackendFileRegister(virStorageFileBackendPtr backend);
+
 #endif /* __VIR_STORAGE_BACKEND_H__ */
index 819f1e5c4e5ef971940a966c32e1c9592749bb33..50bdd3646e7e9e47c6d2580cc5ce445cbbef1469 100644 (file)
@@ -937,3 +937,10 @@ virStorageBackend virStorageBackendDisk = {
     .downloadVol = virStorageBackendVolDownloadLocal,
     .wipeVol = virStorageBackendDiskVolWipe,
 };
+
+
+int
+virStorageBackendDiskRegister(void)
+{
+    return virStorageBackendRegister(&virStorageBackendDisk);
+}
index aaabe62244856df1fad06d761b8b8dfac4c46793..e614ca278f3722fe3491ccb21d6c1eb6324a2f9f 100644 (file)
@@ -24,8 +24,6 @@
 #ifndef __VIR_STORAGE_BACKEND_DISK_H__
 # define __VIR_STORAGE_BACKEND_DISK_H__
 
-# include "storage_backend.h"
-
-extern virStorageBackend virStorageBackendDisk;
+int virStorageBackendDiskRegister(void);
 
 #endif /* __VIR_STORAGE_BACKEND_DISK_H__ */
index 71f605b52e539863d83306bd963b278d7fe4e0f0..1fc127a8c1a303514f5b55a34dadaa60156d0901 100644 (file)
@@ -884,3 +884,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;
+
+    return 0;
+}
index 94fe11138c0b3549dc294729bbf9336dceaa99f9..8f381352c23f2c1ee2c9d9e9b1ef01f70b4c3ca3 100644 (file)
 #ifndef __VIR_STORAGE_BACKEND_FS_H__
 # define __VIR_STORAGE_BACKEND_FS_H__
 
-# include "storage_backend.h"
+int virStorageBackendFsRegister(void);
 
-# if WITH_STORAGE_FS
-extern virStorageBackend virStorageBackendFileSystem;
-extern virStorageBackend virStorageBackendNetFileSystem;
-# endif
-
-extern virStorageBackend virStorageBackendDirectory;
-
-extern virStorageFileBackend virStorageFileBackendFile;
-extern virStorageFileBackend virStorageFileBackendBlock;
 #endif /* __VIR_STORAGE_BACKEND_FS_H__ */
index 7be2d9e81769c77ea15517b0b2e2af819e7fedc3..52c9ee372529883e36959699489ed55a586a99de 100644 (file)
@@ -843,6 +843,17 @@ virStorageFileBackend virStorageFileBackendGluster = {
     .storageFileChown = virStorageFileBackendGlusterChown,
 
     .storageFileGetUniqueIdentifier = virStorageFileBackendGlusterGetUniqueIdentifier,
+};
 
 
-};
+int
+virStorageBackendGlusterRegister(void)
+{
+    if (virStorageBackendRegister(&virStorageBackendGluster) < 0)
+        return -1;
+
+    if (virStorageBackendFileRegister(&virStorageFileBackendGluster) < 0)
+        return -1;
+
+    return 0;
+}
index 679601624ce3ea62dd256201077a58d3743f06f9..91b8d8275d7249a62895f33d04284e66caa729d3 100644 (file)
@@ -22,9 +22,6 @@
 #ifndef __VIR_STORAGE_BACKEND_GLUSTER_H__
 # define __VIR_STORAGE_BACKEND_GLUSTER_H__
 
-# include "storage_backend.h"
-
-extern virStorageBackend virStorageBackendGluster;
-extern virStorageFileBackend virStorageFileBackendGluster;
+int virStorageBackendGlusterRegister(void);
 
 #endif /* __VIR_STORAGE_BACKEND_GLUSTER_H__ */
index 281334124b74e349733e59a59fa7eeff11b7d5f1..866fa74154a729727689dcf96174efc0d9c8f129 100644 (file)
@@ -437,3 +437,10 @@ virStorageBackend virStorageBackendISCSI = {
     .downloadVol = virStorageBackendVolDownloadLocal,
     .wipeVol = virStorageBackendVolWipeLocal,
 };
+
+
+int
+virStorageBackendISCSIRegister(void)
+{
+    return virStorageBackendRegister(&virStorageBackendISCSI);
+}
index da3b22c449be8f38870d9e58778bf463b71d3a6e..98d2b3ef275fd7cb566e68d6a472d77408df1859 100644 (file)
@@ -24,8 +24,6 @@
 #ifndef __VIR_STORAGE_BACKEND_ISCSI_H__
 # define __VIR_STORAGE_BACKEND_ISCSI_H__
 
-# include "storage_backend.h"
-
-extern virStorageBackend virStorageBackendISCSI;
+int virStorageBackendISCSIRegister(void);
 
 #endif /* __VIR_STORAGE_BACKEND_ISCSI_H__ */
index b0191aa45d67ad8a9110f8f4d8bc2ebb20693c64..756c62e908f580ae19a81d02b994663c2991948b 100644 (file)
@@ -1112,3 +1112,10 @@ virStorageBackend virStorageBackendLogical = {
     .downloadVol = virStorageBackendVolDownloadLocal,
     .wipeVol = virStorageBackendLogicalVolWipe,
 };
+
+
+int
+virStorageBackendLogicalRegister(void)
+{
+    return virStorageBackendRegister(&virStorageBackendLogical);
+}
index c646fd6a6fd04de6a2807dc6bd9a96cd6b96d9e2..c0f62cd1850a8477322aa809e2071f7981c145cb 100644 (file)
@@ -24,8 +24,6 @@
 #ifndef __VIR_STORAGE_BACKEND_LOGICAL_H__
 # define __VIR_STORAGE_BACKEND_LOGICAL_H__
 
-# include "storage_backend.h"
-
-extern virStorageBackend virStorageBackendLogical;
+int virStorageBackendLogicalRegister(void);
 
 #endif /* __VIR_STORAGE_BACKEND_LOGICAL_H__ */
index a5d692a07c59987ee9673e98d96e6422438b459f..4bb38bb528165717fefedfa91e92433753e494b2 100644 (file)
@@ -32,6 +32,7 @@
 #include "virerror.h"
 #include "storage_conf.h"
 #include "storage_backend.h"
+#include "storage_backend_mpath.h"
 #include "viralloc.h"
 #include "virlog.h"
 #include "virfile.h"
@@ -278,3 +279,10 @@ virStorageBackend virStorageBackendMpath = {
     .downloadVol = virStorageBackendVolDownloadLocal,
     .wipeVol = virStorageBackendVolWipeLocal,
 };
+
+
+int
+virStorageBackendMpathRegister(void)
+{
+    return virStorageBackendRegister(&virStorageBackendMpath);
+}
index b66664576fb96d093f1c01e321e9e26491e965b6..c14dcc3cf7392fcf2097ef5e9cf67864c60fefcc 100644 (file)
@@ -24,8 +24,6 @@
 #ifndef __VIR_STORAGE_BACKEND_MPATH_H__
 # define __VIR_STORAGE_BACKEND_MPATH_H__
 
-# include "storage_backend.h"
-
-extern virStorageBackend virStorageBackendMpath;
+int virStorageBackendMpathRegister(void);
 
 #endif /* __VIR_STORAGE_BACKEND_MPATH_H__ */
index 45beb107aa2a5c85b7d65b8687c2b65751871595..c806d6d3047481b7908f2297d2e29f379ca46ac7 100644 (file)
@@ -1294,3 +1294,10 @@ virStorageBackend virStorageBackendRBD = {
     .resizeVol = virStorageBackendRBDResizeVol,
     .wipeVol = virStorageBackendRBDVolWipe
 };
+
+
+int
+virStorageBackendRBDRegister(void)
+{
+    return virStorageBackendRegister(&virStorageBackendRBD);
+}
index e60caa957b20f6ee4cad15a91dfb062f1d7b1b31..21a43fd51d1a0cc347a237ed9b23de264f6ea5a1 100644 (file)
@@ -23,8 +23,6 @@
 #ifndef __VIR_STORAGE_BACKEND_RBD_H__
 # define __VIR_STORAGE_BACKEND_RBD_H__
 
-# include "storage_backend.h"
-
-extern virStorageBackend virStorageBackendRBD;
+int virStorageBackendRBDRegister(void);
 
 #endif /* __VIR_STORAGE_BACKEND_RBD_H__ */
index cd05741f922e6b94f7cf929b5e99174ca13da896..642e795999a195d864ac25b276a16198745bbb70 100644 (file)
@@ -544,3 +544,10 @@ virStorageBackend virStorageBackendSCSI = {
     .downloadVol = virStorageBackendVolDownloadLocal,
     .wipeVol = virStorageBackendVolWipeLocal,
 };
+
+
+int
+virStorageBackendSCSIRegister(void)
+{
+    return virStorageBackendRegister(&virStorageBackendSCSI);
+}
index 1ba53a57c92671063a2662a14caa65baa76f3b15..efd01658b60043dd6aea5e7c0d0fec9993eb2914 100644 (file)
@@ -24,8 +24,6 @@
 #ifndef __VIR_STORAGE_BACKEND_SCSI_H__
 # define __VIR_STORAGE_BACKEND_SCSI_H__
 
-# include "storage_backend.h"
-
-extern virStorageBackend virStorageBackendSCSI;
+int virStorageBackendSCSIRegister(void);
 
 #endif /* __VIR_STORAGE_BACKEND_SCSI_H__ */
index 36458a562cc5c1cf9b717fc2fc59bccc594f4b3b..a9a2301e63630298ba1f515c67ce363362e88421 100644 (file)
@@ -417,3 +417,10 @@ virStorageBackend virStorageBackendSheepdog = {
     .deleteVol = virStorageBackendSheepdogDeleteVol,
     .resizeVol = virStorageBackendSheepdogResizeVol,
 };
+
+
+int
+virStorageBackendSheepdogRegister(void)
+{
+    return virStorageBackendRegister(&virStorageBackendSheepdog);
+}
index df2ead5ed4d2d009f830db60601a4ca70c241379..e968323098f4f327c36a098004b97ac4542e1747 100644 (file)
@@ -27,8 +27,6 @@
 #ifndef __VIR_STORAGE_BACKEND_SHEEPDOG_H__
 # define __VIR_STORAGE_BACKEND_SHEEPDOG_H__
 
-# include "storage_backend.h"
-
-extern virStorageBackend virStorageBackendSheepdog;
+int virStorageBackendSheepdogRegister(void);
 
 #endif /* __VIR_STORAGE_BACKEND_SHEEPDOG_H__ */
index ac1fa756c7f732bba49fcdb55c4b632a32cec5ea..fb06138538b8d4263e213ca9a181f3933d3e888b 100644 (file)
@@ -183,3 +183,10 @@ virStorageBackend virStorageBackendVstorage = {
     .downloadVol = virStorageBackendVolDownloadLocal,
     .wipeVol = virStorageBackendVolWipeLocal,
 };
+
+
+int
+virStorageBackendVstorageRegister(void)
+{
+    return virStorageBackendRegister(&virStorageBackendVstorage);
+}
index 262e454c01647dd21af275c86caf93cee249be38..0a29c597fdc39ba2dd083030307c9c7f32474bcc 100644 (file)
@@ -21,8 +21,6 @@
 #ifndef __VIR_STORAGE_BACKEND_VSTORAGE_H__
 # define __VIR_STORAGE_BACKEND_VSTORAGE_H__
 
-# include "storage_backend.h"
-
-extern virStorageBackend virStorageBackendVstorage;
+int virStorageBackendVstorageRegister(void);
 
 #endif /* __VIR_STORAGE_BACKEND_VSTORAGE_H__ */
index 70c533a7fe060c684291e53804bb776ee260efa4..004d95a5385b508cd3ef979844c37994dbbe4828 100644 (file)
@@ -467,3 +467,10 @@ virStorageBackend virStorageBackendZFS = {
     .uploadVol = virStorageBackendVolUploadLocal,
     .downloadVol = virStorageBackendVolDownloadLocal,
 };
+
+
+int
+virStorageBackendZFSRegister(void)
+{
+    return virStorageBackendRegister(&virStorageBackendZFS);
+}
index 4c34b59099b8af2efb3d81d0e11e08a68a1e5503..076ff27998e61ee72f056e236273f19fce27f225 100644 (file)
@@ -22,8 +22,6 @@
 #ifndef __VIR_STORAGE_BACKEND_ZFS_H__
 # define __VIR_STORAGE_BACKEND_ZFS_H__
 
-# include "storage_backend.h"
-
-extern virStorageBackend virStorageBackendZFS;
+int virStorageBackendZFSRegister(void);
 
 #endif /* __VIR_STORAGE_BACKEND_ZFS_H__ */
index ed4772ad9700cea82a11c1d7f48ecb7d6ec4a2aa..7fafbcf7585ed411c6a7eab25dd956f13043bc93 100644 (file)
@@ -2840,6 +2840,8 @@ static virStateDriver stateDriver = {
 
 int storageRegister(void)
 {
+    if (virStorageBackendDriversRegister() < 0)
+        return -1;
     if (virSetSharedStorageDriver(&storageDriver) < 0)
         return -1;
     if (virRegisterStateDriver(&stateDriver) < 0)
index f766df11533b92828d6aacf0b8e92e876356d793..d715fd762bf2c3b95961307c4ea1d83e128a8228 100644 (file)
@@ -32,6 +32,7 @@
 #include "dirname.h"
 
 #include "storage/storage_driver.h"
+#include "storage/storage_backend.h"
 
 #define VIR_FROM_THIS VIR_FROM_NONE
 
@@ -731,6 +732,9 @@ mymain(void)
     virStorageSourcePtr chain2; /* short for chain->backingStore */
     virStorageSourcePtr chain3; /* short for chain2->backingStore */
 
+    if (virStorageBackendDriversRegister() < 0)
+       return -1;
+
     /* Prep some files with qemu-img; if that is not found on PATH, or
      * if it lacks support for qcow2 and qed, skip this test.  */
     if ((ret = testPrepImages()) != 0)