[libvirt] [PATCH v2 6/8] blockcopy: add a way to parse disk source
Peter Krempa
pkrempa at redhat.com
Tue Aug 26 15:41:30 UTC 2014
On 08/26/14 13:21, Eric Blake wrote:
> The new blockcopy API wants to reuse only a subset of the disk
> hotplug parser - namely, we only care about the embedded
> virStorageSourcePtr inside a <disk> XML. Strange as it may
> seem, it was easier to just parse an entire disk definition,
> then throw away everything but the embedded source, than it
> was to disentangle the source parsing code from the rest of
> the overall disk parsing function. All that I needed was a
> couple of tweaks and a new internal flag that determines
> whether the normally-mandatory target element can be
> gracefully skipped.
>
> While adding the new flag, I noticed we had a verify() that
> was incomplete after several recent internal flag additions;
> move that up higher in the code to make it harder to forget
> to modify on the next flag addition.
>
> * src/conf/domain_conf.h (virDomainDiskSourceParse): New
> prototype.
> * src/conf/domain_conf.c (VIR_DOMAIN_XML_INTERNAL_DISK_SOURCE):
> New flag.
> (virDomainDiskDefParseXML): Honor flag to make target optional.
> (virDomainDiskSourceParse): New function.
>
> Signed-off-by: Eric Blake <eblake at redhat.com>
> ---
> src/conf/domain_conf.c | 147 +++++++++++++++++++++++++++++++----------------
> src/conf/domain_conf.h | 4 ++
> src/libvirt_private.syms | 1 +
> 3 files changed, 103 insertions(+), 49 deletions(-)
>
> diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
> index dd512ca..2ee2af0 100644
> --- a/src/conf/domain_conf.c
> +++ b/src/conf/domain_conf.c
> @@ -89,19 +89,36 @@ struct _virDomainXMLOption {
>
>
> /* Private flags used internally by virDomainSaveStatus and
> - * virDomainLoadStatus. */
> + * virDomainLoadStatus, in addition to the public virDomainXMLFlags. */
> typedef enum {
> /* dump internal domain status information */
> - VIR_DOMAIN_XML_INTERNAL_STATUS = (1<<16),
> + VIR_DOMAIN_XML_INTERNAL_STATUS = 1 << 16,
> /* dump/parse <actual> element */
> - VIR_DOMAIN_XML_INTERNAL_ACTUAL_NET = (1<<17),
> + VIR_DOMAIN_XML_INTERNAL_ACTUAL_NET = 1 << 17,
> /* dump/parse original states of host PCI device */
> - VIR_DOMAIN_XML_INTERNAL_PCI_ORIG_STATES = (1<<18),
> - VIR_DOMAIN_XML_INTERNAL_ALLOW_ROM = (1<<19),
> - VIR_DOMAIN_XML_INTERNAL_ALLOW_BOOT = (1<<20),
> - VIR_DOMAIN_XML_INTERNAL_CLOCK_ADJUST = (1<<21),
> + VIR_DOMAIN_XML_INTERNAL_PCI_ORIG_STATES = 1 << 18,
> + VIR_DOMAIN_XML_INTERNAL_ALLOW_ROM = 1 << 19,
> + VIR_DOMAIN_XML_INTERNAL_ALLOW_BOOT = 1 << 20,
> + VIR_DOMAIN_XML_INTERNAL_CLOCK_ADJUST = 1 << 21,
> + /* parse only source half of <disk> */
> + VIR_DOMAIN_XML_INTERNAL_DISK_SOURCE = 1 << 22,
> } virDomainXMLInternalFlags;
>
> +#define DUMPXML_FLAGS \
> + (VIR_DOMAIN_XML_SECURE | \
> + VIR_DOMAIN_XML_INACTIVE | \
> + VIR_DOMAIN_XML_UPDATE_CPU | \
> + VIR_DOMAIN_XML_MIGRATABLE)
> +
> +verify(((VIR_DOMAIN_XML_INTERNAL_STATUS |
> + VIR_DOMAIN_XML_INTERNAL_ACTUAL_NET |
> + VIR_DOMAIN_XML_INTERNAL_PCI_ORIG_STATES |
> + VIR_DOMAIN_XML_INTERNAL_ALLOW_ROM |
> + VIR_DOMAIN_XML_INTERNAL_ALLOW_BOOT |
> + VIR_DOMAIN_XML_INTERNAL_CLOCK_ADJUST |
> + VIR_DOMAIN_XML_INTERNAL_DISK_SOURCE)
> + & DUMPXML_FLAGS) == 0);
> +
Again, code tweaks and unrelated fixes ...
> VIR_ENUM_IMPL(virDomainTaint, VIR_DOMAIN_TAINT_LAST,
> "custom-argv",
> "custom-monitor",
> @@ -10359,7 +10379,7 @@ virDomainDeviceDefParse(const char *xmlStr,
> }
>
> /* callback to fill driver specific device aspects */
> - if (virDomainDeviceDefPostParse(dev, def, caps, xmlopt) < 0)
> + if (virDomainDeviceDefPostParse(dev, def, caps, xmlopt) < 0)
> goto error;
Unrelated.
>
> cleanup:
> @@ -10373,6 +10393,47 @@ virDomainDeviceDefParse(const char *xmlStr,
> }
>
>
> +virStorageSourcePtr
> +virDomainDiskDefSourceParse(const char *xmlStr,
> + const virDomainDef *def,
> + virDomainXMLOptionPtr xmlopt,
> + unsigned int flags)
> +{
> + xmlDocPtr xml;
> + xmlNodePtr node;
> + xmlXPathContextPtr ctxt = NULL;
> + virDomainDiskDefPtr disk = NULL;
> + virStorageSourcePtr ret = NULL;
> +
> + if (!(xml = virXMLParseStringCtxt(xmlStr, _("(disk_definition)"), &ctxt)))
> + goto cleanup;
> + node = ctxt->node;
Is the extra variable used to convert types?
> +
> + if (!xmlStrEqual(node->name, BAD_CAST "disk")) {
> + virReportError(VIR_ERR_XML_ERROR,
> + _("expecting root element of 'disk', not '%s'"),
> + node->name);
> + goto cleanup;
> + }
> +
> + flags |= VIR_DOMAIN_XML_INTERNAL_DISK_SOURCE;
> + if (!(disk = virDomainDiskDefParseXML(xmlopt, node, ctxt,
> + NULL, def->seclabels,
> + def->nseclabels,
> + flags)))
> + goto cleanup;
> +
> + ret = disk->src;
> + disk->src = NULL;
> +
> + cleanup:
> + virDomainDiskDefFree(disk);
> + xmlFreeDoc(xml);
> + xmlXPathFreeContext(ctxt);
> + return ret;
> +}
> +
> +
> static const char *
> virDomainChrTargetTypeToString(int deviceType,
> int targetType)
> @@ -17726,18 +17787,6 @@ virDomainHugepagesFormat(virBufferPtr buf,
> }
>
>
> -#define DUMPXML_FLAGS \
> - (VIR_DOMAIN_XML_SECURE | \
> - VIR_DOMAIN_XML_INACTIVE | \
> - VIR_DOMAIN_XML_UPDATE_CPU | \
> - VIR_DOMAIN_XML_MIGRATABLE)
> -
> -verify(((VIR_DOMAIN_XML_INTERNAL_STATUS |
> - VIR_DOMAIN_XML_INTERNAL_ACTUAL_NET |
> - VIR_DOMAIN_XML_INTERNAL_PCI_ORIG_STATES |
> - VIR_DOMAIN_XML_INTERNAL_CLOCK_ADJUST)
> - & DUMPXML_FLAGS) == 0);
> -
> static bool
> virDomainDefHasCapabilitiesFeatures(virDomainDefPtr def)
> {
> diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
> index aead903..512d097 100644
> --- a/src/conf/domain_conf.h
> +++ b/src/conf/domain_conf.h
> @@ -2294,6 +2294,10 @@ virDomainDeviceDefPtr virDomainDeviceDefParse(const char *xmlStr,
> virCapsPtr caps,
> virDomainXMLOptionPtr xmlopt,
> unsigned int flags);
> +virStorageSourcePtr virDomainDiskDefSourceParse(const char *xmlStr,
> + const virDomainDef *def,
> + virDomainXMLOptionPtr xmlopt,
> + unsigned int flags);
> virDomainDefPtr virDomainDefParseString(const char *xmlStr,
> virCapsPtr caps,
> virDomainXMLOptionPtr xmlopt,
> diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
> index 6b9ee21..1195208 100644
> --- a/src/libvirt_private.syms
> +++ b/src/libvirt_private.syms
> @@ -222,6 +222,7 @@ virDomainDiskDefAssignAddress;
> virDomainDiskDefForeachPath;
> virDomainDiskDefFree;
> virDomainDiskDefNew;
> +virDomainDiskDefSourceParse;
> virDomainDiskDeviceTypeToString;
> virDomainDiskDiscardTypeToString;
> virDomainDiskErrorPolicyTypeFromString;
>
I'd really prefer the unrelated tweaks posted separately.
Again, what you have works so ACK to this patch even if you decide
against splitting it up.
Peter
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 819 bytes
Desc: OpenPGP digital signature
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20140826/e05457ca/attachment-0001.sig>
More information about the libvir-list
mailing list