[libvirt] Domain XML format using defined storage volume + RFC

Stefan de Konink skinkie at xs4all.nl
Mon May 19 21:53:07 UTC 2008


Daniel P. Berrange schreef:
> On Fri, May 16, 2008 at 01:00:16AM +0200, Stefan de Konink wrote:
>> On Thu, 15 May 2008, Stefan de Konink wrote:
>>
>>> On Thu, 15 May 2008, Stefan de Konink wrote:
>>>
>>>> I almost started crying why it didn't work. But it is fixed, and it works
>>>> as a charm :) See updated patch!
>>> I guess I need to write the 'check' tool and documentation update too?
>> Since there is currently no check build for pools in that directory, I'm
>> passing this to someother person.
> 
> Yes, testing the interaction with pools is actually harder that I anticipated,
> because the libvirtd isn't available in context of the test suite. I'll have to
> think about best way todo it. Might be able to stub out a dummy impl for purposes
> of testing.

Ok.

> 
>> @@ -1309,11 +1311,24 @@ virDomainParseXMLDiskDesc(virConnectPtr conn, xmlNodePtr node,
>>          if (cur->type == XML_ELEMENT_NODE) {
>>              if ((source == NULL) &&
>>                  (xmlStrEqual(cur->name, BAD_CAST "source"))) {
>> -
>>                  if (typ == 0)
>>                      source = xmlGetProp(cur, BAD_CAST "file");
>> -                else
>> +                else if (typ == 1)
>>                      source = xmlGetProp(cur, BAD_CAST "dev");
>> +                else if (typ == 2) {
>> +                    xmlChar *pool   = xmlGetProp(cur, BAD_CAST "pool");
>> +                    xmlChar *volume = xmlGetProp(cur, BAD_CAST "volume");
>> +                    if (pool != NULL && volume != NULL) {
>> +                        virStoragePoolPtr virPool;
>> +                        virPool = virStoragePoolLookupByName(conn, (const char *) pool);
>> +                        if (virPool != NULL) {
>> +                            virStorageVolPtr virVol;
>> +                            virVol = virStorageVolLookupByName(virPool, (const char *) volume);
>> +                            if (virVol != NULL)
>> +                                source = BAD_CAST virStorageVolGetPath(virVol);
> 
> This is leaking the pool and volume objects.

Ok. Appended xmlFree's.
http://kinkrsoftware.nl/contrib/libvirt/pool.patch


> 
>> +                        }
>> +                    }
>> +                }
>>              } else if ((target == NULL) &&
>>                         (xmlStrEqual(cur->name, BAD_CAST "target"))) {
>>                  target = xmlGetProp(cur, BAD_CAST "dev");
>> @@ -1411,7 +1426,8 @@ virDomainParseXMLDiskDesc(virConnectPtr conn, xmlNodePtr node,
>>                  virBufferVSprintf(buf, "(uname 'phy:%s')", source);
>>              else
>>                  virBufferVSprintf(buf, "(uname 'phy:/dev/%s')", source);
>> -        }
>> +        } else if (typ == 2)
>> +            virBufferVSprintf(buf, "(uname 'phy:%s')", source);
> 
> This is leaking the 'source' string, 

It is not leaking imho, since 'down under' there is an xmlFree(source).

> and a volume can be either a file
> or a physical device, so fixing it to be 'phy:' is not correct.

How can we know if the volume is a file or a device?

> We also need to apply the reverse mapping when generating the XML. eg
> do a virStorageVolLookupByPath() to discover the volume/pool. 

Mmm... that sounds not trivial... (I mean duplicate wise).



Stefan




More information about the libvir-list mailing list