On 08/31/14 06:02, 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, since everything else was already optional.
* 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(a)redhat.com>
---
src/conf/domain_conf.c | 107 ++++++++++++++++++++++++++++++++++-------------
src/conf/domain_conf.h | 4 ++
src/libvirt_private.syms | 1 +
3 files changed, 82 insertions(+), 30 deletions(-)
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index 53ef694..8723008 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
\
@@ -5951,7 +5955,7 @@ virDomainDiskDefParseXML(virDomainXMLOptionPtr
xmlopt,
} else {
if (def->device == VIR_DOMAIN_DISK_DEVICE_FLOPPY) {
def->bus = VIR_DOMAIN_DISK_BUS_FDC;
- } else {
+ } else if (!(flags & VIR_DOMAIN_XML_INTERNAL_DISK_SOURCE)) {
if (STRPREFIX(target, "hd"))
def->bus = VIR_DOMAIN_DISK_BUS_IDE;
else if (STRPREFIX(target, "sd"))
@@ -6186,12 +6190,14 @@ virDomainDiskDefParseXML(virDomainXMLOptionPtr xmlopt,
}
}
- if (def->info.type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE
- && virDomainDiskDefAssignAddress(xmlopt, def) < 0)
- goto error;
+ if (!(flags & VIR_DOMAIN_XML_INTERNAL_DISK_SOURCE)) {
+ if (def->info.type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE
+ && virDomainDiskDefAssignAddress(xmlopt, def) < 0)
+ goto error;
- if (virDomainDiskBackingStoreParse(ctxt, def->src) < 0)
- goto error;
+ if (virDomainDiskBackingStoreParse(ctxt, def->src) < 0)
+ goto error;
This actually might be useful for source of block copy and others some
time in the future.
+ }
cleanup:
VIR_FREE(bus);
ACK, thanks for dropping the refactor part.
Peter