There is an unfortunate cylic dependancy between the storage_backend.c file and all the storage backend implementations due to the statically declared table of drivers. This patch addresses the problem by making the table of backends dynamically registered. The storage driver will thus register each backend explicitly at its startup. The storage_backend.c file is thus now completely generic, and has no compile time dep on the individual drivers. I should have written it this way in the first place :-) storage_backend.c | 44 +++++++++++--------------------------------- storage_backend.h | 1 + storage_driver.c | 37 +++++++++++++++++++++++++++++++++++++ 3 files changed, 49 insertions(+), 33 deletions(-) Daniel diff -r d70577bacf78 src/storage_backend.c --- a/src/storage_backend.c Wed Oct 29 17:51:07 2008 +0000 +++ b/src/storage_backend.c Wed Oct 29 18:01:58 2008 +0000 @@ -47,49 +47,27 @@ #include "storage_backend.h" -#if WITH_STORAGE_LVM -#include "storage_backend_logical.h" -#endif -#if WITH_STORAGE_ISCSI -#include "storage_backend_iscsi.h" -#endif -#if WITH_STORAGE_DISK -#include "storage_backend_disk.h" -#endif -#if WITH_STORAGE_DIR -#include "storage_backend_fs.h" -#endif - VIR_ENUM_IMPL(virStorageBackendPartTable, VIR_STORAGE_POOL_DISK_LAST, "unknown", "dos", "dvh", "gpt", "mac", "bsd", "pc98", "sun", "lvm2"); -static virStorageBackendPtr backends[] = { -#if WITH_STORAGE_DIR - &virStorageBackendDirectory, -#endif -#if WITH_STORAGE_FS - &virStorageBackendFileSystem, - &virStorageBackendNetFileSystem, -#endif -#if WITH_STORAGE_LVM - &virStorageBackendLogical, -#endif -#if WITH_STORAGE_ISCSI - &virStorageBackendISCSI, -#endif -#if WITH_STORAGE_DISK - &virStorageBackendDisk, -#endif - NULL -}; +static unsigned nbackends = 0; +static virStorageBackendPtr *backends = NULL; + +int virStorageBackendRegister(virStorageBackendPtr bk) { + if (VIR_REALLOC_N(backends, nbackends+1) < 0) + return -1; + + backends[nbackends++] = bk; + return 0; +} virStorageBackendPtr virStorageBackendForType(int type) { unsigned int i; - for (i = 0; backends[i]; i++) + for (i = 0; i < nbackends; i++) if (backends[i]->type == type) return backends[i]; diff -r d70577bacf78 src/storage_backend.h --- a/src/storage_backend.h Wed Oct 29 17:51:07 2008 +0000 +++ b/src/storage_backend.h Wed Oct 29 18:01:58 2008 +0000 @@ -120,6 +120,7 @@ int volType; }; +int virStorageBackendRegister(virStorageBackendPtr bk); virStorageBackendPtr virStorageBackendForType(int type); virStorageBackendPoolOptionsPtr virStorageBackendPoolOptionsForType(int type); diff -r d70577bacf78 src/storage_driver.c --- a/src/storage_driver.c Wed Oct 29 17:51:07 2008 +0000 +++ b/src/storage_driver.c Wed Oct 29 18:01:58 2008 +0000 @@ -40,6 +40,20 @@ #include "storage_conf.h" #include "memory.h" #include "storage_backend.h" + + +#if WITH_STORAGE_LVM +#include "storage_backend_logical.h" +#endif +#if WITH_STORAGE_ISCSI +#include "storage_backend_iscsi.h" +#endif +#if WITH_STORAGE_DISK +#include "storage_backend_disk.h" +#endif +#if WITH_STORAGE_DIR +#include "storage_backend_fs.h" +#endif #define storageLog(msg...) fprintf(stderr, msg) @@ -96,6 +110,29 @@ struct passwd *pw; char *base = NULL; char driverConf[PATH_MAX]; + +#if WITH_STORAGE_DIR + if (virStorageBackendRegister(&virStorageBackendDirectory) < 0) + return -1; +#endif +#if WITH_STORAGE_FS + if (virStorageBackendRegister(&virStorageBackendFileSystem) < 0) + return -1; + if (virStorageBackendRegister(&virStorageBackendNetFileSystem) < 0) + return -1; +#endif +#if WITH_STORAGE_LVM + if (virStorageBackendRegister(&virStorageBackendLogical) < 0) + return -1; +#endif +#if WITH_STORAGE_ISCSI + if (virStorageBackendRegister(&virStorageBackendISCSI) < 0) + return -1; +#endif +#if WITH_STORAGE_DISK + if (virStorageBackendRegister(&virStorageBackendDisk) < 0) + return -1; +#endif if (VIR_ALLOC(driverState) < 0) return -1; -- |: Red Hat, Engineering, London -o- http://people.redhat.com/berrange/ :| |: http://libvirt.org -o- http://virt-manager.org -o- http://ovirt.org :| |: http://autobuild.org -o- http://search.cpan.org/~danberr/ :| |: GnuPG: 7D3B9505 -o- F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505 :| -- Libvir-list mailing list Libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list