On 2013年02月01日 01:42, John Ferlan wrote:
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"?
Agreed.
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?
Hum, this inspires me notice vol->target.path can be NULL (it's not
mandatory in vol XML). And it should error out as long as the the disk
is not CD-ROM or Floppy.
But I don't think it's neccesary to check the return value of strdup.
Will post v2.
> + 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;
> }
>
--
libvir-list mailing list
libvir-list(a)redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list