[libvirt] [PATCHv2 4/9] conf: support abstracted interface info in domain interface XML

Laine Stump laine at laine.org
Thu Jul 21 23:49:28 UTC 2011


On 07/20/2011 05:54 PM, Eric Blake wrote:
> On 07/20/2011 12:21 AM, Laine Stump wrote:
>
>>
>> <p>
>> -      Provides a virtual network using a bridge device in the host.
> ...
>> -      overridden with the<target> element (see
>> +
>> +      Provides a connection whose details are described by the named
>
> Why the blank line  between <p> and the start of the paragraph?


I usually put a few blank lines in between what I'm changing and the 
surrounding text to minimize the amount of changed lines due to 
re-flowing. I then close up the blank lines before I'm done. OR I don't 
- this time I forgot.


>
> [and I really hate it that thunderbird is back to its habits of 
> munging quoted text in my emails again - for a while there, I was 
> running a version where the problem went away, but the latest distro 
> upgrade made it resurface]

I've been very bothered lately by Thunderbird's belief that it's okay to 
mess around with my text however it sees fit. For example, I can't get 
it to honor extra indenting whitespace I put at the beginning of lines 
when I'm putting XML examples in my message.


>
>>
>> +void
>> +virDomainActualNetDefFree(virDomainActualNetDefPtr def)
>
> Add this to cfg.mk's list of free-like functions.
>
>> +{
>> +    if (!def)
>> +        return;
>> +
>> +    switch (def->type) {
>> +    case VIR_DOMAIN_NET_TYPE_BRIDGE:
>> +        VIR_FREE(def->data.bridge.brname);
>> +        break;
>> +    case VIR_DOMAIN_NET_TYPE_DIRECT:
>> +        VIR_FREE(def->data.direct.linkdev);
>> +        VIR_FREE(def->data.direct.virtPortProfile);
>> +        break;
>> +    default:
>> +        break;
>> +    }
>> +}
>
> Memory leak of def itself.


Derp!


>
>>
>> +static int
>> +virDomainActualNetDefParseXML(xmlNodePtr node,
>> +                              xmlXPathContextPtr ctxt,
>> +                              virDomainActualNetDefPtr *def)
>> +{
>> +    virDomainActualNetDefPtr actual = NULL;
>> +    int ret = -1;
>> +    xmlNodePtr save_ctxt = ctxt->node;
>> +    char *type = NULL;
>> +    char *mode = NULL;
>> +
>> +    if (VIR_ALLOC(actual)<  0) {
>> +        virReportOOMError();
>> +        return -1;
>> +    }
>> +
>> +    ctxt->node = node;
>> +
>> +    type = virXMLPropString(node, "type");
>> +    if (!type) {
>> +        virDomainReportError(VIR_ERR_INTERNAL_ERROR, "%s",
>> +                             _("missing type attribute in 
>> interface's<actual>  element"));
>> +        goto error;
>> +    }
>> +    if ((int)(actual->type = virDomainNetTypeFromString(type))<  0) {
>
> This cast is not needed if you tweak domain_conf.h.
>
>> +
>> +    *def = actual;
>> +    actual = NULL;
>> +    ret = 0;
>> +error:
>> +    VIR_FREE(type);
>> +    VIR_FREE(mode);
>> +
>> +    ctxt->node = save_ctxt;
>> +    return ret;
>
> Memory leak of actual on error cases.


Double derp! (This previously didn't leak because I allocated directly 
into the parent object, and let the caller's destructor cleanup on failure).


>
>> @@ -6772,7 +6887,8 @@ virDomainDefPtr 
>> virDomainDefParseNode(virCapsPtr caps,
>>       }
>>
>>       ctxt->node = root;
>> -    def = virDomainDefParseXML(caps, xml, root, ctxt, 
>> expectedVirtTypes, flags);
>> +    def = virDomainDefParseXML(caps, xml, root, ctxt, 
>> expectedVirtTypes,
>> +                               flags);
>
> Your change and then undo made for a spurious hunk.
>
>>
>>   cleanup:
>>       xmlXPathFreeContext(ctxt);
>> @@ -6803,7 +6919,8 @@ virDomainObjParseNode(virCapsPtr caps,
>>       }
>>
>>       ctxt->node = root;
>> -    obj = virDomainObjParseXML(caps, xml, ctxt, expectedVirtTypes, 
>> flags);
>> +    obj = virDomainObjParseXML(caps, xml, ctxt, expectedVirtTypes,
>> +                               flags);
>
> and another one.
>
>> @@ -10008,7 +10201,10 @@ int virDomainSaveStatus(virCapsPtr caps,
>>                           const char *statusDir,
>>                           virDomainObjPtr obj)
>>   {
>> -    unsigned int flags = 
>> VIR_DOMAIN_XML_SECURE|VIR_DOMAIN_XML_INTERNAL_STATUS;
>> +    unsigned int flags = (VIR_DOMAIN_XML_SECURE |
>> +                          VIR_DOMAIN_XML_INTERNAL_STATUS |
>> +                          VIR_DOMAIN_XML_INTERNAL_ACTUAL_NET);
>> +
>>       int ret = -1;
>>       char *xml;
>>
>> @@ -10099,7 +10295,8 @@ static virDomainObjPtr 
>> virDomainLoadStatus(virCapsPtr caps,
>>           goto error;
>>
>>       if (!(obj = virDomainObjParseFile(caps, statusFile, 
>> expectedVirtTypes,
>> -                                      VIR_DOMAIN_XML_INTERNAL_STATUS)))
>> +                                      VIR_DOMAIN_XML_INTERNAL_STATUS |
>> +                                      
>> VIR_DOMAIN_XML_INTERNAL_ACTUAL_NET)))
>
> Thinking out loud here - it looks like we never use _INTERNAL_STATUS 
> or _INTERNAL_ACTUAL_NET in isolation - as of this patch, it is always 
> both or neither.  Maybe we could have let _INTERNAL_STATUS be the key 
> on whether to also output/parse <actual> elements rather than adding a 
> new flag.  On the other hand, if we ever change our mind and decide 
> that it makes sense to let the user do 'virsh dumpxml dom --actual' to 
> see which resources actually got used, then it is easier to change 
> VIR_DOMAIN_XML_INTERNAL_ACTUAL_NET into a public flag, than it is if 
> we lump all internal actions under a single _INTERNAL_STATUS flags.  
> So no change necessary for now.
>
>> +++ b/src/conf/domain_conf.h
>> @@ -343,6 +343,27 @@ enum virDomainNetVirtioTxModeType {
>>       VIR_DOMAIN_NET_VIRTIO_TX_MODE_LAST,
>>   };
>>
>> +/* Config that was actually used to bring up interface, after
>> + * resolving network reference. This is private data, only used within
>> + * libvirt, but still must maintain backward compatibility, because
>> + * different versions of libvirt may read the same data file.
>> + */
>> +typedef struct _virDomainActualNetDef virDomainActualNetDef;
>> +typedef virDomainActualNetDef *virDomainActualNetDefPtr;
>> +struct _virDomainActualNetDef {
>> +    enum virDomainNetType type;
>
> Per the earlier cast comment, use int here, to match most other 
> _virDomain*Def typed unions.


Okay. But the original struct this was copied from (virDomainNetDef) 
uses the enum directly.


>
>> @@ -743,7 +749,6 @@ virNetworkSaveConfig;
>>   virNetworkSetBridgeMacAddr;
>>   virNetworkSetBridgeName;
>>
>> -
>>   # node_device_conf.h
>
> A spurious whitespace change.
>
>> +++ b/src/libxl/libxl_driver.c
>> @@ -707,7 +707,7 @@ libxlVmStart(libxlDriverPrivatePtr driver, 
>> virDomainObjPtr vm,
>>       }
>>
>>       vm->def->id = domid;
>> -    if ((dom_xml = virDomainDefFormat(vm->def, 0)) == NULL)
>> +    if ((dom_xml = virDomainDefFormat(vm->def)) == NULL)
>
> Oops, that's a compile failure, caused by over-undoing your 
> now-abandoned idea of adding a parameter.
>
> ACK with this squashed in:

Squashed and pushed. Thanks!






More information about the libvir-list mailing list