[libvirt] [PATCH 9/9] Support network pool for volume disk
John Ferlan
jferlan at redhat.com
Thu Jan 31 18:26:28 UTC 2013
On 01/30/2013 01:11 PM, Osier Yang wrote:
> The only two network pools we supported are "rbd" and "sheepdog",
> and attributes "socket", "transport" are not supported in storage
> pool conf yet, this uses the default setting (TCP for 'transport',
> and "socket" is not set) temporarily. Future patches will extend
> the storage pool conf to support 'transport' and 'socket'.
> ---
> src/libvirt_private.syms | 1 +
> src/storage/storage_driver.c | 49 +++++++++++++++++++++++++++++++++++++----
> 2 files changed, 45 insertions(+), 5 deletions(-)
>
> diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
> index a44f3ff..4674bf9 100644
> --- a/src/libvirt_private.syms
> +++ b/src/libvirt_private.syms
> @@ -1153,6 +1153,7 @@ virStoragePoolSourceFree;
> virStoragePoolSourceListFormat;
> virStoragePoolSourceListNewSource;
> virStoragePoolTypeFromString;
> +virStoragePoolTypeToString;
> virStorageVolDefFindByKey;
> virStorageVolDefFindByName;
> virStorageVolDefFindByPath;
> diff --git a/src/storage/storage_driver.c b/src/storage/storage_driver.c
> index f2ca310..115c7a0 100644
> --- a/src/storage/storage_driver.c
> +++ b/src/storage/storage_driver.c
> @@ -2406,12 +2406,15 @@ storageTranslateDomainDiskSourcePool(virConnectPtr conn,
> virDomainDefPtr def)
> {
> virStoragePoolObjPtr pool = NULL;
> - virStorageVolDefPtr vol = NULL;
> int i;
> int ret = -1;
>
> for (i = 0; i < def->ndisks; i++) {
> + virStorageVolDefPtr vol = NULL;
> virDomainDiskDefPtr disk = def->disks[i];
> + virDomainDiskHostDefPtr hosts = NULL;
> + int nhost;
> + int n;
>
> if (disk->type != VIR_DOMAIN_DISK_TYPE_VOLUME)
> continue;
> @@ -2449,10 +2452,46 @@ storageTranslateDomainDiskSourcePool(virConnectPtr conn,
> 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;
> - }
> + if (pool->def->type != VIR_STORAGE_POOL_RBD &&
> + pool->def->type != VIR_STORAGE_POOL_SHEEPDOG) {
> + virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
> + _("Using '%s' pool as disk source is "
> + "not supported"),
> + virStoragePoolTypeToString(pool->def->type));
> + goto cleanup;
> + }
> +
> + if (VIR_ALLOC_N(hosts, pool->def->source.nhost) < 0) {
> + virReportOOMError();
> + goto cleanup;
> + }
> +
> + nhost = pool->def->source.nhost;
> + for (n = 0; n < pool->def->source.nhost; n++) {
> + hosts[n].name = strdup(pool->def->source.hosts[n].name);
What if hosts[n].name == NULL?
> + if (virAsprintf(&hosts[n].port, "%d",
> + pool->def->source.hosts[n].port) < 0) {
> + virReportOOMError();
> + while (nhost > 0) {
> + virDomainDiskHostDefFree(&hosts[nhost - 1]);
> + nhost--;
> + }
Need a VIR_FREE(hosts);
> + goto cleanup;
> + }
> +
> +
> + /* XXX: Use the default, as storage pool have not supported
> + * 'transport' and 'socket' yet.
> + */
> + hosts[n].transport = VIR_DOMAIN_DISK_PROTO_TRANS_TCP;
> + hosts[n].socket = NULL;
> + }
> +
> + disk->hosts = hosts;
> + disk->nhosts = pool->def->source.nhost;
> + disk->src = strdup(vol->name);
What happens if !disk->src here?
> + break;
> + }
>
> virStoragePoolObjUnlock(pool);
> pool = NULL;
>
More information about the libvir-list
mailing list