[libvirt] [PATCH 4/9] Implement translateDiskSourcePool
Daniel P. Berrange
berrange at redhat.com
Mon Feb 4 14:31:24 UTC 2013
On Thu, Jan 31, 2013 at 02:11:29AM +0800, Osier Yang wrote:
> It iterates over all the domain disks, and translate the source of
> all the disks of 'volume' type from storage pool/volume to the real
> underlying source.
>
> Disks of type 'file', 'block', and 'dir' are supported now. Network
> type is not supported yet, it will be another patch.
>
> src/storage/storage_driver.c:
> * New helper storagePoolObjFindByDiskSource to find the specified
> pool by name.
> * Implement translateDiskSourcePool as storageTranslateDomainDiskSourcePool
> ---
> src/storage/storage_driver.c | 90 ++++++++++++++++++++++++++++++++++++++++++
> 1 files changed, 90 insertions(+), 0 deletions(-)
>
> diff --git a/src/storage/storage_driver.c b/src/storage/storage_driver.c
> index e98c18c..9f60f2c 100644
> --- a/src/storage/storage_driver.c
> +++ b/src/storage/storage_driver.c
> @@ -47,6 +47,8 @@
> #include "virlog.h"
> #include "virfile.h"
> #include "fdstream.h"
> +#include "domain_conf.h"
> +#include "domain_storage.h"
> #include "configmake.h"
>
> #define VIR_FROM_THIS VIR_FROM_STORAGE
> @@ -2367,6 +2369,88 @@ storageListAllPools(virConnectPtr conn,
> return ret;
> }
>
> +static virStoragePoolObjPtr
> +storagePoolObjFindByDiskSource(virConnectPtr conn,
> + const char *name)
> +{
> + virStorageDriverStatePtr driver = conn->storagePrivateData;
> + virStoragePoolObjPtr pool = NULL;
> +
> + storageDriverLock(driver);
> + pool = virStoragePoolObjFindByName(&driver->pools, name);
> + storageDriverUnlock(driver);
> +
> + if (!pool) {
> + virReportError(VIR_ERR_NO_STORAGE_POOL,
> + _("no storage pool with matching name '%s'"),
> + name);
> + goto error;
> + }
> +
> + if (!virStoragePoolObjIsActive(pool)) {
> + virReportError(VIR_ERR_OPERATION_INVALID,
> + _("The specified pool '%s' is not active"),
> + name);
> + goto error;
> + }
> +
> + return pool;
> +error:
> + if (pool)
> + virStoragePoolObjUnlock(pool);
> + return NULL;
> +}
> +
> +static int
> +storageTranslateDomainDiskSourcePool(virConnectPtr conn,
> + virDomainDefPtr def)
> +{
> + virStoragePoolObjPtr pool = NULL;
> + virStorageVolDefPtr vol = NULL;
> + int i;
> + int ret = -1;
> +
> + for (i = 0; i < def->ndisks; i++) {
> + virDomainDiskDefPtr disk = def->disks[i];
> +
> + if (disk->type != VIR_DOMAIN_DISK_TYPE_VOLUME)
> + continue;
> +
> + if (!(pool = storagePoolObjFindByDiskSource(conn, disk->srcpool->pool)))
> + goto cleanup;
> +
> + if (!(vol = virStorageVolDefFindByName(pool, disk->srcpool->volume))) {
> + virReportError(VIR_ERR_NO_STORAGE_VOL,
> + _("no storage vol of specified pool with "
> + "matching name '%s'"),
> + disk->srcpool->volume);
> + goto cleanup;
> + }
> +
> + switch (vol->type) {
> + case VIR_STORAGE_VOL_FILE:
> + case VIR_STORAGE_VOL_BLOCK:
> + case VIR_STORAGE_VOL_DIR:
> + disk->src = strdup(vol->target.path);
> + break;
> + case VIR_STORAGE_VOL_NETWORK:
> + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
> + _("Using network volume as disk source is not supported"));
> + goto cleanup;
> + }
> +
> + virStoragePoolObjUnlock(pool);
> + pool = NULL;
> + }
> +
> + ret = 0;
> +
> +cleanup:
> + if (pool)
> + virStoragePoolObjUnlock(pool);
> + return ret;
> +}
> +
> static virStorageDriver storageDriver = {
> .name = "storage",
> .open = storageOpen, /* 0.4.0 */
> @@ -2423,8 +2507,14 @@ static virStateDriver stateDriver = {
> .reload = storageDriverReload,
> };
>
> +static virDomainStorageDriver domainStorageDriver = {
> + .translateDiskSourcePool = storageTranslateDomainDiskSourcePool,
> +};
> +
> +
> int storageRegister(void) {
> virRegisterStorageDriver(&storageDriver);
> virRegisterStateDriver(&stateDriver);
> + virRegisterDomainStorageDriver(&domainStorageDriver);
> return 0;
> }
Again, I think this abstraction is all pretty pointless
Daniel
--
|: http://berrange.com -o- http://www.flickr.com/photos/dberrange/ :|
|: http://libvirt.org -o- http://virt-manager.org :|
|: http://autobuild.org -o- http://search.cpan.org/~danberr/ :|
|: http://entangle-photo.org -o- http://live.gnome.org/gtk-vnc :|
More information about the libvir-list
mailing list