[libvirt] [PATCH 4/9] Implement translateDiskSourcePool

John Ferlan jferlan at redhat.com
Thu Jan 31 17:42:54 UTC 2013


On 01/30/2013 01:11 PM, 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);
s/vol/volume

Since you have the pool name, wouldn't it be better to state that volume
"%s" was not found in pool "%s"?

Although I now see you just hoisted the message from elsewhere.

> +            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);

And if !disk->src here what assumptions get broken later?

> +            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;
>  }
> 




More information about the libvir-list mailing list