[libvirt] [PATCH v2 00/11] Couple of migration fixes

v2 of: https://www.redhat.com/archives/libvir-list/2016-September/msg00802.html diff to v1: - Instead of introducing vir*Opaque() APIs, just add parseOpaque argument to everything that needs it - Pass qemuCaps directly instead of domain object Michal Privoznik (11): virDomainDefPostParse: Introduce @parseOpaque argument virDomainDefParseNode: Introduce @parseOpaque argument virDomainDefParse{File,String}: Introduce @parseOpaque argument virDomainDefCopy: Introduce @parseOpaque argument qemuDomainDefPostParse: Fetch qemuCaps from domain object conf: Extend virDomainDeviceDefPostParse for parseOpaque qemuDomainDeviceDefPostParse: Fetch caps from domain object conf: Extend virDomainDefAssignAddressesCallback for parseOpaque qemuDomainDefAssignAddresses: Fetch caps from domain object domain_conf: Introduce VIR_DOMAIN_DEF_PARSE_SKIP_POST_PARSE conf: Skip post parse callbacks when creating copy src/bhyve/bhyve_domain.c | 6 ++-- src/bhyve/bhyve_driver.c | 6 ++-- src/conf/domain_conf.c | 60 ++++++++++++++++++++++++++++------------ src/conf/domain_conf.h | 40 +++++++++++++++++++-------- src/conf/snapshot_conf.c | 2 +- src/conf/virdomainobjlist.c | 2 +- src/esx/esx_driver.c | 4 +-- src/libxl/libxl_domain.c | 12 ++++---- src/libxl/libxl_driver.c | 6 ++-- src/libxl/libxl_migration.c | 3 ++ src/lxc/lxc_domain.c | 6 ++-- src/lxc/lxc_driver.c | 4 +-- src/lxc/lxc_native.c | 2 +- src/openvz/openvz_driver.c | 11 +++++--- src/phyp/phyp_driver.c | 7 +++-- src/qemu/qemu_domain.c | 54 +++++++++++++++++++++++------------- src/qemu/qemu_driver.c | 23 +++++++-------- src/qemu/qemu_migration.c | 8 +++--- src/qemu/qemu_parse_command.c | 2 +- src/security/virt-aa-helper.c | 2 +- src/test/test_driver.c | 13 +++++---- src/uml/uml_driver.c | 10 ++++--- src/vbox/vbox_common.c | 8 ++++-- src/vmware/vmware_driver.c | 10 ++++--- src/vmx/vmx.c | 8 ++++-- src/vz/vz_driver.c | 9 ++++-- src/xen/xen_driver.c | 11 +++++--- src/xen/xm_internal.c | 1 + src/xenapi/xenapi_driver.c | 8 ++++-- src/xenconfig/xen_sxpr.c | 2 +- src/xenconfig/xen_xl.c | 2 +- src/xenconfig/xen_xm.c | 2 +- tests/bhyvexml2argvtest.c | 2 +- tests/domainconftest.c | 2 +- tests/qemuagenttest.c | 2 +- tests/qemuhotplugtest.c | 1 + tests/qemuxml2argvtest.c | 2 +- tests/securityselinuxlabeltest.c | 2 +- tests/testutils.c | 2 +- tests/xlconfigtest.c | 4 +-- tests/xmconfigtest.c | 2 +- tests/xml2sexprtest.c | 2 +- tests/xml2vmxtest.c | 2 +- 43 files changed, 231 insertions(+), 136 deletions(-) -- 2.8.4

Some callers might want to pass yet another pointer to opaque data to post parse callbacks. The driver generic one is not enough because two threads executing post parse callback might want see different data (e.g. domain object pointer that domain def belongs to). Signed-off-by: Michal Privoznik <mprivozn@redhat.com> --- src/bhyve/bhyve_domain.c | 3 ++- src/conf/domain_conf.c | 8 +++++--- src/conf/domain_conf.h | 18 +++++++++++------- src/libxl/libxl_domain.c | 3 ++- src/lxc/lxc_domain.c | 3 ++- src/lxc/lxc_native.c | 2 +- src/openvz/openvz_driver.c | 3 ++- src/phyp/phyp_driver.c | 3 ++- src/qemu/qemu_domain.c | 3 ++- src/qemu/qemu_driver.c | 6 +++--- src/qemu/qemu_parse_command.c | 2 +- src/uml/uml_driver.c | 3 ++- src/vbox/vbox_common.c | 3 ++- src/vmware/vmware_driver.c | 3 ++- src/vmx/vmx.c | 5 +++-- src/vz/vz_driver.c | 3 ++- src/xen/xen_driver.c | 3 ++- src/xenapi/xenapi_driver.c | 3 ++- src/xenconfig/xen_sxpr.c | 2 +- src/xenconfig/xen_xl.c | 2 +- src/xenconfig/xen_xm.c | 2 +- 21 files changed, 51 insertions(+), 32 deletions(-) diff --git a/src/bhyve/bhyve_domain.c b/src/bhyve/bhyve_domain.c index 89cb171..3273462 100644 --- a/src/bhyve/bhyve_domain.c +++ b/src/bhyve/bhyve_domain.c @@ -61,7 +61,8 @@ static int bhyveDomainDefPostParse(virDomainDefPtr def, virCapsPtr caps ATTRIBUTE_UNUSED, unsigned int parseFlags ATTRIBUTE_UNUSED, - void *opaque ATTRIBUTE_UNUSED) + void *opaque ATTRIBUTE_UNUSED, + void *parseOpaque ATTRIBUTE_UNUSED) { /* Add an implicit PCI root controller */ if (virDomainDefMaybeAddController(def, VIR_DOMAIN_CONTROLLER_TYPE_PCI, 0, diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index dd34cec..c8cb68f 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -4562,7 +4562,8 @@ int virDomainDefPostParse(virDomainDefPtr def, virCapsPtr caps, unsigned int parseFlags, - virDomainXMLOptionPtr xmlopt) + virDomainXMLOptionPtr xmlopt, + void *parseOpaque) { int ret; struct virDomainDefPostParseDeviceIteratorData data = { @@ -4579,7 +4580,8 @@ virDomainDefPostParse(virDomainDefPtr def, /* call the domain config callback */ if (xmlopt->config.domainPostParseCallback) { ret = xmlopt->config.domainPostParseCallback(def, caps, parseFlags, - xmlopt->config.priv); + xmlopt->config.priv, + parseOpaque); if (ret < 0) return ret; } @@ -17626,7 +17628,7 @@ virDomainDefParseXML(xmlDocPtr xml, goto error; /* callback to fill driver specific domain aspects */ - if (virDomainDefPostParse(def, caps, flags, xmlopt) < 0) + if (virDomainDefPostParse(def, caps, flags, xmlopt, NULL) < 0) goto error; /* valdiate configuration */ diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index ce90c27..c61b364 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -2361,11 +2361,15 @@ typedef struct _virDomainXMLOption virDomainXMLOption; typedef virDomainXMLOption *virDomainXMLOptionPtr; /* Called once after everything else has been parsed, for adjusting - * overall domain defaults. */ + * overall domain defaults. + * @parseOpaque is opaque data passed by virDomainDefParse* caller, + * @opqaue is opaque data set by driver (usually pointer to driver + * private data). */ typedef int (*virDomainDefPostParseCallback)(virDomainDefPtr def, virCapsPtr caps, unsigned int parseFlags, - void *opaque); + void *opaque, + void *parseOpaque); /* Called once per device, for adjusting per-device settings while * leaving the overall domain otherwise unchanged. */ typedef int (*virDomainDeviceDefPostParseCallback)(virDomainDeviceDefPtr dev, @@ -2447,11 +2451,11 @@ virDomainXMLNamespacePtr virDomainXMLOptionGetNamespace(virDomainXMLOptionPtr xmlopt) ATTRIBUTE_NONNULL(1); -int -virDomainDefPostParse(virDomainDefPtr def, - virCapsPtr caps, - unsigned int parseFlags, - virDomainXMLOptionPtr xmlopt); +int virDomainDefPostParse(virDomainDefPtr def, + virCapsPtr caps, + unsigned int parseFlags, + virDomainXMLOptionPtr xmlopt, + void *parseOpaque); int virDomainDefValidate(virDomainDefPtr def, virCapsPtr caps, diff --git a/src/libxl/libxl_domain.c b/src/libxl/libxl_domain.c index 43f4a7f..a53b977 100644 --- a/src/libxl/libxl_domain.c +++ b/src/libxl/libxl_domain.c @@ -380,7 +380,8 @@ static int libxlDomainDefPostParse(virDomainDefPtr def, virCapsPtr caps ATTRIBUTE_UNUSED, unsigned int parseFlags ATTRIBUTE_UNUSED, - void *opaque ATTRIBUTE_UNUSED) + void *opaque ATTRIBUTE_UNUSED, + void *parseOpaque ATTRIBUTE_UNUSED) { /* Xen PV domains always have a PV console, so add one to the domain config * via post-parse callback if not explicitly specified in the XML. */ diff --git a/src/lxc/lxc_domain.c b/src/lxc/lxc_domain.c index 60db229..c2e362a 100644 --- a/src/lxc/lxc_domain.c +++ b/src/lxc/lxc_domain.c @@ -364,7 +364,8 @@ static int virLXCDomainDefPostParse(virDomainDefPtr def, virCapsPtr caps, unsigned int parseFlags ATTRIBUTE_UNUSED, - void *opaque ATTRIBUTE_UNUSED) + void *opaque ATTRIBUTE_UNUSED, + void *parseOpaque ATTRIBUTE_UNUSED) { /* check for emulator and create a default one if needed */ if (!def->emulator && diff --git a/src/lxc/lxc_native.c b/src/lxc/lxc_native.c index 94fb659..76b7922 100644 --- a/src/lxc/lxc_native.c +++ b/src/lxc/lxc_native.c @@ -1095,7 +1095,7 @@ lxcParseConfigString(const char *config, lxcSetCapDrop(vmdef, properties); if (virDomainDefPostParse(vmdef, caps, VIR_DOMAIN_DEF_PARSE_ABI_UPDATE, - xmlopt) < 0) + xmlopt, NULL) < 0) goto cleanup; goto cleanup; diff --git a/src/openvz/openvz_driver.c b/src/openvz/openvz_driver.c index 6c3edc9..e1c008c 100644 --- a/src/openvz/openvz_driver.c +++ b/src/openvz/openvz_driver.c @@ -92,7 +92,8 @@ static int openvzDomainDefPostParse(virDomainDefPtr def, virCapsPtr caps ATTRIBUTE_UNUSED, unsigned int parseFlags ATTRIBUTE_UNUSED, - void *opaque ATTRIBUTE_UNUSED) + void *opaque ATTRIBUTE_UNUSED, + void *parseOpaque ATTRIBUTE_UNUSED) { /* fill the init path */ if (def->os.type == VIR_DOMAIN_OSTYPE_EXE && !def->os.init) { diff --git a/src/phyp/phyp_driver.c b/src/phyp/phyp_driver.c index 3dd8927..2c1a854 100644 --- a/src/phyp/phyp_driver.c +++ b/src/phyp/phyp_driver.c @@ -1097,7 +1097,8 @@ static int phypDomainDefPostParse(virDomainDefPtr def ATTRIBUTE_UNUSED, virCapsPtr caps ATTRIBUTE_UNUSED, unsigned int parseFlags ATTRIBUTE_UNUSED, - void *opaque ATTRIBUTE_UNUSED) + void *opaque ATTRIBUTE_UNUSED, + void *parseOpaque ATTRIBUTE_UNUSED) { return 0; } diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index 1fbad91..b33e018 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -2326,7 +2326,8 @@ static int qemuDomainDefPostParse(virDomainDefPtr def, virCapsPtr caps, unsigned int parseFlags, - void *opaque) + void *opaque, + void *parseOpaque ATTRIBUTE_UNUSED) { virQEMUDriverPtr driver = opaque; virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver); diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index ee16cb5..50d62bb 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -7917,7 +7917,7 @@ qemuDomainAttachDeviceConfig(virDomainDefPtr vmdef, return -1; } - if (virDomainDefPostParse(vmdef, caps, parse_flags, xmlopt) < 0) + if (virDomainDefPostParse(vmdef, caps, parse_flags, xmlopt, NULL) < 0) return -1; return 0; @@ -8074,7 +8074,7 @@ qemuDomainDetachDeviceConfig(virDomainDefPtr vmdef, return -1; } - if (virDomainDefPostParse(vmdef, caps, parse_flags, xmlopt) < 0) + if (virDomainDefPostParse(vmdef, caps, parse_flags, xmlopt, NULL) < 0) return -1; return 0; @@ -8173,7 +8173,7 @@ qemuDomainUpdateDeviceConfig(virDomainDefPtr vmdef, return -1; } - if (virDomainDefPostParse(vmdef, caps, parse_flags, xmlopt) < 0) + if (virDomainDefPostParse(vmdef, caps, parse_flags, xmlopt, NULL) < 0) return -1; return 0; diff --git a/src/qemu/qemu_parse_command.c b/src/qemu/qemu_parse_command.c index e3a6a34..279f3da 100644 --- a/src/qemu/qemu_parse_command.c +++ b/src/qemu/qemu_parse_command.c @@ -2628,7 +2628,7 @@ qemuParseCommandLine(virCapsPtr caps, VIR_FREE(nics); - if (virDomainDefPostParse(def, caps, 0, xmlopt) < 0) + if (virDomainDefPostParse(def, caps, 0, xmlopt, NULL) < 0) goto error; if (cmd->num_args || cmd->num_env) { diff --git a/src/uml/uml_driver.c b/src/uml/uml_driver.c index 4f25f76..90d2eae 100644 --- a/src/uml/uml_driver.c +++ b/src/uml/uml_driver.c @@ -435,7 +435,8 @@ static int umlDomainDefPostParse(virDomainDefPtr def ATTRIBUTE_UNUSED, virCapsPtr caps ATTRIBUTE_UNUSED, unsigned int parseFlags ATTRIBUTE_UNUSED, - void *opaque ATTRIBUTE_UNUSED) + void *opaque ATTRIBUTE_UNUSED, + void *parseOpaque ATTRIBUTE_UNUSED) { return 0; } diff --git a/src/vbox/vbox_common.c b/src/vbox/vbox_common.c index 3624a5e..dfade01 100644 --- a/src/vbox/vbox_common.c +++ b/src/vbox/vbox_common.c @@ -255,7 +255,8 @@ static int vboxDomainDefPostParse(virDomainDefPtr def ATTRIBUTE_UNUSED, virCapsPtr caps ATTRIBUTE_UNUSED, unsigned int parseFlags ATTRIBUTE_UNUSED, - void *opaque ATTRIBUTE_UNUSED) + void *opaque ATTRIBUTE_UNUSED, + void *parseOpaque ATTRIBUTE_UNUSED) { return 0; } diff --git a/src/vmware/vmware_driver.c b/src/vmware/vmware_driver.c index eea2d1b..d44b8a3 100644 --- a/src/vmware/vmware_driver.c +++ b/src/vmware/vmware_driver.c @@ -86,7 +86,8 @@ static int vmwareDomainDefPostParse(virDomainDefPtr def ATTRIBUTE_UNUSED, virCapsPtr caps ATTRIBUTE_UNUSED, unsigned int parseFlags ATTRIBUTE_UNUSED, - void *opaque ATTRIBUTE_UNUSED) + void *opaque ATTRIBUTE_UNUSED, + void *parseOpaque ATTRIBUTE_UNUSED) { return 0; } diff --git a/src/vmx/vmx.c b/src/vmx/vmx.c index 4a08b0f..3ae4b73 100644 --- a/src/vmx/vmx.c +++ b/src/vmx/vmx.c @@ -528,7 +528,8 @@ static int virVMXDomainDefPostParse(virDomainDefPtr def ATTRIBUTE_UNUSED, virCapsPtr caps ATTRIBUTE_UNUSED, unsigned int parseFlags ATTRIBUTE_UNUSED, - void *opaque ATTRIBUTE_UNUSED) + void *opaque ATTRIBUTE_UNUSED, + void *parseOpaque ATTRIBUTE_UNUSED) { return 0; } @@ -1817,7 +1818,7 @@ virVMXParseConfig(virVMXContext *ctx, } if (virDomainDefPostParse(def, caps, VIR_DOMAIN_DEF_PARSE_ABI_UPDATE, - xmlopt) < 0) + xmlopt, NULL) < 0) goto cleanup; success = true; diff --git a/src/vz/vz_driver.c b/src/vz/vz_driver.c index 819dad7..2f2be122 100644 --- a/src/vz/vz_driver.c +++ b/src/vz/vz_driver.c @@ -263,7 +263,8 @@ static int vzDomainDefPostParse(virDomainDefPtr def, virCapsPtr caps ATTRIBUTE_UNUSED, unsigned int parseFlags ATTRIBUTE_UNUSED, - void *opaque ATTRIBUTE_UNUSED) + void *opaque ATTRIBUTE_UNUSED, + void *parseOpaque ATTRIBUTE_UNUSED) { if (vzDomainDefAddDefaultInputDevices(def) < 0) return -1; diff --git a/src/xen/xen_driver.c b/src/xen/xen_driver.c index 2bab61e..5c38bdf 100644 --- a/src/xen/xen_driver.c +++ b/src/xen/xen_driver.c @@ -370,7 +370,8 @@ static int xenDomainDefPostParse(virDomainDefPtr def, virCapsPtr caps ATTRIBUTE_UNUSED, unsigned int parseFlags ATTRIBUTE_UNUSED, - void *opaque ATTRIBUTE_UNUSED) + void *opaque ATTRIBUTE_UNUSED, + void *parseOpaque ATTRIBUTE_UNUSED) { if (!def->memballoon) { virDomainMemballoonDefPtr memballoon; diff --git a/src/xenapi/xenapi_driver.c b/src/xenapi/xenapi_driver.c index 9a861c1..a58c10e 100644 --- a/src/xenapi/xenapi_driver.c +++ b/src/xenapi/xenapi_driver.c @@ -75,7 +75,8 @@ static int xenapiDomainDefPostParse(virDomainDefPtr def, virCapsPtr caps ATTRIBUTE_UNUSED, unsigned int parseFlags ATTRIBUTE_UNUSED, - void *opaque ATTRIBUTE_UNUSED) + void *opaque ATTRIBUTE_UNUSED, + void *parseOpaque ATTRIBUTE_UNUSED) { /* add implicit input device */ if (xenDomainDefAddImplicitInputDevice(def) < 0) diff --git a/src/xenconfig/xen_sxpr.c b/src/xenconfig/xen_sxpr.c index 40dc53c..0b04fc8 100644 --- a/src/xenconfig/xen_sxpr.c +++ b/src/xenconfig/xen_sxpr.c @@ -1458,7 +1458,7 @@ xenParseSxpr(const struct sexpr *root, } if (virDomainDefPostParse(def, caps, VIR_DOMAIN_DEF_PARSE_ABI_UPDATE, - xmlopt) < 0) + xmlopt, NULL) < 0) goto error; return def; diff --git a/src/xenconfig/xen_xl.c b/src/xenconfig/xen_xl.c index 7774dfc..4615bfd 100644 --- a/src/xenconfig/xen_xl.c +++ b/src/xenconfig/xen_xl.c @@ -721,7 +721,7 @@ xenParseXL(virConfPtr conf, goto cleanup; if (virDomainDefPostParse(def, caps, VIR_DOMAIN_DEF_PARSE_ABI_UPDATE, - xmlopt) < 0) + xmlopt, NULL) < 0) goto cleanup; return def; diff --git a/src/xenconfig/xen_xm.c b/src/xenconfig/xen_xm.c index 124c94a..8ef68bb 100644 --- a/src/xenconfig/xen_xm.c +++ b/src/xenconfig/xen_xm.c @@ -461,7 +461,7 @@ xenParseXM(virConfPtr conf, goto cleanup; if (virDomainDefPostParse(def, caps, VIR_DOMAIN_DEF_PARSE_ABI_UPDATE, - xmlopt) < 0) + xmlopt, NULL) < 0) goto cleanup; return def; -- 2.8.4

On Fri, Sep 23, 2016 at 15:24:54 +0200, Michal Privoznik wrote:
Some callers might want to pass yet another pointer to opaque data to post parse callbacks. The driver generic one is not enough because two threads executing post parse callback might want see different data (e.g. domain object pointer that domain
s/want see/want to see/
def belongs to).
...
diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index ce90c27..c61b364 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -2361,11 +2361,15 @@ typedef struct _virDomainXMLOption virDomainXMLOption; typedef virDomainXMLOption *virDomainXMLOptionPtr;
/* Called once after everything else has been parsed, for adjusting - * overall domain defaults. */ + * overall domain defaults. + * @parseOpaque is opaque data passed by virDomainDefParse* caller, + * @opqaue is opaque data set by driver (usually pointer to driver
s/opqaue/opaque/ :) ... ACK Jirka

We want to by pass the proper opaque pointer instead of NULL to virDomainDefParseXML and subsequently virDomainDefPostParse too. Signed-off-by: Michal Privoznik <mprivozn@redhat.com> --- src/conf/domain_conf.c | 10 ++++++---- src/conf/domain_conf.h | 1 + src/conf/snapshot_conf.c | 2 +- src/qemu/qemu_migration.c | 2 +- src/test/test_driver.c | 2 +- 5 files changed, 10 insertions(+), 7 deletions(-) diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index c8cb68f..430457e 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -15977,6 +15977,7 @@ virDomainDefParseXML(xmlDocPtr xml, xmlXPathContextPtr ctxt, virCapsPtr caps, virDomainXMLOptionPtr xmlopt, + void *parseOpaque, unsigned int flags) { xmlNodePtr *nodes = NULL, node = NULL; @@ -17628,7 +17629,7 @@ virDomainDefParseXML(xmlDocPtr xml, goto error; /* callback to fill driver specific domain aspects */ - if (virDomainDefPostParse(def, caps, flags, xmlopt, NULL) < 0) + if (virDomainDefPostParse(def, caps, flags, xmlopt, parseOpaque) < 0) goto error; /* valdiate configuration */ @@ -17677,7 +17678,7 @@ virDomainObjParseXML(xmlDocPtr xml, oldnode = ctxt->node; ctxt->node = config; - obj->def = virDomainDefParseXML(xml, config, ctxt, caps, xmlopt, flags); + obj->def = virDomainDefParseXML(xml, config, ctxt, caps, xmlopt, NULL, flags); ctxt->node = oldnode; if (!obj->def) goto error; @@ -17758,7 +17759,7 @@ virDomainDefParse(const char *xmlStr, if ((xml = virXMLParse(filename, xmlStr, _("(domain_definition)")))) { def = virDomainDefParseNode(xml, xmlDocGetRootElement(xml), caps, - xmlopt, flags); + xmlopt, NULL, flags); xmlFreeDoc(xml); } @@ -17790,6 +17791,7 @@ virDomainDefParseNode(xmlDocPtr xml, xmlNodePtr root, virCapsPtr caps, virDomainXMLOptionPtr xmlopt, + void *parseOpaque, unsigned int flags) { xmlXPathContextPtr ctxt = NULL; @@ -17810,7 +17812,7 @@ virDomainDefParseNode(xmlDocPtr xml, } ctxt->node = root; - def = virDomainDefParseXML(xml, root, ctxt, caps, xmlopt, flags); + def = virDomainDefParseXML(xml, root, ctxt, caps, xmlopt, parseOpaque, flags); cleanup: xmlXPathFreeContext(ctxt); diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index c61b364..ed44bc4 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -2684,6 +2684,7 @@ virDomainDefPtr virDomainDefParseNode(xmlDocPtr doc, xmlNodePtr root, virCapsPtr caps, virDomainXMLOptionPtr xmlopt, + void *parseOpaque, unsigned int flags); virDomainObjPtr virDomainObjParseNode(xmlDocPtr xml, xmlNodePtr root, diff --git a/src/conf/snapshot_conf.c b/src/conf/snapshot_conf.c index c52c481..862c2ec 100644 --- a/src/conf/snapshot_conf.c +++ b/src/conf/snapshot_conf.c @@ -282,7 +282,7 @@ virDomainSnapshotDefParse(xmlXPathContextPtr ctxt, goto cleanup; } def->dom = virDomainDefParseNode(ctxt->node->doc, domainNode, - caps, xmlopt, domainflags); + caps, xmlopt, NULL, domainflags); if (!def->dom) goto cleanup; } else { diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c index 8a220d9..fc73534 100644 --- a/src/qemu/qemu_migration.c +++ b/src/qemu/qemu_migration.c @@ -1311,7 +1311,7 @@ qemuMigrationCookieXMLParse(qemuMigrationCookiePtr mig, goto error; } mig->persistent = virDomainDefParseNode(doc, nodes[0], - caps, driver->xmlopt, + caps, driver->xmlopt, NULL, VIR_DOMAIN_DEF_PARSE_INACTIVE | VIR_DOMAIN_DEF_PARSE_ABI_UPDATE | VIR_DOMAIN_DEF_PARSE_SKIP_VALIDATE); diff --git a/src/test/test_driver.c b/src/test/test_driver.c index 7ef3d2f..054bb2e 100644 --- a/src/test/test_driver.c +++ b/src/test/test_driver.c @@ -875,7 +875,7 @@ testParseDomains(testDriverPtr privconn, goto error; def = virDomainDefParseNode(ctxt->doc, node, - privconn->caps, privconn->xmlopt, + privconn->caps, privconn->xmlopt, NULL, VIR_DOMAIN_DEF_PARSE_INACTIVE); if (!def) goto error; -- 2.8.4

On Fri, Sep 23, 2016 at 15:24:55 +0200, Michal Privoznik wrote:
We want to by pass the proper opaque pointer instead of NULL to
s/by //
virDomainDefParseXML and subsequently virDomainDefPostParse too. ...
ACK Jirka

We want to by pass the proper opaque pointer instead of NULL to virDomainDefParse and subsequently virDomainDefParseNode too. Signed-off-by: Michal Privoznik <mprivozn@redhat.com> --- src/bhyve/bhyve_driver.c | 6 +++--- src/conf/domain_conf.c | 11 +++++++---- src/conf/domain_conf.h | 2 ++ src/conf/virdomainobjlist.c | 2 +- src/esx/esx_driver.c | 4 ++-- src/libxl/libxl_domain.c | 2 +- src/libxl/libxl_driver.c | 6 +++--- src/libxl/libxl_migration.c | 3 +++ src/lxc/lxc_driver.c | 4 ++-- src/openvz/openvz_driver.c | 5 +++-- src/phyp/phyp_driver.c | 1 + src/qemu/qemu_domain.c | 2 +- src/qemu/qemu_driver.c | 14 +++++++------- src/qemu/qemu_migration.c | 6 +++--- src/security/virt-aa-helper.c | 2 +- src/test/test_driver.c | 6 +++--- src/uml/uml_driver.c | 4 ++-- src/vbox/vbox_common.c | 2 +- src/vmware/vmware_driver.c | 4 ++-- src/vz/vz_driver.c | 3 ++- src/xen/xen_driver.c | 5 +++-- src/xenapi/xenapi_driver.c | 2 ++ tests/bhyvexml2argvtest.c | 2 +- tests/domainconftest.c | 2 +- tests/qemuagenttest.c | 2 +- tests/qemuhotplugtest.c | 1 + tests/qemuxml2argvtest.c | 2 +- tests/securityselinuxlabeltest.c | 2 +- tests/testutils.c | 2 +- tests/xlconfigtest.c | 4 ++-- tests/xmconfigtest.c | 2 +- tests/xml2sexprtest.c | 2 +- tests/xml2vmxtest.c | 2 +- 33 files changed, 67 insertions(+), 52 deletions(-) diff --git a/src/bhyve/bhyve_driver.c b/src/bhyve/bhyve_driver.c index 745e633..51b6301 100644 --- a/src/bhyve/bhyve_driver.c +++ b/src/bhyve/bhyve_driver.c @@ -538,7 +538,7 @@ bhyveDomainDefineXMLFlags(virConnectPtr conn, const char *xml, unsigned int flag return NULL; if ((def = virDomainDefParseString(xml, caps, privconn->xmlopt, - parse_flags)) == NULL) + NULL, parse_flags)) == NULL) goto cleanup; if (virDomainDefineXMLFlagsEnsureACL(conn, def) < 0) @@ -725,7 +725,7 @@ bhyveConnectDomainXMLToNative(virConnectPtr conn, goto cleanup; if (!(def = virDomainDefParseString(xmlData, caps, privconn->xmlopt, - VIR_DOMAIN_DEF_PARSE_INACTIVE))) + NULL, VIR_DOMAIN_DEF_PARSE_INACTIVE))) goto cleanup; if (bhyveDomainAssignAddresses(def, NULL) < 0) @@ -938,7 +938,7 @@ bhyveDomainCreateXML(virConnectPtr conn, return NULL; if ((def = virDomainDefParseString(xml, caps, privconn->xmlopt, - parse_flags)) == NULL) + NULL, parse_flags)) == NULL) goto cleanup; if (virDomainCreateXMLEnsureACL(conn, def) < 0) diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 430457e..6f5bf2e 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -17751,6 +17751,7 @@ virDomainDefParse(const char *xmlStr, const char *filename, virCapsPtr caps, virDomainXMLOptionPtr xmlopt, + void *parseOpaque, unsigned int flags) { xmlDocPtr xml; @@ -17759,7 +17760,7 @@ virDomainDefParse(const char *xmlStr, if ((xml = virXMLParse(filename, xmlStr, _("(domain_definition)")))) { def = virDomainDefParseNode(xml, xmlDocGetRootElement(xml), caps, - xmlopt, NULL, flags); + xmlopt, parseOpaque, flags); xmlFreeDoc(xml); } @@ -17771,18 +17772,20 @@ virDomainDefPtr virDomainDefParseString(const char *xmlStr, virCapsPtr caps, virDomainXMLOptionPtr xmlopt, + void *parseOpaque, unsigned int flags) { - return virDomainDefParse(xmlStr, NULL, caps, xmlopt, flags); + return virDomainDefParse(xmlStr, NULL, caps, xmlopt, parseOpaque, flags); } virDomainDefPtr virDomainDefParseFile(const char *filename, virCapsPtr caps, virDomainXMLOptionPtr xmlopt, + void *parseOpaque, unsigned int flags) { - return virDomainDefParse(NULL, filename, caps, xmlopt, flags); + return virDomainDefParse(NULL, filename, caps, xmlopt, parseOpaque, flags); } @@ -24673,7 +24676,7 @@ virDomainDefCopy(virDomainDefPtr src, if (!(xml = virDomainDefFormat(src, caps, format_flags))) return NULL; - ret = virDomainDefParseString(xml, caps, xmlopt, parse_flags); + ret = virDomainDefParseString(xml, caps, xmlopt, NULL, parse_flags); VIR_FREE(xml); return ret; diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index ed44bc4..30ab1a5 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -2675,10 +2675,12 @@ virStorageSourcePtr virDomainDiskDefSourceParse(const char *xmlStr, virDomainDefPtr virDomainDefParseString(const char *xmlStr, virCapsPtr caps, virDomainXMLOptionPtr xmlopt, + void *parseOpaque, unsigned int flags); virDomainDefPtr virDomainDefParseFile(const char *filename, virCapsPtr caps, virDomainXMLOptionPtr xmlopt, + void *parseOpaque, unsigned int flags); virDomainDefPtr virDomainDefParseNode(xmlDocPtr doc, xmlNodePtr root, diff --git a/src/conf/virdomainobjlist.c b/src/conf/virdomainobjlist.c index 41c9910..8d425d6 100644 --- a/src/conf/virdomainobjlist.c +++ b/src/conf/virdomainobjlist.c @@ -462,7 +462,7 @@ virDomainObjListLoadConfig(virDomainObjListPtr doms, if ((configFile = virDomainConfigFile(configDir, name)) == NULL) goto error; - if (!(def = virDomainDefParseFile(configFile, caps, xmlopt, + if (!(def = virDomainDefParseFile(configFile, caps, xmlopt, NULL, VIR_DOMAIN_DEF_PARSE_INACTIVE | VIR_DOMAIN_DEF_PARSE_SKIP_OSTYPE_CHECKS | VIR_DOMAIN_DEF_PARSE_SKIP_VALIDATE))) diff --git a/src/esx/esx_driver.c b/src/esx/esx_driver.c index 5ce98b3..17ef00f 100644 --- a/src/esx/esx_driver.c +++ b/src/esx/esx_driver.c @@ -2831,7 +2831,7 @@ esxConnectDomainXMLToNative(virConnectPtr conn, const char *nativeFormat, return NULL; def = virDomainDefParseString(domainXml, priv->caps, priv->xmlopt, - VIR_DOMAIN_DEF_PARSE_INACTIVE); + NULL, VIR_DOMAIN_DEF_PARSE_INACTIVE); if (!def) return NULL; @@ -3046,7 +3046,7 @@ esxDomainDefineXMLFlags(virConnectPtr conn, const char *xml, unsigned int flags) /* Parse domain XML */ def = virDomainDefParseString(xml, priv->caps, priv->xmlopt, - parse_flags); + NULL, parse_flags); if (!def) return NULL; diff --git a/src/libxl/libxl_domain.c b/src/libxl/libxl_domain.c index a53b977..50385fd 100644 --- a/src/libxl/libxl_domain.c +++ b/src/libxl/libxl_domain.c @@ -677,7 +677,7 @@ libxlDomainSaveImageOpen(libxlDriverPrivatePtr driver, goto error; } - if (!(def = virDomainDefParseString(xml, cfg->caps, driver->xmlopt, + if (!(def = virDomainDefParseString(xml, cfg->caps, driver->xmlopt, NULL, VIR_DOMAIN_DEF_PARSE_INACTIVE | VIR_DOMAIN_DEF_PARSE_SKIP_VALIDATE))) goto error; diff --git a/src/libxl/libxl_driver.c b/src/libxl/libxl_driver.c index 42fa129..54eee55 100644 --- a/src/libxl/libxl_driver.c +++ b/src/libxl/libxl_driver.c @@ -1027,7 +1027,7 @@ libxlDomainCreateXML(virConnectPtr conn, const char *xml, parse_flags |= VIR_DOMAIN_DEF_PARSE_VALIDATE_SCHEMA; if (!(def = virDomainDefParseString(xml, cfg->caps, driver->xmlopt, - parse_flags))) + NULL, parse_flags))) goto cleanup; if (virDomainCreateXMLEnsureACL(conn, def) < 0) @@ -2655,7 +2655,7 @@ libxlConnectDomainXMLToNative(virConnectPtr conn, const char * nativeFormat, goto cleanup; if (!(def = virDomainDefParseString(domainXml, - cfg->caps, driver->xmlopt, + cfg->caps, driver->xmlopt, NULL, VIR_DOMAIN_DEF_PARSE_INACTIVE))) goto cleanup; @@ -2781,7 +2781,7 @@ libxlDomainDefineXMLFlags(virConnectPtr conn, const char *xml, unsigned int flag parse_flags |= VIR_DOMAIN_DEF_PARSE_VALIDATE_SCHEMA; if (!(def = virDomainDefParseString(xml, cfg->caps, driver->xmlopt, - parse_flags))) + NULL, parse_flags))) goto cleanup; if (virDomainDefineXMLFlagsEnsureACL(conn, def) < 0) diff --git a/src/libxl/libxl_migration.c b/src/libxl/libxl_migration.c index 3b0dc74..534abb8 100644 --- a/src/libxl/libxl_migration.c +++ b/src/libxl/libxl_migration.c @@ -419,6 +419,7 @@ libxlDomainMigrationBegin(virConnectPtr conn, if (xmlin) { if (!(tmpdef = virDomainDefParseString(xmlin, cfg->caps, driver->xmlopt, + NULL, VIR_DOMAIN_DEF_PARSE_INACTIVE | VIR_DOMAIN_DEF_PARSE_SKIP_VALIDATE))) goto endjob; @@ -463,6 +464,7 @@ libxlDomainMigrationPrepareDef(libxlDriverPrivatePtr driver, } if (!(def = virDomainDefParseString(dom_xml, cfg->caps, driver->xmlopt, + NULL, VIR_DOMAIN_DEF_PARSE_INACTIVE | VIR_DOMAIN_DEF_PARSE_SKIP_VALIDATE))) goto cleanup; @@ -544,6 +546,7 @@ libxlDomainMigrationPrepare(virConnectPtr dconn, VIR_DEBUG("Using hook-filtered domain XML: %s", xmlout); newdef = virDomainDefParseString(xmlout, cfg->caps, driver->xmlopt, + NULL, VIR_DOMAIN_DEF_PARSE_INACTIVE | VIR_DOMAIN_DEF_PARSE_SKIP_VALIDATE); if (!newdef) diff --git a/src/lxc/lxc_driver.c b/src/lxc/lxc_driver.c index 24025d1..a9e664c 100644 --- a/src/lxc/lxc_driver.c +++ b/src/lxc/lxc_driver.c @@ -472,7 +472,7 @@ lxcDomainDefineXMLFlags(virConnectPtr conn, const char *xml, unsigned int flags) goto cleanup; if (!(def = virDomainDefParseString(xml, caps, driver->xmlopt, - parse_flags))) + NULL, parse_flags))) goto cleanup; if (virDomainDefineXMLFlagsEnsureACL(conn, def) < 0) @@ -1225,7 +1225,7 @@ lxcDomainCreateXMLWithFiles(virConnectPtr conn, goto cleanup; if (!(def = virDomainDefParseString(xml, caps, driver->xmlopt, - parse_flags))) + NULL, parse_flags))) goto cleanup; if (virDomainCreateXMLWithFilesEnsureACL(conn, def) < 0) diff --git a/src/openvz/openvz_driver.c b/src/openvz/openvz_driver.c index e1c008c..376c741 100644 --- a/src/openvz/openvz_driver.c +++ b/src/openvz/openvz_driver.c @@ -996,7 +996,7 @@ openvzDomainDefineXMLFlags(virConnectPtr conn, const char *xml, unsigned int fla openvzDriverLock(driver); if ((vmdef = virDomainDefParseString(xml, driver->caps, driver->xmlopt, - parse_flags)) == NULL) + NULL, parse_flags)) == NULL) goto cleanup; if (!(vm = virDomainObjListAdd(driver->domains, vmdef, @@ -1086,7 +1086,7 @@ openvzDomainCreateXML(virConnectPtr conn, const char *xml, openvzDriverLock(driver); if ((vmdef = virDomainDefParseString(xml, driver->caps, driver->xmlopt, - parse_flags)) == NULL) + NULL, parse_flags)) == NULL) goto cleanup; if (!(vm = virDomainObjListAdd(driver->domains, @@ -2317,6 +2317,7 @@ openvzDomainMigratePrepare3Params(virConnectPtr dconn, } if (!(def = virDomainDefParseString(dom_xml, driver->caps, driver->xmlopt, + NULL, VIR_DOMAIN_DEF_PARSE_INACTIVE | VIR_DOMAIN_DEF_PARSE_SKIP_VALIDATE))) goto error; diff --git a/src/phyp/phyp_driver.c b/src/phyp/phyp_driver.c index 2c1a854..b62a2c4 100644 --- a/src/phyp/phyp_driver.c +++ b/src/phyp/phyp_driver.c @@ -3576,6 +3576,7 @@ phypDomainCreateXML(virConnectPtr conn, if (!(def = virDomainDefParseString(xml, phyp_driver->caps, phyp_driver->xmlopt, + NULL, parse_flags))) goto err; diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index b33e018..9f67eaf 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -3364,7 +3364,7 @@ qemuDomainDefCopy(virQEMUDriverPtr driver, if (!(caps = virQEMUDriverGetCapabilities(driver, false))) goto cleanup; - if (!(ret = virDomainDefParseString(xml, caps, driver->xmlopt, + if (!(ret = virDomainDefParseString(xml, caps, driver->xmlopt, NULL, VIR_DOMAIN_DEF_PARSE_INACTIVE | VIR_DOMAIN_DEF_PARSE_SKIP_VALIDATE))) goto cleanup; diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 50d62bb..4ed12bb 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -1751,7 +1751,7 @@ static virDomainPtr qemuDomainCreateXML(virConnectPtr conn, goto cleanup; if (!(def = virDomainDefParseString(xml, caps, driver->xmlopt, - parse_flags))) + NULL, parse_flags))) goto cleanup; if (virDomainCreateXMLEnsureACL(conn, def) < 0) @@ -3192,7 +3192,7 @@ qemuDomainSaveInternal(virQEMUDriverPtr driver, virDomainPtr dom, if (xmlin) { virDomainDefPtr def = NULL; - if (!(def = virDomainDefParseString(xmlin, caps, driver->xmlopt, + if (!(def = virDomainDefParseString(xmlin, caps, driver->xmlopt, NULL, VIR_DOMAIN_DEF_PARSE_INACTIVE | VIR_DOMAIN_DEF_PARSE_SKIP_VALIDATE))) { goto endjob; @@ -6303,7 +6303,7 @@ qemuDomainSaveImageUpdateDef(virQEMUDriverPtr driver, if (!(caps = virQEMUDriverGetCapabilities(driver, false))) goto cleanup; - if (!(newdef = virDomainDefParseString(newxml, caps, driver->xmlopt, + if (!(newdef = virDomainDefParseString(newxml, caps, driver->xmlopt, NULL, VIR_DOMAIN_DEF_PARSE_INACTIVE))) goto cleanup; @@ -6459,7 +6459,7 @@ qemuDomainSaveImageOpen(virQEMUDriverPtr driver, } /* Create a domain from this XML */ - if (!(def = virDomainDefParseString(xml, caps, driver->xmlopt, + if (!(def = virDomainDefParseString(xml, caps, driver->xmlopt, NULL, VIR_DOMAIN_DEF_PARSE_INACTIVE | VIR_DOMAIN_DEF_PARSE_SKIP_VALIDATE))) goto error; @@ -7011,7 +7011,7 @@ static char *qemuConnectDomainXMLToNative(virConnectPtr conn, if (!(vm = virDomainObjNew(driver->xmlopt))) goto cleanup; - if (!(vm->def = virDomainDefParseString(xmlData, caps, driver->xmlopt, + if (!(vm->def = virDomainDefParseString(xmlData, caps, driver->xmlopt, NULL, VIR_DOMAIN_DEF_PARSE_INACTIVE | VIR_DOMAIN_DEF_PARSE_ABI_UPDATE))) goto cleanup; @@ -7249,7 +7249,7 @@ qemuDomainDefineXMLFlags(virConnectPtr conn, goto cleanup; if (!(def = virDomainDefParseString(xml, caps, driver->xmlopt, - parse_flags))) + NULL, parse_flags))) goto cleanup; if (virDomainDefineXMLFlagsEnsureACL(conn, def) < 0) @@ -14603,7 +14603,7 @@ qemuDomainSnapshotCreateXML(virDomainPtr domain, /* Easiest way to clone inactive portion of vm->def is via * conversion in and back out of xml. */ if (!(xml = qemuDomainDefFormatLive(driver, vm->def, true, true)) || - !(def->dom = virDomainDefParseString(xml, caps, driver->xmlopt, + !(def->dom = virDomainDefParseString(xml, caps, driver->xmlopt, NULL, VIR_DOMAIN_DEF_PARSE_INACTIVE | VIR_DOMAIN_DEF_PARSE_SKIP_VALIDATE))) goto endjob; diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c index fc73534..df48eab 100644 --- a/src/qemu/qemu_migration.c +++ b/src/qemu/qemu_migration.c @@ -3242,7 +3242,7 @@ qemuMigrationBeginPhase(virQEMUDriverPtr driver, } if (xmlin) { - if (!(def = virDomainDefParseString(xmlin, caps, driver->xmlopt, + if (!(def = virDomainDefParseString(xmlin, caps, driver->xmlopt, NULL, VIR_DOMAIN_DEF_PARSE_INACTIVE | VIR_DOMAIN_DEF_PARSE_SKIP_VALIDATE))) goto cleanup; @@ -3664,7 +3664,7 @@ qemuMigrationPrepareAny(virQEMUDriverPtr driver, virDomainDefPtr newdef; VIR_DEBUG("Using hook-filtered domain XML: %s", xmlout); - newdef = virDomainDefParseString(xmlout, caps, driver->xmlopt, + newdef = virDomainDefParseString(xmlout, caps, driver->xmlopt, NULL, VIR_DOMAIN_DEF_PARSE_INACTIVE | VIR_DOMAIN_DEF_PARSE_SKIP_VALIDATE); if (!newdef) @@ -4144,7 +4144,7 @@ qemuMigrationPrepareDef(virQEMUDriverPtr driver, if (!(caps = virQEMUDriverGetCapabilities(driver, false))) return NULL; - if (!(def = virDomainDefParseString(dom_xml, caps, driver->xmlopt, + if (!(def = virDomainDefParseString(dom_xml, caps, driver->xmlopt, NULL, VIR_DOMAIN_DEF_PARSE_INACTIVE | VIR_DOMAIN_DEF_PARSE_SKIP_VALIDATE))) goto cleanup; diff --git a/src/security/virt-aa-helper.c b/src/security/virt-aa-helper.c index fc01076..28ee5ac 100644 --- a/src/security/virt-aa-helper.c +++ b/src/security/virt-aa-helper.c @@ -704,7 +704,7 @@ get_definition(vahControl * ctl, const char *xmlStr) } ctl->def = virDomainDefParseString(xmlStr, - ctl->caps, ctl->xmlopt, + ctl->caps, ctl->xmlopt, NULL, VIR_DOMAIN_DEF_PARSE_SKIP_VALIDATE); if (ctl->def == NULL) { diff --git a/src/test/test_driver.c b/src/test/test_driver.c index 054bb2e..bf5c1b0 100644 --- a/src/test/test_driver.c +++ b/src/test/test_driver.c @@ -1609,7 +1609,7 @@ testDomainCreateXML(virConnectPtr conn, const char *xml, testDriverLock(privconn); if ((def = virDomainDefParseString(xml, privconn->caps, privconn->xmlopt, - parse_flags)) == NULL) + NULL, parse_flags)) == NULL) goto cleanup; if (testDomainGenerateIfnames(def) < 0) @@ -2118,7 +2118,7 @@ testDomainRestoreFlags(virConnectPtr conn, xml[len] = '\0'; def = virDomainDefParseString(xml, privconn->caps, privconn->xmlopt, - VIR_DOMAIN_DEF_PARSE_INACTIVE); + NULL, VIR_DOMAIN_DEF_PARSE_INACTIVE); if (!def) goto cleanup; @@ -2615,7 +2615,7 @@ static virDomainPtr testDomainDefineXMLFlags(virConnectPtr conn, parse_flags |= VIR_DOMAIN_DEF_PARSE_VALIDATE_SCHEMA; if ((def = virDomainDefParseString(xml, privconn->caps, privconn->xmlopt, - parse_flags)) == NULL) + NULL, parse_flags)) == NULL) goto cleanup; if (testDomainGenerateIfnames(def) < 0) diff --git a/src/uml/uml_driver.c b/src/uml/uml_driver.c index 90d2eae..7c0ebba 100644 --- a/src/uml/uml_driver.c +++ b/src/uml/uml_driver.c @@ -1589,7 +1589,7 @@ static virDomainPtr umlDomainCreateXML(virConnectPtr conn, const char *xml, virNWFilterReadLockFilterUpdates(); umlDriverLock(driver); if (!(def = virDomainDefParseString(xml, driver->caps, driver->xmlopt, - parse_flags))) + NULL, parse_flags))) goto cleanup; if (virDomainCreateXMLEnsureACL(conn, def) < 0) @@ -2070,7 +2070,7 @@ umlDomainDefineXMLFlags(virConnectPtr conn, const char *xml, unsigned int flags) umlDriverLock(driver); if (!(def = virDomainDefParseString(xml, driver->caps, driver->xmlopt, - parse_flags))) + NULL, parse_flags))) goto cleanup; if (virDomainDefineXMLFlagsEnsureACL(conn, def) < 0) diff --git a/src/vbox/vbox_common.c b/src/vbox/vbox_common.c index dfade01..b46be4b 100644 --- a/src/vbox/vbox_common.c +++ b/src/vbox/vbox_common.c @@ -1874,7 +1874,7 @@ vboxDomainDefineXMLFlags(virConnectPtr conn, const char *xml, unsigned int flags VBOX_IID_INITIALIZE(&mchiid); if (!(def = virDomainDefParseString(xml, data->caps, data->xmlopt, - parse_flags))) { + NULL, parse_flags))) { goto cleanup; } diff --git a/src/vmware/vmware_driver.c b/src/vmware/vmware_driver.c index d44b8a3..b0cc47b 100644 --- a/src/vmware/vmware_driver.c +++ b/src/vmware/vmware_driver.c @@ -388,7 +388,7 @@ vmwareDomainDefineXMLFlags(virConnectPtr conn, const char *xml, unsigned int fla vmwareDriverLock(driver); if ((vmdef = virDomainDefParseString(xml, driver->caps, driver->xmlopt, - parse_flags)) == NULL) + NULL, parse_flags)) == NULL) goto cleanup; /* generate vmx file */ @@ -682,7 +682,7 @@ vmwareDomainCreateXML(virConnectPtr conn, const char *xml, vmwareDriverLock(driver); if ((vmdef = virDomainDefParseString(xml, driver->caps, driver->xmlopt, - parse_flags)) == NULL) + NULL, parse_flags)) == NULL) goto cleanup; /* generate vmx file */ diff --git a/src/vz/vz_driver.c b/src/vz/vz_driver.c index 2f2be122..f3f5eac 100644 --- a/src/vz/vz_driver.c +++ b/src/vz/vz_driver.c @@ -850,7 +850,7 @@ vzDomainDefineXMLFlags(virConnectPtr conn, const char *xml, unsigned int flags) parse_flags |= VIR_DOMAIN_DEF_PARSE_VALIDATE_SCHEMA; if ((def = virDomainDefParseString(xml, driver->caps, driver->xmlopt, - parse_flags)) == NULL) + NULL, parse_flags)) == NULL) goto cleanup; if (virDomainDefineXMLFlagsEnsureACL(conn, def) < 0) @@ -3046,6 +3046,7 @@ vzDomainMigratePrepare3Params(virConnectPtr conn, goto cleanup; if (!(def = virDomainDefParseString(dom_xml, driver->caps, driver->xmlopt, + NULL, VIR_DOMAIN_DEF_PARSE_INACTIVE))) goto cleanup; diff --git a/src/xen/xen_driver.c b/src/xen/xen_driver.c index 5c38bdf..ed3acf7 100644 --- a/src/xen/xen_driver.c +++ b/src/xen/xen_driver.c @@ -765,7 +765,7 @@ xenUnifiedDomainCreateXML(virConnectPtr conn, parse_flags |= VIR_DOMAIN_DEF_PARSE_VALIDATE_SCHEMA; if (!(def = virDomainDefParseString(xml, priv->caps, priv->xmlopt, - parse_flags))) + NULL, parse_flags))) goto cleanup; if (virDomainCreateXMLEnsureACL(conn, def) < 0) @@ -1617,6 +1617,7 @@ xenUnifiedConnectDomainXMLToNative(virConnectPtr conn, } if (!(def = virDomainDefParseString(xmlData, priv->caps, priv->xmlopt, + NULL, VIR_DOMAIN_DEF_PARSE_INACTIVE))) goto cleanup; @@ -1805,7 +1806,7 @@ xenUnifiedDomainDefineXMLFlags(virConnectPtr conn, const char *xml, unsigned int parse_flags |= VIR_DOMAIN_DEF_PARSE_VALIDATE_SCHEMA; if (!(def = virDomainDefParseString(xml, priv->caps, priv->xmlopt, - parse_flags))) + NULL, parse_flags))) goto cleanup; if (virDomainDefineXMLFlagsEnsureACL(conn, def) < 0) diff --git a/src/xenapi/xenapi_driver.c b/src/xenapi/xenapi_driver.c index a58c10e..9ec083f 100644 --- a/src/xenapi/xenapi_driver.c +++ b/src/xenapi/xenapi_driver.c @@ -568,6 +568,7 @@ xenapiDomainCreateXML(virConnectPtr conn, virDomainDefPtr defPtr = virDomainDefParseString(xmlDesc, priv->caps, priv->xmlopt, + NULL, parse_flags); if (!defPtr) return NULL; @@ -1752,6 +1753,7 @@ xenapiDomainDefineXMLFlags(virConnectPtr conn, const char *xml, unsigned int fla return NULL; virDomainDefPtr defPtr = virDomainDefParseString(xml, priv->caps, priv->xmlopt, + NULL, parse_flags); if (!defPtr) return NULL; diff --git a/tests/bhyvexml2argvtest.c b/tests/bhyvexml2argvtest.c index 7a2d366..b85439b 100644 --- a/tests/bhyvexml2argvtest.c +++ b/tests/bhyvexml2argvtest.c @@ -35,7 +35,7 @@ static int testCompareXMLToArgvFiles(const char *xml, goto out; if (!(vmdef = virDomainDefParseFile(xml, driver.caps, driver.xmlopt, - VIR_DOMAIN_DEF_PARSE_INACTIVE))) { + NULL, VIR_DOMAIN_DEF_PARSE_INACTIVE))) { if (flags & FLAG_EXPECT_PARSE_ERROR) ret = 0; goto out; diff --git a/tests/domainconftest.c b/tests/domainconftest.c index 7d119bb..196e358 100644 --- a/tests/domainconftest.c +++ b/tests/domainconftest.c @@ -52,7 +52,7 @@ static int testGetFilesystem(const void *opaque) abs_srcdir, data->filename) < 0) goto cleanup; - if (!(def = virDomainDefParseFile(filename, caps, xmlopt, 0))) + if (!(def = virDomainDefParseFile(filename, caps, xmlopt, NULL, 0))) goto cleanup; fsdef = virDomainGetFilesystemForTarget(def, diff --git a/tests/qemuagenttest.c b/tests/qemuagenttest.c index 4aa2c49..5dfa58e 100644 --- a/tests/qemuagenttest.c +++ b/tests/qemuagenttest.c @@ -182,7 +182,7 @@ testQemuAgentGetFSInfo(const void *data) goto cleanup; if (!(def = virDomainDefParseFile(domain_filename, caps, xmlopt, - VIR_DOMAIN_DEF_PARSE_INACTIVE))) + NULL, VIR_DOMAIN_DEF_PARSE_INACTIVE))) goto cleanup; if (qemuMonitorTestAddAgentSyncResponse(test) < 0) diff --git a/tests/qemuhotplugtest.c b/tests/qemuhotplugtest.c index 6a9ed99..43eb1cf 100644 --- a/tests/qemuhotplugtest.c +++ b/tests/qemuhotplugtest.c @@ -84,6 +84,7 @@ qemuHotplugCreateObjects(virDomainXMLOptionPtr xmlopt, if (!((*vm)->def = virDomainDefParseString(domxml, driver.caps, driver.xmlopt, + NULL, VIR_DOMAIN_DEF_PARSE_INACTIVE))) goto cleanup; diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c index 7080484..0af71a1 100644 --- a/tests/qemuxml2argvtest.c +++ b/tests/qemuxml2argvtest.c @@ -424,7 +424,7 @@ testCompareXMLToArgv(const void *data) parseFlags |= VIR_DOMAIN_DEF_PARSE_INACTIVE; if (!(vm->def = virDomainDefParseFile(xml, driver.caps, driver.xmlopt, - parseFlags))) { + NULL, parseFlags))) { if (flags & FLAG_EXPECT_PARSE_ERROR) goto ok; goto cleanup; diff --git a/tests/securityselinuxlabeltest.c b/tests/securityselinuxlabeltest.c index 4c0f427..e98d9bb 100644 --- a/tests/securityselinuxlabeltest.c +++ b/tests/securityselinuxlabeltest.c @@ -189,7 +189,7 @@ testSELinuxLoadDef(const char *testname) abs_srcdir, testname) < 0) goto cleanup; - if (!(def = virDomainDefParseFile(xmlfile, caps, driver.xmlopt, 0))) + if (!(def = virDomainDefParseFile(xmlfile, caps, driver.xmlopt, NULL, 0))) goto cleanup; for (i = 0; i < def->ndisks; i++) { diff --git a/tests/testutils.c b/tests/testutils.c index c934785..35b041f 100644 --- a/tests/testutils.c +++ b/tests/testutils.c @@ -1127,7 +1127,7 @@ testCompareDomXML2XMLFiles(virCapsPtr caps, virDomainXMLOptionPtr xmlopt, if (!live) format_flags |= VIR_DOMAIN_DEF_FORMAT_INACTIVE; - if (!(def = virDomainDefParseFile(infile, caps, xmlopt, parse_flags))) { + if (!(def = virDomainDefParseFile(infile, caps, xmlopt, NULL, parse_flags))) { result = TEST_COMPARE_DOM_XML2XML_RESULT_FAIL_PARSE; goto out; } diff --git a/tests/xlconfigtest.c b/tests/xlconfigtest.c index 61a6295..d99f887 100644 --- a/tests/xlconfigtest.c +++ b/tests/xlconfigtest.c @@ -89,11 +89,11 @@ testCompareParseXML(const char *xlcfg, const char *xml, bool replaceVars) if (!(replacedXML = testReplaceVarsXML(xml))) goto fail; if (!(def = virDomainDefParseString(replacedXML, caps, xmlopt, - VIR_DOMAIN_XML_INACTIVE))) + NULL, VIR_DOMAIN_XML_INACTIVE))) goto fail; } else { if (!(def = virDomainDefParseFile(xml, caps, xmlopt, - VIR_DOMAIN_XML_INACTIVE))) + NULL, VIR_DOMAIN_XML_INACTIVE))) goto fail; } diff --git a/tests/xmconfigtest.c b/tests/xmconfigtest.c index 96990ee..6399777 100644 --- a/tests/xmconfigtest.c +++ b/tests/xmconfigtest.c @@ -63,7 +63,7 @@ testCompareParseXML(const char *xmcfg, const char *xml) priv.caps = caps; conn->privateData = &priv; - if (!(def = virDomainDefParseFile(xml, caps, xmlopt, + if (!(def = virDomainDefParseFile(xml, caps, xmlopt, NULL, VIR_DOMAIN_DEF_PARSE_INACTIVE))) goto fail; diff --git a/tests/xml2sexprtest.c b/tests/xml2sexprtest.c index 77fea4a..0b95113 100644 --- a/tests/xml2sexprtest.c +++ b/tests/xml2sexprtest.c @@ -27,7 +27,7 @@ testCompareFiles(const char *xml, const char *sexpr) int ret = -1; virDomainDefPtr def = NULL; - if (!(def = virDomainDefParseFile(xml, caps, xmlopt, + if (!(def = virDomainDefParseFile(xml, caps, xmlopt, NULL, VIR_DOMAIN_DEF_PARSE_INACTIVE))) goto fail; diff --git a/tests/xml2vmxtest.c b/tests/xml2vmxtest.c index bf66152..b77be89 100644 --- a/tests/xml2vmxtest.c +++ b/tests/xml2vmxtest.c @@ -76,7 +76,7 @@ testCompareFiles(const char *xml, const char *vmx, int virtualHW_version) char *formatted = NULL; virDomainDefPtr def = NULL; - def = virDomainDefParseFile(xml, caps, xmlopt, + def = virDomainDefParseFile(xml, caps, xmlopt, NULL, VIR_DOMAIN_DEF_PARSE_INACTIVE); if (def == NULL) -- 2.8.4

We want to by pass the proper opaque pointer instead of NULL to virDomainDefParseString. Signed-off-by: Michal Privoznik <mprivozn@redhat.com> --- src/conf/domain_conf.c | 7 ++++--- src/conf/domain_conf.h | 1 + src/libxl/libxl_domain.c | 4 ++-- src/qemu/qemu_domain.c | 2 +- src/qemu/qemu_driver.c | 3 ++- src/test/test_driver.c | 5 +++-- src/xen/xm_internal.c | 1 + 7 files changed, 14 insertions(+), 9 deletions(-) diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 6f5bf2e..1d8d7c1 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -2973,7 +2973,7 @@ virDomainObjSetDefTransient(virCapsPtr caps, if (domain->newDef) return 0; - if (!(domain->newDef = virDomainDefCopy(domain->def, caps, xmlopt, false))) + if (!(domain->newDef = virDomainDefCopy(domain->def, caps, xmlopt, NULL, false))) goto out; ret = 0; @@ -24661,6 +24661,7 @@ virDomainDefPtr virDomainDefCopy(virDomainDefPtr src, virCapsPtr caps, virDomainXMLOptionPtr xmlopt, + void *parseOpaque, bool migratable) { char *xml; @@ -24676,7 +24677,7 @@ virDomainDefCopy(virDomainDefPtr src, if (!(xml = virDomainDefFormat(src, caps, format_flags))) return NULL; - ret = virDomainDefParseString(xml, caps, xmlopt, NULL, parse_flags); + ret = virDomainDefParseString(xml, caps, xmlopt, parseOpaque, parse_flags); VIR_FREE(xml); return ret; @@ -24690,7 +24691,7 @@ virDomainObjCopyPersistentDef(virDomainObjPtr dom, virDomainDefPtr cur; cur = virDomainObjGetPersistentDef(caps, xmlopt, dom); - return virDomainDefCopy(cur, caps, xmlopt, false); + return virDomainDefCopy(cur, caps, xmlopt, NULL, false); } diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index 30ab1a5..a6554f5 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -2604,6 +2604,7 @@ virDomainDefPtr virDomainObjGetOneDef(virDomainObjPtr vm, unsigned int flags); virDomainDefPtr virDomainDefCopy(virDomainDefPtr src, virCapsPtr caps, virDomainXMLOptionPtr xmlopt, + void *parseOpaque, bool migratable); virDomainDefPtr virDomainObjCopyPersistentDef(virDomainObjPtr dom, virCapsPtr caps, diff --git a/src/libxl/libxl_domain.c b/src/libxl/libxl_domain.c index 50385fd..fb63a03 100644 --- a/src/libxl/libxl_domain.c +++ b/src/libxl/libxl_domain.c @@ -1365,8 +1365,8 @@ libxlDomainDefCheckABIStability(libxlDriverPrivatePtr driver, libxlDriverConfigPtr cfg = libxlDriverConfigGet(driver); bool ret = false; - if (!(migratableDefSrc = virDomainDefCopy(src, cfg->caps, driver->xmlopt, true)) || - !(migratableDefDst = virDomainDefCopy(dst, cfg->caps, driver->xmlopt, true))) + if (!(migratableDefSrc = virDomainDefCopy(src, cfg->caps, driver->xmlopt, NULL, true)) || + !(migratableDefDst = virDomainDefCopy(dst, cfg->caps, driver->xmlopt, NULL, true))) goto cleanup; ret = virDomainDefCheckABIStability(migratableDefSrc, migratableDefDst); diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index 9f67eaf..97f8993 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -3391,7 +3391,7 @@ qemuDomainDefFormatBuf(virQEMUDriverPtr driver, if (!(flags & (VIR_DOMAIN_XML_UPDATE_CPU | VIR_DOMAIN_XML_MIGRATABLE))) goto format; - if (!(copy = virDomainDefCopy(def, caps, driver->xmlopt, + if (!(copy = virDomainDefCopy(def, caps, driver->xmlopt, NULL, flags & VIR_DOMAIN_XML_MIGRATABLE))) goto cleanup; diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 4ed12bb..3e68a81 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -15239,7 +15239,8 @@ qemuDomainRevertToSnapshot(virDomainSnapshotPtr snapshot, * than inactive xml? */ snap->def->current = true; if (snap->def->dom) { - config = virDomainDefCopy(snap->def->dom, caps, driver->xmlopt, true); + config = virDomainDefCopy(snap->def->dom, caps, + driver->xmlopt, NULL, true); if (!config) goto endjob; } diff --git a/src/test/test_driver.c b/src/test/test_driver.c index bf5c1b0..a382d89 100644 --- a/src/test/test_driver.c +++ b/src/test/test_driver.c @@ -6416,6 +6416,7 @@ testDomainSnapshotCreateXML(virDomainPtr domain, if (!(def->dom = virDomainDefCopy(vm->def, privconn->caps, privconn->xmlopt, + NULL, true))) goto cleanup; @@ -6670,8 +6671,8 @@ testDomainRevertToSnapshot(virDomainSnapshotPtr snapshot, } snap->def->current = true; - config = virDomainDefCopy(snap->def->dom, - privconn->caps, privconn->xmlopt, true); + config = virDomainDefCopy(snap->def->dom, privconn->caps, + privconn->xmlopt, NULL, true); if (!config) goto cleanup; diff --git a/src/xen/xm_internal.c b/src/xen/xm_internal.c index 8335078..10c9097 100644 --- a/src/xen/xm_internal.c +++ b/src/xen/xm_internal.c @@ -517,6 +517,7 @@ xenXMDomainGetXMLDesc(virConnectPtr conn, ret = virDomainDefCopy(entry->def, priv->caps, priv->xmlopt, + NULL, false); cleanup: -- 2.8.4

On Fri, Sep 23, 2016 at 15:24:57 +0200, Michal Privoznik wrote:
We want to by pass the proper opaque pointer instead of NULL to
Copy & paste, isn't it? :-)
virDomainDefParseString.
ACK Jirka

We can't rely on def->emulator path. It may be provided by user as we give them opportunity to provide their own XML for migration. Therefore the path may point to just whatever binary (or even to a non-existent file). Moreover, this path is meant for destination, but the capabilities lookup is done on source. What we can do is to assume same capabilities for post parse callbacks as the running domain has. They will be used just to add some default models/controllers/devices/... anyway. Signed-off-by: Michal Privoznik <mprivozn@redhat.com> --- src/qemu/qemu_domain.c | 16 ++++++++++------ src/qemu/qemu_migration.c | 2 +- 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index 97f8993..ea88f5e 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -2327,11 +2327,11 @@ qemuDomainDefPostParse(virDomainDefPtr def, virCapsPtr caps, unsigned int parseFlags, void *opaque, - void *parseOpaque ATTRIBUTE_UNUSED) + void *parseOpaque) { virQEMUDriverPtr driver = opaque; virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver); - virQEMUCapsPtr qemuCaps = NULL; + virQEMUCapsPtr qemuCaps = parseOpaque; int ret = -1; if (def->os.bootloader || def->os.bootloaderArgs) { @@ -2360,10 +2360,14 @@ qemuDomainDefPostParse(virDomainDefPtr def, !(def->emulator = virDomainDefGetDefaultEmulator(def, caps))) goto cleanup; - if (!(qemuCaps = virQEMUCapsCacheLookup(caps, - driver->qemuCapsCache, - def->emulator))) - goto cleanup; + if (qemuCaps) { + virObjectRef(qemuCaps); + } else { + if (!(qemuCaps = virQEMUCapsCacheLookup(caps, + driver->qemuCapsCache, + def->emulator))) + goto cleanup; + } if (qemuDomainDefAddDefaultDevices(def, qemuCaps) < 0) goto cleanup; diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c index df48eab..e2ca330 100644 --- a/src/qemu/qemu_migration.c +++ b/src/qemu/qemu_migration.c @@ -3242,7 +3242,7 @@ qemuMigrationBeginPhase(virQEMUDriverPtr driver, } if (xmlin) { - if (!(def = virDomainDefParseString(xmlin, caps, driver->xmlopt, NULL, + if (!(def = virDomainDefParseString(xmlin, caps, driver->xmlopt, priv->qemuCaps, VIR_DOMAIN_DEF_PARSE_INACTIVE | VIR_DOMAIN_DEF_PARSE_SKIP_VALIDATE))) goto cleanup; -- 2.8.4

On Fri, Sep 23, 2016 at 15:24:58 +0200, Michal Privoznik wrote:
We can't rely on def->emulator path. It may be provided by user as we give them opportunity to provide their own XML for migration. Therefore the path may point to just whatever binary (or even to a non-existent file). Moreover, this path is meant for destination, but the capabilities lookup is done on source. What we can do is to assume same capabilities for post parse callbacks as the running domain has. They will be used just to add some default models/controllers/devices/... anyway.
Signed-off-by: Michal Privoznik <mprivozn@redhat.com> --- src/qemu/qemu_domain.c | 16 ++++++++++------ src/qemu/qemu_migration.c | 2 +- 2 files changed, 11 insertions(+), 7 deletions(-)
diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index 97f8993..ea88f5e 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -2327,11 +2327,11 @@ qemuDomainDefPostParse(virDomainDefPtr def, virCapsPtr caps, unsigned int parseFlags, void *opaque, - void *parseOpaque ATTRIBUTE_UNUSED) + void *parseOpaque) { virQEMUDriverPtr driver = opaque; virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver); - virQEMUCapsPtr qemuCaps = NULL; + virQEMUCapsPtr qemuCaps = parseOpaque; int ret = -1;
if (def->os.bootloader || def->os.bootloaderArgs) { @@ -2360,10 +2360,14 @@ qemuDomainDefPostParse(virDomainDefPtr def, !(def->emulator = virDomainDefGetDefaultEmulator(def, caps))) goto cleanup;
- if (!(qemuCaps = virQEMUCapsCacheLookup(caps, - driver->qemuCapsCache, - def->emulator))) - goto cleanup; + if (qemuCaps) { + virObjectRef(qemuCaps); + } else { + if (!(qemuCaps = virQEMUCapsCacheLookup(caps, + driver->qemuCapsCache, + def->emulator))) + goto cleanup; + }
This could be simplified a bit as if (!virObjectRef(qemuCaps) && !(qemuCaps = virQEMUCapsCacheLookup(caps, driver->qemuCapsCache, def->emulator))) goto cleanup; But not a big deal. ACK Jirka

Just like virDomainDefPostParseCallback has gained new parseOpaque argument, we need to follow the logic with virDomainDeviceDefPostParse. Signed-off-by: Michal Privoznik <mprivozn@redhat.com> --- src/bhyve/bhyve_domain.c | 3 ++- src/conf/domain_conf.c | 13 +++++++++---- src/conf/domain_conf.h | 8 ++++++-- src/libxl/libxl_domain.c | 3 ++- src/lxc/lxc_domain.c | 3 ++- src/openvz/openvz_driver.c | 3 ++- src/phyp/phyp_driver.c | 3 ++- src/qemu/qemu_domain.c | 3 ++- src/uml/uml_driver.c | 3 ++- src/vbox/vbox_common.c | 3 ++- src/vmware/vmware_driver.c | 3 ++- src/vmx/vmx.c | 3 ++- src/vz/vz_driver.c | 3 ++- src/xen/xen_driver.c | 3 ++- src/xenapi/xenapi_driver.c | 3 ++- 15 files changed, 41 insertions(+), 19 deletions(-) diff --git a/src/bhyve/bhyve_domain.c b/src/bhyve/bhyve_domain.c index 3273462..e2a20ce 100644 --- a/src/bhyve/bhyve_domain.c +++ b/src/bhyve/bhyve_domain.c @@ -77,7 +77,8 @@ bhyveDomainDeviceDefPostParse(virDomainDeviceDefPtr dev ATTRIBUTE_UNUSED, const virDomainDef *def ATTRIBUTE_UNUSED, virCapsPtr caps ATTRIBUTE_UNUSED, unsigned int parseFlags ATTRIBUTE_UNUSED, - void *opaque ATTRIBUTE_UNUSED) + void *opaque ATTRIBUTE_UNUSED, + void *parseOpaque ATTRIBUTE_UNUSED) { return 0; } diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 1d8d7c1..d205222 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -4423,13 +4423,15 @@ virDomainDeviceDefPostParse(virDomainDeviceDefPtr dev, const virDomainDef *def, virCapsPtr caps, unsigned int flags, - virDomainXMLOptionPtr xmlopt) + virDomainXMLOptionPtr xmlopt, + void *parseOpaque) { int ret; if (xmlopt->config.devicesPostParseCallback) { ret = xmlopt->config.devicesPostParseCallback(dev, def, caps, flags, - xmlopt->config.priv); + xmlopt->config.priv, + parseOpaque); if (ret < 0) return ret; } @@ -4447,6 +4449,7 @@ virDomainDeviceDefPostParse(virDomainDeviceDefPtr dev, struct virDomainDefPostParseDeviceIteratorData { virCapsPtr caps; virDomainXMLOptionPtr xmlopt; + void *parseOpaque; unsigned int parseFlags; }; @@ -4459,7 +4462,8 @@ virDomainDefPostParseDeviceIterator(virDomainDefPtr def, { struct virDomainDefPostParseDeviceIteratorData *data = opaque; return virDomainDeviceDefPostParse(dev, def, data->caps, - data->parseFlags, data->xmlopt); + data->parseFlags, data->xmlopt, + data->parseOpaque); } @@ -4570,6 +4574,7 @@ virDomainDefPostParse(virDomainDefPtr def, .caps = caps, .xmlopt = xmlopt, .parseFlags = parseFlags, + .parseOpaque = parseOpaque, }; /* this must be done before the hypervisor-specific callback, @@ -13559,7 +13564,7 @@ virDomainDeviceDefParse(const char *xmlStr, } /* callback to fill driver specific device aspects */ - if (virDomainDeviceDefPostParse(dev, def, caps, flags, xmlopt) < 0) + if (virDomainDeviceDefPostParse(dev, def, caps, flags, xmlopt, NULL) < 0) goto error; /* validate the configuration */ diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index a6554f5..37ed6f5 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -2371,12 +2371,16 @@ typedef int (*virDomainDefPostParseCallback)(virDomainDefPtr def, void *opaque, void *parseOpaque); /* Called once per device, for adjusting per-device settings while - * leaving the overall domain otherwise unchanged. */ + * leaving the overall domain otherwise unchanged. + * @parseOpaque is opaque data passed by virDomainDefParse* caller, + * @opqaue is opaque data set by driver (usually pointer to driver + * private data). */ typedef int (*virDomainDeviceDefPostParseCallback)(virDomainDeviceDefPtr dev, const virDomainDef *def, virCapsPtr caps, unsigned int parseFlags, - void *opaque); + void *opaque, + void *parseOpaque); /* Drive callback for assigning device addresses, called at the end * of parsing, after all defaults and implicit devices have been added. */ typedef int (*virDomainDefAssignAddressesCallback)(virDomainDef *def, diff --git a/src/libxl/libxl_domain.c b/src/libxl/libxl_domain.c index fb63a03..bd04a05 100644 --- a/src/libxl/libxl_domain.c +++ b/src/libxl/libxl_domain.c @@ -285,7 +285,8 @@ libxlDomainDeviceDefPostParse(virDomainDeviceDefPtr dev, const virDomainDef *def, virCapsPtr caps ATTRIBUTE_UNUSED, unsigned int parseFlags ATTRIBUTE_UNUSED, - void *opaque ATTRIBUTE_UNUSED) + void *opaque ATTRIBUTE_UNUSED, + void *parseOpaque ATTRIBUTE_UNUSED) { if (dev->type == VIR_DOMAIN_DEVICE_CHR && dev->data.chr->deviceType == VIR_DOMAIN_CHR_DEVICE_TYPE_CONSOLE && diff --git a/src/lxc/lxc_domain.c b/src/lxc/lxc_domain.c index c2e362a..9027c25 100644 --- a/src/lxc/lxc_domain.c +++ b/src/lxc/lxc_domain.c @@ -381,7 +381,8 @@ virLXCDomainDeviceDefPostParse(virDomainDeviceDefPtr dev, const virDomainDef *def ATTRIBUTE_UNUSED, virCapsPtr caps ATTRIBUTE_UNUSED, unsigned int parseFlags ATTRIBUTE_UNUSED, - void *opaque ATTRIBUTE_UNUSED) + void *opaque ATTRIBUTE_UNUSED, + void *parseOpaque ATTRIBUTE_UNUSED) { if (dev->type == VIR_DOMAIN_DEVICE_CHR && dev->data.chr->deviceType == VIR_DOMAIN_CHR_DEVICE_TYPE_CONSOLE && diff --git a/src/openvz/openvz_driver.c b/src/openvz/openvz_driver.c index 376c741..38a562e 100644 --- a/src/openvz/openvz_driver.c +++ b/src/openvz/openvz_driver.c @@ -110,7 +110,8 @@ openvzDomainDeviceDefPostParse(virDomainDeviceDefPtr dev, const virDomainDef *def ATTRIBUTE_UNUSED, virCapsPtr caps ATTRIBUTE_UNUSED, unsigned int parseFlags ATTRIBUTE_UNUSED, - void *opaque ATTRIBUTE_UNUSED) + void *opaque ATTRIBUTE_UNUSED, + void *parseOpaque ATTRIBUTE_UNUSED) { if (dev->type == VIR_DOMAIN_DEVICE_CHR && dev->data.chr->deviceType == VIR_DOMAIN_CHR_DEVICE_TYPE_CONSOLE && diff --git a/src/phyp/phyp_driver.c b/src/phyp/phyp_driver.c index b62a2c4..7a5df3f 100644 --- a/src/phyp/phyp_driver.c +++ b/src/phyp/phyp_driver.c @@ -1109,7 +1109,8 @@ phypDomainDeviceDefPostParse(virDomainDeviceDefPtr dev ATTRIBUTE_UNUSED, const virDomainDef *def ATTRIBUTE_UNUSED, virCapsPtr caps ATTRIBUTE_UNUSED, unsigned int parseFlags ATTRIBUTE_UNUSED, - void *opaque ATTRIBUTE_UNUSED) + void *opaque ATTRIBUTE_UNUSED, + void *parseOpaque ATTRIBUTE_UNUSED) { return 0; } diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index ea88f5e..1f5ef92 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -2561,7 +2561,8 @@ qemuDomainDeviceDefPostParse(virDomainDeviceDefPtr dev, const virDomainDef *def, virCapsPtr caps, unsigned int parseFlags, - void *opaque) + void *opaque, + void *parseOpaque ATTRIBUTE_UNUSED) { virQEMUDriverPtr driver = opaque; virQEMUCapsPtr qemuCaps = NULL; diff --git a/src/uml/uml_driver.c b/src/uml/uml_driver.c index 7c0ebba..95acb22 100644 --- a/src/uml/uml_driver.c +++ b/src/uml/uml_driver.c @@ -410,7 +410,8 @@ umlDomainDeviceDefPostParse(virDomainDeviceDefPtr dev, const virDomainDef *def ATTRIBUTE_UNUSED, virCapsPtr caps ATTRIBUTE_UNUSED, unsigned int parseFlags ATTRIBUTE_UNUSED, - void *opaque ATTRIBUTE_UNUSED) + void *opaque ATTRIBUTE_UNUSED, + void *parseOpaque ATTRIBUTE_UNUSED) { if (dev->type == VIR_DOMAIN_DEVICE_CHR && dev->data.chr->deviceType == VIR_DOMAIN_CHR_DEVICE_TYPE_CONSOLE && diff --git a/src/vbox/vbox_common.c b/src/vbox/vbox_common.c index b46be4b..1472639 100644 --- a/src/vbox/vbox_common.c +++ b/src/vbox/vbox_common.c @@ -266,7 +266,8 @@ vboxDomainDeviceDefPostParse(virDomainDeviceDefPtr dev ATTRIBUTE_UNUSED, const virDomainDef *def ATTRIBUTE_UNUSED, virCapsPtr caps ATTRIBUTE_UNUSED, unsigned int parseFlags ATTRIBUTE_UNUSED, - void *opaque ATTRIBUTE_UNUSED) + void *opaque ATTRIBUTE_UNUSED, + void *parseOpaque ATTRIBUTE_UNUSED) { return 0; } diff --git a/src/vmware/vmware_driver.c b/src/vmware/vmware_driver.c index b0cc47b..9a53b8d 100644 --- a/src/vmware/vmware_driver.c +++ b/src/vmware/vmware_driver.c @@ -97,7 +97,8 @@ vmwareDomainDeviceDefPostParse(virDomainDeviceDefPtr dev ATTRIBUTE_UNUSED, const virDomainDef *def ATTRIBUTE_UNUSED, virCapsPtr caps ATTRIBUTE_UNUSED, unsigned int parseFlags ATTRIBUTE_UNUSED, - void *opaque ATTRIBUTE_UNUSED) + void *opaque ATTRIBUTE_UNUSED, + void *parseOpaque ATTRIBUTE_UNUSED) { return 0; } diff --git a/src/vmx/vmx.c b/src/vmx/vmx.c index 3ae4b73..fc4347f 100644 --- a/src/vmx/vmx.c +++ b/src/vmx/vmx.c @@ -539,7 +539,8 @@ virVMXDomainDevicesDefPostParse(virDomainDeviceDefPtr dev ATTRIBUTE_UNUSED, const virDomainDef *def ATTRIBUTE_UNUSED, virCapsPtr caps ATTRIBUTE_UNUSED, unsigned int parseFlags ATTRIBUTE_UNUSED, - void *opaque ATTRIBUTE_UNUSED) + void *opaque ATTRIBUTE_UNUSED, + void *parseOpaque ATTRIBUTE_UNUSED) { return 0; } diff --git a/src/vz/vz_driver.c b/src/vz/vz_driver.c index f3f5eac..c8841e4 100644 --- a/src/vz/vz_driver.c +++ b/src/vz/vz_driver.c @@ -288,7 +288,8 @@ vzDomainDeviceDefPostParse(virDomainDeviceDefPtr dev, const virDomainDef *def, virCapsPtr caps ATTRIBUTE_UNUSED, unsigned int parseFlags ATTRIBUTE_UNUSED, - void *opaque ATTRIBUTE_UNUSED) + void *opaque ATTRIBUTE_UNUSED, + void *parseOpaque ATTRIBUTE_UNUSED) { if (dev->type == VIR_DOMAIN_DEVICE_NET && (dev->data.net->type == VIR_DOMAIN_NET_TYPE_NETWORK || diff --git a/src/xen/xen_driver.c b/src/xen/xen_driver.c index ed3acf7..8b41974 100644 --- a/src/xen/xen_driver.c +++ b/src/xen/xen_driver.c @@ -325,7 +325,8 @@ xenDomainDeviceDefPostParse(virDomainDeviceDefPtr dev, const virDomainDef *def, virCapsPtr caps ATTRIBUTE_UNUSED, unsigned int parseFlags ATTRIBUTE_UNUSED, - void *opaque ATTRIBUTE_UNUSED) + void *opaque ATTRIBUTE_UNUSED, + void *parseOpaque ATTRIBUTE_UNUSED) { if (dev->type == VIR_DOMAIN_DEVICE_CHR && dev->data.chr->deviceType == VIR_DOMAIN_CHR_DEVICE_TYPE_CONSOLE && diff --git a/src/xenapi/xenapi_driver.c b/src/xenapi/xenapi_driver.c index 9ec083f..dcb79aa 100644 --- a/src/xenapi/xenapi_driver.c +++ b/src/xenapi/xenapi_driver.c @@ -49,7 +49,8 @@ xenapiDomainDeviceDefPostParse(virDomainDeviceDefPtr dev, const virDomainDef *def, virCapsPtr caps ATTRIBUTE_UNUSED, unsigned int parseFlags ATTRIBUTE_UNUSED, - void *opaque ATTRIBUTE_UNUSED) + void *opaque ATTRIBUTE_UNUSED, + void *parseOpaque ATTRIBUTE_UNUSED) { if (dev->type == VIR_DOMAIN_DEVICE_CHR && dev->data.chr->deviceType == VIR_DOMAIN_CHR_DEVICE_TYPE_CONSOLE && -- 2.8.4

On Fri, Sep 23, 2016 at 15:24:59 +0200, Michal Privoznik wrote:
Just like virDomainDefPostParseCallback has gained new parseOpaque argument, we need to follow the logic with virDomainDeviceDefPostParse.
...
diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index a6554f5..37ed6f5 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -2371,12 +2371,16 @@ typedef int (*virDomainDefPostParseCallback)(virDomainDefPtr def, void *opaque, void *parseOpaque); /* Called once per device, for adjusting per-device settings while - * leaving the overall domain otherwise unchanged. */ + * leaving the overall domain otherwise unchanged. + * @parseOpaque is opaque data passed by virDomainDefParse* caller, + * @opqaue is opaque data set by driver (usually pointer to driver
s/opqaue/opaque/
+ * private data). */ typedef int (*virDomainDeviceDefPostParseCallback)(virDomainDeviceDefPtr dev, const virDomainDef *def, virCapsPtr caps, unsigned int parseFlags, - void *opaque); + void *opaque, + void *parseOpaque); /* Drive callback for assigning device addresses, called at the end * of parsing, after all defaults and implicit devices have been added. */ typedef int (*virDomainDefAssignAddressesCallback)(virDomainDef *def, ...
ACK Jirka

Just like we did two commits ago, don't try to fetch capabilities for non-existing binary. Re-use the ones we have for running domain. Signed-off-by: Michal Privoznik <mprivozn@redhat.com> --- src/qemu/qemu_domain.c | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index 1f5ef92..99baf5c 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -2562,15 +2562,19 @@ qemuDomainDeviceDefPostParse(virDomainDeviceDefPtr dev, virCapsPtr caps, unsigned int parseFlags, void *opaque, - void *parseOpaque ATTRIBUTE_UNUSED) + void *parseOpaque) { virQEMUDriverPtr driver = opaque; - virQEMUCapsPtr qemuCaps = NULL; + virQEMUCapsPtr qemuCaps = parseOpaque; virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver); int ret = -1; - qemuCaps = virQEMUCapsCacheLookup(caps, driver->qemuCapsCache, - def->emulator); + if (qemuCaps) { + virObjectRef(qemuCaps); + } else { + qemuCaps = virQEMUCapsCacheLookup(caps, driver->qemuCapsCache, + def->emulator); + } if (dev->type == VIR_DOMAIN_DEVICE_NET && dev->data.net->type != VIR_DOMAIN_NET_TYPE_HOSTDEV && -- 2.8.4

On Fri, Sep 23, 2016 at 15:25:00 +0200, Michal Privoznik wrote:
Just like we did two commits ago, don't try to fetch capabilities for non-existing binary. Re-use the ones we have for running domain.
Signed-off-by: Michal Privoznik <mprivozn@redhat.com> --- src/qemu/qemu_domain.c | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-)
diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index 1f5ef92..99baf5c 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -2562,15 +2562,19 @@ qemuDomainDeviceDefPostParse(virDomainDeviceDefPtr dev, virCapsPtr caps, unsigned int parseFlags, void *opaque, - void *parseOpaque ATTRIBUTE_UNUSED) + void *parseOpaque) { virQEMUDriverPtr driver = opaque; - virQEMUCapsPtr qemuCaps = NULL; + virQEMUCapsPtr qemuCaps = parseOpaque; virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver); int ret = -1;
- qemuCaps = virQEMUCapsCacheLookup(caps, driver->qemuCapsCache, - def->emulator); + if (qemuCaps) { + virObjectRef(qemuCaps); + } else { + qemuCaps = virQEMUCapsCacheLookup(caps, driver->qemuCapsCache, + def->emulator); + }
if (dev->type == VIR_DOMAIN_DEVICE_NET && dev->data.net->type != VIR_DOMAIN_NET_TYPE_HOSTDEV &&
Similar to 5/11, can't you just squash them? (After squashing 4/11 and 6/11, of course). ACK Jirka

On Mon, Sep 26, 2016 at 10:45:51 +0200, Jiri Denemark wrote:
On Fri, Sep 23, 2016 at 15:25:00 +0200, Michal Privoznik wrote:
Just like we did two commits ago, don't try to fetch capabilities for non-existing binary. Re-use the ones we have for running domain.
Signed-off-by: Michal Privoznik <mprivozn@redhat.com> --- src/qemu/qemu_domain.c | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-)
diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index 1f5ef92..99baf5c 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -2562,15 +2562,19 @@ qemuDomainDeviceDefPostParse(virDomainDeviceDefPtr dev, virCapsPtr caps, unsigned int parseFlags, void *opaque, - void *parseOpaque ATTRIBUTE_UNUSED) + void *parseOpaque) { virQEMUDriverPtr driver = opaque; - virQEMUCapsPtr qemuCaps = NULL; + virQEMUCapsPtr qemuCaps = parseOpaque; virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver); int ret = -1;
- qemuCaps = virQEMUCapsCacheLookup(caps, driver->qemuCapsCache, - def->emulator); + if (qemuCaps) { + virObjectRef(qemuCaps); + } else { + qemuCaps = virQEMUCapsCacheLookup(caps, driver->qemuCapsCache, + def->emulator); + }
if (dev->type == VIR_DOMAIN_DEVICE_NET && dev->data.net->type != VIR_DOMAIN_NET_TYPE_HOSTDEV &&
Similar to 5/11, can't you just squash them? (After squashing 4/11 and 6/11, of course).
Or rather just reordering them. I thought 4/11 was similar to 6/11... Jirka

Signed-off-by: Michal Privoznik <mprivozn@redhat.com> --- src/conf/domain_conf.c | 3 ++- src/conf/domain_conf.h | 8 ++++++-- src/qemu/qemu_domain.c | 3 ++- 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index d205222..b11a296 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -4604,7 +4604,8 @@ virDomainDefPostParse(virDomainDefPtr def, if (xmlopt->config.assignAddressesCallback) { ret = xmlopt->config.assignAddressesCallback(def, caps, parseFlags, - xmlopt->config.priv); + xmlopt->config.priv, + parseOpaque); if (ret < 0) return ret; } diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index 37ed6f5..39d7d8c 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -2382,11 +2382,15 @@ typedef int (*virDomainDeviceDefPostParseCallback)(virDomainDeviceDefPtr dev, void *opaque, void *parseOpaque); /* Drive callback for assigning device addresses, called at the end - * of parsing, after all defaults and implicit devices have been added. */ + * of parsing, after all defaults and implicit devices have been added. + * @parseOpaque is opaque data passed by virDomainDefParse* caller, + * @opqaue is opaque data set by driver (usually pointer to driver + * private data). */ typedef int (*virDomainDefAssignAddressesCallback)(virDomainDef *def, virCapsPtr caps, unsigned int parseFlags, - void *opaque); + void *opaque, + void *parseOpaque); /* Called in appropriate places where the domain conf parser can return failure * for configurations that were previously accepted. This shall not modify the diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index 99baf5c..70fac56 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -2773,7 +2773,8 @@ static int qemuDomainDefAssignAddresses(virDomainDef *def, virCapsPtr caps, unsigned int parseFlags ATTRIBUTE_UNUSED, - void *opaque) + void *opaque, + void *parseOpaque ATTRIBUTE_UNUSED) { virQEMUDriverPtr driver = opaque; virQEMUCapsPtr qemuCaps = NULL; -- 2.8.4

On Fri, Sep 23, 2016 at 15:25:01 +0200, Michal Privoznik wrote:
Signed-off-by: Michal Privoznik <mprivozn@redhat.com> --- src/conf/domain_conf.c | 3 ++- src/conf/domain_conf.h | 8 ++++++-- src/qemu/qemu_domain.c | 3 ++- 3 files changed, 10 insertions(+), 4 deletions(-)
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index d205222..b11a296 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -4604,7 +4604,8 @@ virDomainDefPostParse(virDomainDefPtr def,
if (xmlopt->config.assignAddressesCallback) { ret = xmlopt->config.assignAddressesCallback(def, caps, parseFlags, - xmlopt->config.priv); + xmlopt->config.priv, + parseOpaque); if (ret < 0) return ret; } diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index 37ed6f5..39d7d8c 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -2382,11 +2382,15 @@ typedef int (*virDomainDeviceDefPostParseCallback)(virDomainDeviceDefPtr dev, void *opaque, void *parseOpaque); /* Drive callback for assigning device addresses, called at the end - * of parsing, after all defaults and implicit devices have been added. */ + * of parsing, after all defaults and implicit devices have been added. + * @parseOpaque is opaque data passed by virDomainDefParse* caller, + * @opqaue is opaque data set by driver (usually pointer to driver
s/opqaue/opaque/
+ * private data). */ typedef int (*virDomainDefAssignAddressesCallback)(virDomainDef *def, virCapsPtr caps, unsigned int parseFlags, - void *opaque); + void *opaque, + void *parseOpaque);
/* Called in appropriate places where the domain conf parser can return failure * for configurations that were previously accepted. This shall not modify the diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index 99baf5c..70fac56 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -2773,7 +2773,8 @@ static int qemuDomainDefAssignAddresses(virDomainDef *def, virCapsPtr caps, unsigned int parseFlags ATTRIBUTE_UNUSED, - void *opaque) + void *opaque, + void *parseOpaque ATTRIBUTE_UNUSED) { virQEMUDriverPtr driver = opaque; virQEMUCapsPtr qemuCaps = NULL;
ACK Jirka

Just like we did two commits ago, don't try to fetch capabilities for non-existing binary. Re-use the ones we have for running domain. Signed-off-by: Michal Privoznik <mprivozn@redhat.com> --- src/qemu/qemu_domain.c | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index 70fac56..2b24c01 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -2774,17 +2774,21 @@ qemuDomainDefAssignAddresses(virDomainDef *def, virCapsPtr caps, unsigned int parseFlags ATTRIBUTE_UNUSED, void *opaque, - void *parseOpaque ATTRIBUTE_UNUSED) + void *parseOpaque) { virQEMUDriverPtr driver = opaque; - virQEMUCapsPtr qemuCaps = NULL; + virQEMUCapsPtr qemuCaps = parseOpaque; int ret = -1; bool newDomain = parseFlags & VIR_DOMAIN_DEF_PARSE_ABI_UPDATE; - if (!(qemuCaps = virQEMUCapsCacheLookup(caps, - driver->qemuCapsCache, - def->emulator))) - goto cleanup; + if (qemuCaps) { + virObjectRef(qemuCaps); + } else { + if (!(qemuCaps = virQEMUCapsCacheLookup(caps, + driver->qemuCapsCache, + def->emulator))) + goto cleanup; + } if (qemuDomainAssignAddresses(def, qemuCaps, NULL, newDomain) < 0) goto cleanup; -- 2.8.4

On Fri, Sep 23, 2016 at 15:25:02 +0200, Michal Privoznik wrote:
Just like we did two commits ago, don't try to fetch capabilities for non-existing binary. Re-use the ones we have for running domain.
Signed-off-by: Michal Privoznik <mprivozn@redhat.com> --- src/qemu/qemu_domain.c | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-)
diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index 70fac56..2b24c01 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -2774,17 +2774,21 @@ qemuDomainDefAssignAddresses(virDomainDef *def, virCapsPtr caps, unsigned int parseFlags ATTRIBUTE_UNUSED, void *opaque, - void *parseOpaque ATTRIBUTE_UNUSED) + void *parseOpaque) { virQEMUDriverPtr driver = opaque; - virQEMUCapsPtr qemuCaps = NULL; + virQEMUCapsPtr qemuCaps = parseOpaque; int ret = -1; bool newDomain = parseFlags & VIR_DOMAIN_DEF_PARSE_ABI_UPDATE;
- if (!(qemuCaps = virQEMUCapsCacheLookup(caps, - driver->qemuCapsCache, - def->emulator))) - goto cleanup; + if (qemuCaps) { + virObjectRef(qemuCaps); + } else { + if (!(qemuCaps = virQEMUCapsCacheLookup(caps, + driver->qemuCapsCache, + def->emulator))) + goto cleanup; + }
if (qemuDomainAssignAddresses(def, qemuCaps, NULL, newDomain) < 0) goto cleanup;
Do we really need to have a separate patch for a single change in several functions? ACK Jirka

This is an internal flag that prevents our two entry points to XML parsing (virDomainDefParse and virDomainDeviceDefParse) from running post parse callbacks. This is expected to be used in cases when we already have full domain/device XML and we are just parsing it back (i.e. virDomainDefCopy or virDomainDeviceDefCopy) Signed-off-by: Michal Privoznik <mprivozn@redhat.com> --- src/conf/domain_conf.c | 8 ++++++++ src/conf/domain_conf.h | 2 ++ 2 files changed, 10 insertions(+) diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index b11a296..bd20b74 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -4428,6 +4428,10 @@ virDomainDeviceDefPostParse(virDomainDeviceDefPtr dev, { int ret; + /* fill in configuration only in certain places */ + if (flags & VIR_DOMAIN_DEF_PARSE_SKIP_POST_PARSE) + return 0; + if (xmlopt->config.devicesPostParseCallback) { ret = xmlopt->config.devicesPostParseCallback(dev, def, caps, flags, xmlopt->config.priv, @@ -4577,6 +4581,10 @@ virDomainDefPostParse(virDomainDefPtr def, .parseOpaque = parseOpaque, }; + /* fill in configuration only in certain places */ + if (parseFlags & VIR_DOMAIN_DEF_PARSE_SKIP_POST_PARSE) + return 0; + /* this must be done before the hypervisor-specific callback, * in case presence of a controller at a specific index is checked */ diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index 39d7d8c..699e237 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -2645,6 +2645,8 @@ typedef enum { VIR_DOMAIN_DEF_PARSE_ABI_UPDATE = 1 << 9, /* skip definition validation checks meant to be executed on define time only */ VIR_DOMAIN_DEF_PARSE_SKIP_VALIDATE = 1 << 10, + /* skip post parse callback */ + VIR_DOMAIN_DEF_PARSE_SKIP_POST_PARSE = 1 << 11, } virDomainDefParseFlags; typedef enum { -- 2.8.4

On Fri, Sep 23, 2016 at 15:25:03 +0200, Michal Privoznik wrote:
This is an internal flag that prevents our two entry points to XML parsing (virDomainDefParse and virDomainDeviceDefParse) from running post parse callbacks. This is expected to be used in cases when we already have full domain/device XML and we are just parsing it back (i.e. virDomainDefCopy or virDomainDeviceDefCopy)
Signed-off-by: Michal Privoznik <mprivozn@redhat.com> --- src/conf/domain_conf.c | 8 ++++++++ src/conf/domain_conf.h | 2 ++ 2 files changed, 10 insertions(+)
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index b11a296..bd20b74 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -4428,6 +4428,10 @@ virDomainDeviceDefPostParse(virDomainDeviceDefPtr dev, { int ret;
+ /* fill in configuration only in certain places */ + if (flags & VIR_DOMAIN_DEF_PARSE_SKIP_POST_PARSE) + return 0; + if (xmlopt->config.devicesPostParseCallback) { ret = xmlopt->config.devicesPostParseCallback(dev, def, caps, flags, xmlopt->config.priv, @@ -4577,6 +4581,10 @@ virDomainDefPostParse(virDomainDefPtr def, .parseOpaque = parseOpaque, };
+ /* fill in configuration only in certain places */ + if (parseFlags & VIR_DOMAIN_DEF_PARSE_SKIP_POST_PARSE) + return 0; +
The comments are rather useless. ACK if you remove them. Jirka

When creating a copy of virDomainDef we save ourselves the trouble of writing deep-copy functions and just format and parse back domain/device XML. However, the XML we are parsing was already fully formatted - there is no reason to run post parse callbacks (which fill in blanks - there are none!). Signed-off-by: Michal Privoznik <mprivozn@redhat.com> --- src/conf/domain_conf.c | 6 ++++-- src/qemu/qemu_domain.c | 3 ++- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index bd20b74..976fe78 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -24682,7 +24682,8 @@ virDomainDefCopy(virDomainDefPtr src, virDomainDefPtr ret; unsigned int format_flags = VIR_DOMAIN_DEF_FORMAT_SECURE; unsigned int parse_flags = VIR_DOMAIN_DEF_PARSE_INACTIVE | - VIR_DOMAIN_DEF_PARSE_SKIP_VALIDATE; + VIR_DOMAIN_DEF_PARSE_SKIP_VALIDATE | + VIR_DOMAIN_DEF_PARSE_SKIP_POST_PARSE; if (migratable) format_flags |= VIR_DOMAIN_DEF_FORMAT_INACTIVE | VIR_DOMAIN_DEF_FORMAT_MIGRATABLE; @@ -25169,7 +25170,8 @@ virDomainDeviceDefCopy(virDomainDeviceDefPtr src, xmlStr = virBufferContentAndReset(&buf); ret = virDomainDeviceDefParse(xmlStr, def, caps, xmlopt, VIR_DOMAIN_DEF_PARSE_INACTIVE | - VIR_DOMAIN_DEF_PARSE_SKIP_VALIDATE); + VIR_DOMAIN_DEF_PARSE_SKIP_VALIDATE | + VIR_DOMAIN_DEF_PARSE_SKIP_POST_PARSE); cleanup: VIR_FREE(xmlStr); diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index 2b24c01..9b1a32e 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -3380,7 +3380,8 @@ qemuDomainDefCopy(virQEMUDriverPtr driver, if (!(ret = virDomainDefParseString(xml, caps, driver->xmlopt, NULL, VIR_DOMAIN_DEF_PARSE_INACTIVE | - VIR_DOMAIN_DEF_PARSE_SKIP_VALIDATE))) + VIR_DOMAIN_DEF_PARSE_SKIP_VALIDATE | + VIR_DOMAIN_DEF_PARSE_SKIP_POST_PARSE))) goto cleanup; cleanup: -- 2.8.4

On Fri, Sep 23, 2016 at 15:25:04 +0200, Michal Privoznik wrote:
When creating a copy of virDomainDef we save ourselves the trouble of writing deep-copy functions and just format and parse back domain/device XML. However, the XML we are parsing was already fully formatted - there is no reason to run post parse callbacks (which fill in blanks - there are none!).
Signed-off-by: Michal Privoznik <mprivozn@redhat.com> --- src/conf/domain_conf.c | 6 ++++-- src/qemu/qemu_domain.c | 3 ++- 2 files changed, 6 insertions(+), 3 deletions(-)
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index bd20b74..976fe78 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -24682,7 +24682,8 @@ virDomainDefCopy(virDomainDefPtr src, virDomainDefPtr ret; unsigned int format_flags = VIR_DOMAIN_DEF_FORMAT_SECURE; unsigned int parse_flags = VIR_DOMAIN_DEF_PARSE_INACTIVE | - VIR_DOMAIN_DEF_PARSE_SKIP_VALIDATE; + VIR_DOMAIN_DEF_PARSE_SKIP_VALIDATE | + VIR_DOMAIN_DEF_PARSE_SKIP_POST_PARSE;
if (migratable) format_flags |= VIR_DOMAIN_DEF_FORMAT_INACTIVE | VIR_DOMAIN_DEF_FORMAT_MIGRATABLE; ...
I'd squash this to the previous patch. ACK Jirka
participants (2)
-
Jiri Denemark
-
Michal Privoznik