[libvirt] [PATCH] Support virDomainAttachDevice and virDomainDetachDevice for disks in UML

Soren Hansen soren at ubuntu.com
Thu Aug 19 15:00:15 UTC 2010


On 19-08-2010 15:22, Daniel P. Berrange wrote:
>> +static inline void umlShrinkDisks(virDomainDefPtr def, size_t i)
>> +{
>> +    if (def->ndisks > 1) {
>> +        memmove(def->disks + i,
>> +                def->disks + i + 1,
>> +                sizeof(*def->disks) *
>> +                (def->ndisks - (i + 1)));
>> +        def->ndisks--;
>> +        if (VIR_REALLOC_N(def->disks, def->ndisks) < 0) {
>> +            /* ignore, harmless */
>> +        }
>> +    } else {
>> +        VIR_FREE(def->disks);
>> +        def->ndisks = 0;
>> +    }
>> +}
> Since this code is already used in the QEMU driver, I think we
> should just put it straight into src/conf/domain_conf.c so we
> can share it. 'virDomainDiskRemove' is probably a more accurate
> name than ShrinkDisks.

Sounds good to me. I wasn't sure where to stick it, so I just left it
here and figured you'd probably tell me something like this :) I'll move it.

>> +
>> +
>> +static int umlDomainAttachUmlDisk(struct uml_driver *driver,
>> +                                  virDomainObjPtr vm,
>> +                                  virDomainDiskDefPtr disk)
>> +{
>> +    int i, ret;
>> +    char *cmd = NULL;
>> +    char *reply;
>> +
>> +    for (i = 0 ; i < vm->def->ndisks ; i++) {
>> +        if (STREQ(vm->def->disks[i]->dst, disk->dst)) {
>> +            umlReportError(VIR_ERR_OPERATION_FAILED,
>> +                           _("target %s already exists"), disk->dst);
>> +            return -1;
>> +        }
>> +    }
>> +
>> +    if (!disk->src) {
>> +        umlReportError(VIR_ERR_INTERNAL_ERROR,
>> +                       "%s", _("disk source path is missing"));
>> +        goto error;
>> +    }
>> +
>> +    if (virAsprintf(&cmd, "config %s=%s", disk->dst, disk->src) < 0) {
>> +        virReportOOMError();
>> +        return -1;
>> +    }
>> +
>> +    if (umlMonitorCommand(driver, vm, cmd, &reply) < 0)
>> +        return -1;
> 
> Needs to be a 'goto error' to avoid leaking 'cmd'

Ah, yes, good catch. I also need to free the reply. :)

>> @@ -1900,9 +2119,9 @@ static virDriver umlDriver = {
>>      umlDomainStartWithFlags, /* domainCreateWithFlags */
>>      umlDomainDefine, /* domainDefineXML */
>>      umlDomainUndefine, /* domainUndefine */
>> -    NULL, /* domainAttachDevice */
>> +    umlDomainAttachDevice, /* domainAttachDevice */
>>      NULL, /* domainAttachDeviceFlags */
>> -    NULL, /* domainDetachDevice */
>> +    umlDomainDetachDevice, /* domainDetachDevice */
>>      NULL, /* domainDetachDeviceFlags */
> 
> You should also implement the DeviceFlags variants at
> the same time. You can just do a dumb wrapper like QEMU
> driver does, for simplicity.

Right you are. I misunderstood what those were for.

-- 
Soren Hansen
Ubuntu Developer
http://www.ubuntu.com/




More information about the libvir-list mailing list