[libvirt] [PATCH] qemu: Don't parse device twice in attach/detach
Eric Blake
eblake at redhat.com
Sat Mar 3 01:51:57 UTC 2012
On 03/01/2012 11:56 AM, Michal Privoznik wrote:
> Some nits are generated during XML parse (e.g. MAC address of
This reads awkwardly; how about:
s/nits/members/
> an interface); However, with current implementation, if we
> are plugging a device both to persistent and live config,
> we parse given XML twice: first time for live, second for config.
> This is wrong then as the second time we are not guaranteed
> to generate same values as we did for the first time.
> To prevent that we need to create a copy of DeviceDefPtr;
> This is done through format/parse process instead of writing
> functions for deep copy as it is easier to maintain:
> adding new field to any virDomain*DefPtr doesn't require change
> of copying function.
> ---
> src/conf/domain_conf.c | 94 ++++++++++++++++++++++++++++++++++++++++++++++
> src/conf/domain_conf.h | 3 +
> src/libvirt_private.syms | 1 +
> src/qemu/qemu_driver.c | 40 +++++++++++--------
> 4 files changed, 121 insertions(+), 17 deletions(-)
>
> +
> +#define VIR_DOMAIN_DEVICE_FORMAT(func) \
> + if (func < 0) \
> + goto cleanup; \
> + xmlStr = virBufferContentAndReset(&buf); \
> + ret = virDomainDeviceDefParse(caps, def, xmlStr, flags)
If you sink these two lines to occur after the switch statement closes,
then you can avoid this macro. That is...
> +
> +virDomainDeviceDefPtr
> +virDomainDeviceDefCopy(virCapsPtr caps,
> + const virDomainDefPtr def,
> + virDomainDeviceDefPtr src)
> +{
> + virDomainDeviceDefPtr ret = NULL;
> + virBuffer buf = VIR_BUFFER_INITIALIZER;
> + int flags = VIR_DOMAIN_XML_INACTIVE;
> + char *xmlStr = NULL;
int rc;
> +
> + switch(src->type) {
> + case VIR_DOMAIN_DEVICE_DISK:
> + VIR_DOMAIN_DEVICE_FORMAT(virDomainDiskDefFormat(&buf,
> + src->data.disk,
> + flags));
case VIR_DOMAIN_DEVICE_DISK:
rc = virDomainDiskDefFormat(&buf, src->data.disk, flags);
break;
...
> + default:
> + virDomainReportError(VIR_ERR_INTERNAL_ERROR,
> + _("Copying definition of '%d' type "
> + "is not implemented yet."),
> + src->type);
goto cleanup;
> + break;
> + }
if (fc < 0)
goto cleanup;
xmlStr = virBufferContentAndReset(&buf);
ret = virDomainDeviceDefParse(caps, def, xmlStr, flags);
> +
> +cleanup:
> + VIR_FREE(xmlStr);
> + return ret;
> +}
> @@ -5694,6 +5698,8 @@ endjob:
> cleanup:
> virDomainDefFree(vmdef);
> virDomainDeviceDefFree(dev);
> + if (free_dev_copy)
> + virDomainDeviceDefFree(dev_copy);
You could also avoid free_dev_copy, and just say if (dev != dev_copy) here.
Overall, this looks like a reasonable patch. But I suggested enough
cleanups that it's probably worth seeing a v2.
--
Eric Blake eblake at redhat.com +1-919-301-3266
Libvirt virtualization library http://libvirt.org
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 620 bytes
Desc: OpenPGP digital signature
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20120302/7e429cc2/attachment-0001.sig>
More information about the libvir-list
mailing list