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)"),
{
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];
}
}
virStorageFileBackendChown storageFileChown;
};
+int virStorageBackendDriversRegister(void);
+
+int virStorageBackendRegister(virStorageBackendPtr backend);
+int virStorageBackendFileRegister(virStorageFileBackendPtr backend);
+
#endif /* __VIR_STORAGE_BACKEND_H__ */
.downloadVol = virStorageBackendVolDownloadLocal,
.wipeVol = virStorageBackendDiskVolWipe,
};
+
+
+int
+virStorageBackendDiskRegister(void)
+{
+ return virStorageBackendRegister(&virStorageBackendDisk);
+}
#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__ */
.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;
+}
#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__ */
.storageFileChown = virStorageFileBackendGlusterChown,
.storageFileGetUniqueIdentifier = virStorageFileBackendGlusterGetUniqueIdentifier,
+};
-};
+int
+virStorageBackendGlusterRegister(void)
+{
+ if (virStorageBackendRegister(&virStorageBackendGluster) < 0)
+ return -1;
+
+ if (virStorageBackendFileRegister(&virStorageFileBackendGluster) < 0)
+ return -1;
+
+ return 0;
+}
#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__ */
.downloadVol = virStorageBackendVolDownloadLocal,
.wipeVol = virStorageBackendVolWipeLocal,
};
+
+
+int
+virStorageBackendISCSIRegister(void)
+{
+ return virStorageBackendRegister(&virStorageBackendISCSI);
+}
#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__ */
.downloadVol = virStorageBackendVolDownloadLocal,
.wipeVol = virStorageBackendLogicalVolWipe,
};
+
+
+int
+virStorageBackendLogicalRegister(void)
+{
+ return virStorageBackendRegister(&virStorageBackendLogical);
+}
#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__ */
#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"
.downloadVol = virStorageBackendVolDownloadLocal,
.wipeVol = virStorageBackendVolWipeLocal,
};
+
+
+int
+virStorageBackendMpathRegister(void)
+{
+ return virStorageBackendRegister(&virStorageBackendMpath);
+}
#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__ */
.resizeVol = virStorageBackendRBDResizeVol,
.wipeVol = virStorageBackendRBDVolWipe
};
+
+
+int
+virStorageBackendRBDRegister(void)
+{
+ return virStorageBackendRegister(&virStorageBackendRBD);
+}
#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__ */
.downloadVol = virStorageBackendVolDownloadLocal,
.wipeVol = virStorageBackendVolWipeLocal,
};
+
+
+int
+virStorageBackendSCSIRegister(void)
+{
+ return virStorageBackendRegister(&virStorageBackendSCSI);
+}
#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__ */
.deleteVol = virStorageBackendSheepdogDeleteVol,
.resizeVol = virStorageBackendSheepdogResizeVol,
};
+
+
+int
+virStorageBackendSheepdogRegister(void)
+{
+ return virStorageBackendRegister(&virStorageBackendSheepdog);
+}
#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__ */
.downloadVol = virStorageBackendVolDownloadLocal,
.wipeVol = virStorageBackendVolWipeLocal,
};
+
+
+int
+virStorageBackendVstorageRegister(void)
+{
+ return virStorageBackendRegister(&virStorageBackendVstorage);
+}
#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__ */
.uploadVol = virStorageBackendVolUploadLocal,
.downloadVol = virStorageBackendVolDownloadLocal,
};
+
+
+int
+virStorageBackendZFSRegister(void)
+{
+ return virStorageBackendRegister(&virStorageBackendZFS);
+}
#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__ */
int storageRegister(void)
{
+ if (virStorageBackendDriversRegister() < 0)
+ return -1;
if (virSetSharedStorageDriver(&storageDriver) < 0)
return -1;
if (virRegisterStateDriver(&stateDriver) < 0)
#include "dirname.h"
#include "storage/storage_driver.h"
+#include "storage/storage_backend.h"
#define VIR_FROM_THIS VIR_FROM_NONE
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)