[libvirt] [PATCH 05/11] Convert Xen domain start/migration APIs to use virDomainDefPtr
John Ferlan
jferlan at redhat.com
Thu May 23 12:50:43 UTC 2013
On 05/09/2013 08:59 AM, Daniel P. Berrange wrote:
> From: "Daniel P. Berrange" <berrange at redhat.com>
>
[...snip...]
>
> diff --git a/src/xen/xen_driver.c b/src/xen/xen_driver.c
> index 89b038c..8b7dec9 100644
> --- a/src/xen/xen_driver.c
> +++ b/src/xen/xen_driver.c
> @@ -1294,18 +1294,31 @@ static char *
> xenUnifiedDomainGetXMLDesc(virDomainPtr dom, unsigned int flags)
> {
> xenUnifiedPrivatePtr priv = dom->conn->privateData;
> + virDomainDefPtr minidef = NULL;
> + virDomainDefPtr def = NULL;
> + char *ret = NULL;
> +
> + if (!(minidef = xenGetDomainDefForDom(dom)))
> + goto cleanup;
>
> if (dom->id < 0 && priv->xendConfigVersion < XEND_CONFIG_VERSION_3_0_4) {
> - return xenXMDomainGetXMLDesc(dom, flags);
> + def = xenXMDomainGetXMLDesc(dom->conn, minidef);
> } else {
> - char *cpus, *res;
> + char *cpus;
> xenUnifiedLock(priv);
> cpus = xenDomainUsedCpus(dom);
> xenUnifiedUnlock(priv);
> - res = xenDaemonDomainGetXMLDesc(dom, flags, cpus);
> + def = xenDaemonDomainGetXMLDesc(dom->conn, minidef, cpus);
> VIR_FREE(cpus);
> - return res;
> }
> +
> + if (def)
> + ret = virDomainDefFormat(def, flags);
> +
> +cleanup:
> + virDomainDefFree(def);
> + virDomainDefFree(minidef);
> + return ret;
> }
>
>
> @@ -1438,10 +1451,21 @@ xenUnifiedDomainMigratePerform(virDomainPtr dom,
> const char *dname,
> unsigned long resource)
> {
> + virDomainDefPtr def = NULL;
> + int ret = -1;
> +
> virCheckFlags(XEN_MIGRATION_FLAGS, -1);
>
> - return xenDaemonDomainMigratePerform(dom, cookie, cookielen, uri,
> - flags, dname, resource);
> + if (!(def = xenGetDomainDefForDom(dom)))
> + goto cleanup;
> +
> + ret = xenDaemonDomainMigratePerform(dom->conn, def,
> + cookie, cookielen, uri,
> + flags, dname, resource);
> +
> +cleanup:
> + virDomainDefFree(def);
> + return ret;
> }
>
> static virDomainPtr
> @@ -1452,45 +1476,37 @@ xenUnifiedDomainMigrateFinish(virConnectPtr dconn,
> const char *uri ATTRIBUTE_UNUSED,
> unsigned long flags)
> {
> - virDomainPtr dom = NULL;
> - char *domain_xml = NULL;
> - virDomainPtr dom_new = NULL;
> + xenUnifiedPrivatePtr priv = dconn->privateData;
> + virDomainPtr ret = NULL;
> + virDomainDefPtr minidef = NULL;
> + virDomainDefPtr def = NULL;
>
> virCheckFlags(XEN_MIGRATION_FLAGS, NULL);
>
> - if (!(dom = xenUnifiedDomainLookupByName(dconn, dname)))
> - return NULL;
> + if (!(minidef = xenGetDomainDefForName(dconn, dname)))
> + goto cleanup;
>
> if (flags & VIR_MIGRATE_PERSIST_DEST) {
> - domain_xml = xenDaemonDomainGetXMLDesc(dom, 0, NULL);
> - if (! domain_xml) {
> - virReportError(VIR_ERR_MIGRATE_PERSIST_FAILED,
> - "%s", _("failed to get XML representation of migrated domain"));
> - goto error;
> - }
> + if (!(def = xenDaemonDomainGetXMLDesc(dconn, minidef, NULL)))
> + goto cleanup;
>
> - dom_new = xenDaemonDomainDefineXML(dconn, domain_xml);
> - if (! dom_new) {
> - virReportError(VIR_ERR_MIGRATE_PERSIST_FAILED,
> - "%s", _("failed to define domain on destination host"));
> - goto error;
> + if (priv->xendConfigVersion < XEND_CONFIG_VERSION_3_0_4) {
> + if (xenXMDomainDefineXML(dconn, def) < 0)
> + goto cleanup;
> + } else {
> + if (xenDaemonDomainDefineXML(dconn, def) < 0)
> + goto cleanup;
> }
> -
> - /* Free additional reference added by Define */
> - virDomainFree(dom_new);
> }
>
> - VIR_FREE(domain_xml);
> -
> - return dom;
> -
> + ret = virGetDomain(dconn, minidef->name, minidef->uuid);
> + if (ret)
> + ret->id = minidef->id;
>
> -error:
> - virDomainFree(dom);
> -
> - VIR_FREE(domain_xml);
> -
> - return NULL;
> +cleanup:
> + virDomainDefFree(def);
> + virDomainDefFree(minidef);
> + return ret;
> }
>
> static int
> @@ -1565,23 +1581,52 @@ static virDomainPtr
> xenUnifiedDomainDefineXML(virConnectPtr conn, const char *xml)
> {
> xenUnifiedPrivatePtr priv = conn->privateData;
> + virDomainDefPtr def = NULL;
> + virDomainPtr ret = NULL;
>
> - if (priv->xendConfigVersion < XEND_CONFIG_VERSION_3_0_4)
> - return xenXMDomainDefineXML(conn, xml);
> - else
> - return xenDaemonDomainDefineXML(conn, xml);
> + if (!(def = virDomainDefParseString(xml, priv->caps, priv->xmlopt,
> + 1 << VIR_DOMAIN_VIRT_XEN,
> + VIR_DOMAIN_XML_INACTIVE)))
> + goto cleanup;
> +
> + if (priv->xendConfigVersion < XEND_CONFIG_VERSION_3_0_4) {
> + if (xenXMDomainDefineXML(conn, def) < 0)
> + goto cleanup;
> + def = NULL; /* XM driver owns it now */
> + } else {
> + if (xenDaemonDomainDefineXML(conn, def) < 0)
> + goto cleanup;
> + }
> +
> + ret = virGetDomain(conn, def->name, def->uuid);
> + if (ret)
> + ret->id = -1;
> +
Coverity complains
1666
(7) Event var_deref_op: Dereferencing null pointer "def".
Also see events: [assign_zero]
Because of :
1660 goto cleanup;
(4) Event assign_zero: Assigning: "def" = "NULL".
Also see events: [var_deref_op]
1661 def = NULL; /* XM driver owns it now */
(5) Event if_fallthrough: Falling through to end of if statement
1662 } else {
> +cleanup:
> + virDomainDefFree(def);
> + return ret;
> }
>
> static int
> xenUnifiedDomainUndefineFlags(virDomainPtr dom, unsigned int flags)
> {
> xenUnifiedPrivatePtr priv = dom->conn->privateData;
> + virDomainDefPtr def = NULL;
> + int ret = -1;
>
> virCheckFlags(0, -1);
> +
> + if (!(def = xenGetDomainDefForDom(dom)))
> + goto cleanup;
> +
> if (priv->xendConfigVersion < XEND_CONFIG_VERSION_3_0_4)
> - return xenXMDomainUndefine(dom);
> + ret = xenXMDomainUndefine(dom->conn, def);
> else
> - return xenDaemonDomainUndefine(dom);
> + ret = xenDaemonDomainUndefine(dom->conn, def);
> +
> +cleanup:
> + virDomainDefFree(def);
> + return ret;
> }
>
> static int
[...snip...]
More information about the libvir-list
mailing list