[libvirt] [PATCH 3/8] qemu: Translate the pool disk source when building drive string

Osier Yang jyang at redhat.com
Mon Apr 8 10:52:33 UTC 2013


On 06/04/13 07:24, John Ferlan wrote:
> On 04/04/2013 03:37 PM, Osier Yang wrote:
>> This adds a new helper qemuTranslateDiskSourcePool which uses the
>> storage pool/vol APIs to tranlsate the disk source before building
> s/tranlsate/translate/
>
>> the drive string. Network volume is not supported yet. Disk chain
>> for volume type disk may be supported later, but before I'm confident
>> it doesn't break anything, it's just disabled now.
>
> How would 'network volume' differ from "<disk type='network'"? And all
> the variants therein?
>
> Still trying to figure the 'benefit' of the volume tag since each of the
> types looked up in the pool could also be specified as "<disk
> type='xxx'" types (where xxx is file, block, dir).

Except Eric's feedback, see the discussion about "Migration with NPIV"
here:

http://www.redhat.com/archives/libvir-list/2012-November/msg00826.html

>
> But I'll press on with at least a mechanical review.  Maybe someone else
> can chime in with the product level viewpoint.
>
>> ---
>>   src/qemu/qemu_command.c | 79 +++++++++++++++++++++++++++++++++++++++++++++++++
>>   src/qemu/qemu_domain.c  |  4 ++-
>>   2 files changed, 82 insertions(+), 1 deletion(-)
>>
>> diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
>> index 693d30d..03c7195 100644
>> --- a/src/qemu/qemu_command.c
>> +++ b/src/qemu/qemu_command.c
>> @@ -2681,6 +2681,49 @@ qemuBuildNBDString(virConnectPtr conn, virDomainDiskDefPtr disk, virBufferPtr op
>>       return 0;
>>   }
>>   
>> +static int
>> +qemuTranslateDiskSourcePool(virConnectPtr conn,
>> +                            virDomainDiskDefPtr def,
>> +                            int *voltype)
>> +{
>> +    virStoragePoolPtr pool = NULL;
>> +    virStorageVolPtr vol = NULL;
>> +    virStorageVolInfo info;
>> +    int ret = -1;
>> +
>> +    if (def->type != VIR_DOMAIN_DISK_TYPE_VOLUME)
>> +        return 0;
>> +
>> +    if (!(pool = virStoragePoolLookupByName(conn, def->srcpool->pool)))
>> +        return -1;
>> +
>> +    if (!(vol = virStorageVolLookupByName(pool, def->srcpool->volume)))
>> +        goto cleanup;
>> +
>> +    if (virStorageVolGetInfo(vol, &info) < 0)
>> +        goto cleanup;
>> +
>> +    switch (info.type) {
>> +    case VIR_STORAGE_VOL_FILE:
>> +    case VIR_STORAGE_VOL_BLOCK:
>> +    case VIR_STORAGE_VOL_DIR:
>> +        if (!(def->src = virStorageVolGetPath(vol)))
>> +            goto cleanup;
>> +        break;
>> +    case VIR_STORAGE_VOL_NETWORK:
>> +        virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
>> +                       _("Using network volume as disk source is not supported"));
>> +        goto cleanup;
>> +    }
>> +
>> +    *voltype = info.type;
>> +    ret = 0;
>> +cleanup:
>> +    virStoragePoolFree(pool);
>> +    virStorageVolFree(vol);
>> +    return ret;
>> +}
>> +
>>   char *
>>   qemuBuildDriveStr(virConnectPtr conn ATTRIBUTE_UNUSED,
>>                     virDomainDiskDefPtr disk,
>> @@ -2693,6 +2736,7 @@ qemuBuildDriveStr(virConnectPtr conn ATTRIBUTE_UNUSED,
>>           virDomainDiskGeometryTransTypeToString(disk->geometry.trans);
>>       int idx = virDiskNameToIndex(disk->dst);
>>       int busid = -1, unitid = -1;
>> +    int voltype = -1;
> Does initializing this matter?  Ah perhaps the compiler complains...

0 means the VIR_STORAGE_VOL_FILE.

>
>>   
>>       if (idx < 0) {
>>           virReportError(VIR_ERR_INTERNAL_ERROR,
>> @@ -2700,6 +2744,9 @@ qemuBuildDriveStr(virConnectPtr conn ATTRIBUTE_UNUSED,
>>           goto error;
>>       }
>>   
>> +    if (qemuTranslateDiskSourcePool(conn, disk, &voltype) < 0)
>> +        goto error;
>> +
>>       switch (disk->bus) {
>>       case VIR_DOMAIN_DISK_BUS_SCSI:
>>           if (disk->info.type != VIR_DOMAIN_DEVICE_ADDRESS_TYPE_DRIVE) {
>> @@ -2834,6 +2881,38 @@ qemuBuildDriveStr(virConnectPtr conn ATTRIBUTE_UNUSED,
>>                   }
>>                   break;
>>               }
>> +        } else if (disk->type == VIR_DOMAIN_DISK_TYPE_VOLUME) {
>> +            switch (voltype) {
>> +            case VIR_STORAGE_VOL_DIR:
>> +                if (!disk->readonly) {
>> +                    virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
>> +                                   _("cannot create virtual FAT disks in read-write mode"));
>> +                    goto error;
>> +                }
>> +                if (disk->device == VIR_DOMAIN_DISK_DEVICE_FLOPPY)
>> +                    virBufferEscape(&opt, ',', ",", "file=fat:floppy:%s,",
>> +                                    disk->src);
>> +                else
>> +                    virBufferEscape(&opt, ',', ",", "file=fat:%s,", disk->src);
>> +                break;
>> +            case VIR_STORAGE_VOL_BLOCK:
>> +                if (disk->tray_status == VIR_DOMAIN_DISK_TRAY_OPEN) {
>> +                    virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
>> +                                   _("tray status 'open' is invalid for "
>> +                                     "block type volume"));
>> +                    goto error;
>> +                }
>> +                virBufferEscape(&opt, ',', ",", "file=%s,", disk->src);
>> +                break;
>> +            case VIR_STORAGE_VOL_FILE:
>> +                virBufferEscape(&opt, ',', ",", "file=%s,", disk->src);
>> +                break;
>> +            case VIR_STORAGE_VOL_NETWORK:
>> +                /* Let the compiler shutup, qemuTranslateDiskSourcePool already
> consider "keep the compiler quiet" :-) although I understand the
> sentiment :-)

That's more polite, changed. :-)

>
>> +                 * reported the unsupported error.
>> +                 */
>> +                break;
>> +            }
>>           } else {
>>               if ((disk->type == VIR_DOMAIN_DISK_TYPE_BLOCK) &&
>>                   (disk->tray_status == VIR_DOMAIN_DISK_TRAY_OPEN)) {
>> diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
>> index c79b05d..6762152 100644
>> --- a/src/qemu/qemu_domain.c
>> +++ b/src/qemu/qemu_domain.c
>> @@ -1943,7 +1943,9 @@ qemuDomainDetermineDiskChain(virQEMUDriverPtr driver,
>>       virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver);
>>       int ret = 0;
>>   
>> -    if (!disk->src || disk->type == VIR_DOMAIN_DISK_TYPE_NETWORK)
>> +    if (!disk->src ||
>> +        disk->type == VIR_DOMAIN_DISK_TYPE_NETWORK ||
>> +        disk->type == VIR_DOMAIN_DISK_TYPE_VOLUME)
>>           goto cleanup;
>>   
>>       if (disk->backingChain) {
>>
> ACK, mechnically it seems what's here covers things.
>
> John
>
> --
> libvir-list mailing list
> libvir-list at redhat.com
> https://www.redhat.com/mailman/listinfo/libvir-list




More information about the libvir-list mailing list