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; > } > -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list