[libvirt] [PATCH v4] virsh: Increase device-detach intelligence
Michal Privoznik
mprivozn at redhat.com
Wed Nov 23 09:56:40 UTC 2011
On 22.11.2011 21:29, Eric Blake wrote:
> On 11/22/2011 03:26 AM, Michal Privoznik wrote:
>> From: Michal Prívozník <mprivozn at redhat.com>
>>
>> Up to now users have to give a full XML description on input when
>> device-detaching. If they omitted something it lead to unclear
>> error messages (like generated MAC wasn't found, etc.).
>> With this patch users can specify only those information which
>> specify one device sufficiently precise. Remaining information is
>> completed from domain.
>> ---
>>
>> diff to v3:
>> - Eric's review: https://www.redhat.com/archives/libvir-list/2011-September/msg00472.html
>
> Been a while since we last looked at this :) Looks like you correctly
> implemented my algorithm suggestions from the v3 comments.
>
>>
>> +/**
>> + * Check if n1 is superset of n2, meaning n1 contains all elements and
>> + * attributes as n2 at least. Including children.
>> + * @n1 first node
>> + * @n2 second node
>> + * return 1 in case n1 covers n2, 0 otherwise.
>> + */
>> +static bool
>
> Comment needs a tweak:
>
> returns true in case n1 covers n2, false otherwise
>
>> +
>> + n1_child_size = xmlChildElementCount(n1);
>> + if (!n1_child_size) {
>> + return !xmlChildElementCount(n2);
>> + }
>
> Rewriting this chunk will give you a minor optimization in more
> situations. For example, if n1 has two children but n2 has three
> children (to be a subset, n2 cannot have any more children than n1):
>
> n1_child_size = xmlChildElementCount(n1);
> n2_child_size = xmlChildElementCount(n2);
> if (n1_child_size < n2_child_size)
> return false;
>
>> +static int
>> +vshCompleteXMLFromDomain(vshControl *ctl, virDomainPtr dom, char *oldXML,
>> + char **newXML) {
>
> We haven't always been consistent, but generally the open { of a
> function appears on column 1 of a new line (same comment for
> vshNodeIsSuperset).
>
>> + int funcRet = -1;
>> + char *domXML = NULL;
>> + xmlDocPtr domDoc = NULL, devDoc = NULL;
>> + xmlNodePtr node = NULL;
>> + xmlXPathContextPtr domCtxt = NULL, devCtxt = NULL;
>> + xmlNodePtr *devices = NULL;
>> + xmlSaveCtxtPtr sctxt = NULL;
>> + int devices_size;
>> + char *xpath;
>
> To avoid crash on early error, this must be:
>
> char *xpath = NULL;
>
>> + buf = xmlBufferCreate();
>> + if (!buf) {
>> + vshError(ctl, "%s", _("out of memory"));
>> + goto cleanup;
>> + }
>> +
>> + /* Get all possible devices */
>> + virAsprintf(&xpath, "/domain/devices/%s", node->name);
>> + if (!xpath) {
>> + virReportOOMError();
>> + goto cleanup;
>
> since xpath is allocated on some, but not all paths, into cleanup.
>
>> +
>> +cleanup:
>> + xmlBufferFree(buf);
>> + VIR_FREE(devices);
>> + xmlXPathFreeContext(devCtxt);
>> + xmlXPathFreeContext(domCtxt);
>> + xmlFreeDoc(devDoc);
>> + xmlFreeDoc(domDoc);
>> + VIR_FREE(domXML);
>> + return funcRet;
>
> Mem leak if you don't have:
>
> VIR_FREE(xpath);
>
> ACK with those problems fixed.
>
Fixed and pushed. Thanks.
More information about the libvir-list
mailing list