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!