[libvirt] [PATCH] Fix QEMU driver custom domain status XML extensions

Daniel Veillard veillard at redhat.com
Wed Jan 20 10:29:10 UTC 2010


On Mon, Jan 18, 2010 at 05:16:39PM +0000, Daniel P. Berrange wrote:
> Invoking the virConnectGetCapabilities() method causes the QEMU
> driver to rebuild its internal capabilities object. Unfortunately
> it was forgetting to register the custom domain status XML hooks
> again.
> 
> To avoid this kind of error in the future, the code which builds
> capabilities is refactored into one single method, which can be
> called from all locations, ensuring reliable rebuilds.
> 
> * src/qemu/qemu_driver.c: Fix rebuilding of capabilities XML and
>   guarentee it is always consistent
> ---
>  src/qemu/qemu_driver.c |  110 +++++++++++++++++++++++-------------------------
>  1 files changed, 53 insertions(+), 57 deletions(-)
> 
> diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
> index 2d80774..9a3ddfb 100644
> --- a/src/qemu/qemu_driver.c
> +++ b/src/qemu/qemu_driver.c
> @@ -892,34 +892,6 @@ qemuReconnectDomains(struct qemud_driver *driver)
>  
>  
>  static int
> -qemudSecurityCapsInit(virSecurityDriverPtr secdrv,
> -                      virCapsPtr caps)
> -{
> -    const char *doi, *model;
> -
> -    doi = virSecurityDriverGetDOI(secdrv);
> -    model = virSecurityDriverGetModel(secdrv);
> -
> -    caps->host.secModel.model = strdup(model);
> -    if (!caps->host.secModel.model) {
> -        virReportOOMError(NULL);
> -        return -1;
> -    }
> -
> -    caps->host.secModel.doi = strdup(doi);
> -    if (!caps->host.secModel.doi) {
> -        virReportOOMError(NULL);
> -        return -1;
> -    }
> -
> -    VIR_DEBUG("Initialized caps for security driver \"%s\" with "
> -              "DOI \"%s\"", model, doi);
> -
> -    return 0;
> -}
> -
> -
> -static int
>  qemudSecurityInit(struct qemud_driver *qemud_drv)
>  {
>      int ret;
> @@ -940,15 +912,52 @@ qemudSecurityInit(struct qemud_driver *qemud_drv)
>      qemud_drv->securityDriver = security_drv;
>  
>      VIR_INFO("Initialized security driver %s", security_drv->name);
> -
> -    /*
> -     * Add security policy host caps now that the security driver is
> -     * initialized.
> -     */
> -    return qemudSecurityCapsInit(security_drv, qemud_drv->caps);
> +    return 0;
>  }
>  
>  
> +static virCapsPtr
> +qemuCreateCapabilities(virCapsPtr oldcaps,
> +                       virSecurityDriverPtr secDriver)
> +{
> +    virCapsPtr caps;
> +
> +    /* Basic host arch / guest machine capabilities */
> +    if (!(caps = qemudCapsInit(oldcaps))) {
> +        virReportOOMError(NULL);
> +        return NULL;
> +    }
> +
> +    /* Domain XML parser hooks */
> +    caps->privateDataAllocFunc = qemuDomainObjPrivateAlloc;
> +    caps->privateDataFreeFunc = qemuDomainObjPrivateFree;
> +    caps->privateDataXMLFormat = qemuDomainObjPrivateXMLFormat;
> +    caps->privateDataXMLParse = qemuDomainObjPrivateXMLParse;
> +
> +
> +    /* Security driver data */
> +    if (secDriver) {
> +        const char *doi, *model;
> +
> +        doi = virSecurityDriverGetDOI(secDriver);
> +        model = virSecurityDriverGetModel(secDriver);
> +
> +        if (!(caps->host.secModel.model = strdup(model)))
> +            goto no_memory;
> +        if (!(caps->host.secModel.doi = strdup(doi)))
> +            goto no_memory;
> +
> +        VIR_DEBUG("Initialized caps for security driver \"%s\" with "
> +                  "DOI \"%s\"", model, doi);
> +    }
> +
> +    return caps;
> +
> +no_memory:
> +    virReportOOMError(NULL);
> +    virCapabilitiesFree(caps);
> +    return NULL;
> +}
>  
>  /**
>   * qemudStartup:
> @@ -1074,13 +1083,12 @@ qemudStartup(int privileged) {
>                   virStrerror(-rc, buf, sizeof(buf)));
>      }
>  
> -    if ((qemu_driver->caps = qemudCapsInit(NULL)) == NULL)
> -        goto out_of_memory;
> +    if (qemudSecurityInit(qemu_driver) < 0)
> +        goto error;
>  
> -    qemu_driver->caps->privateDataAllocFunc = qemuDomainObjPrivateAlloc;
> -    qemu_driver->caps->privateDataFreeFunc = qemuDomainObjPrivateFree;
> -    qemu_driver->caps->privateDataXMLFormat = qemuDomainObjPrivateXMLFormat;
> -    qemu_driver->caps->privateDataXMLParse = qemuDomainObjPrivateXMLParse;
> +    if ((qemu_driver->caps = qemuCreateCapabilities(NULL,
> +                                                    qemu_driver->securityDriver)) == NULL)
> +        goto error;
>  
>      if ((qemu_driver->activePciHostdevs = pciDeviceListNew(NULL)) == NULL)
>          goto error;
> @@ -1104,10 +1112,6 @@ qemudStartup(int privileged) {
>          }
>      }
>  
> -    if (qemudSecurityInit(qemu_driver) < 0) {
> -        goto error;
> -    }
> -
>      /* If hugetlbfs is present, then we need to create a sub-directory within
>       * it, since we can't assume the root mount point has permissions that
>       * will let our spawned QEMU instances use it.
> @@ -3255,15 +3259,12 @@ static char *qemudGetCapabilities(virConnectPtr conn) {
>      char *xml = NULL;
>  
>      qemuDriverLock(driver);
> -    if ((caps = qemudCapsInit(qemu_driver->caps)) == NULL)
> -        goto no_memory;
>  
> -    caps->privateDataAllocFunc = qemuDomainObjPrivateAlloc;
> -    caps->privateDataFreeFunc = qemuDomainObjPrivateFree;
> -
> -    if (qemu_driver->securityDriver &&
> -        qemudSecurityCapsInit(qemu_driver->securityDriver, caps) < 0)
> -        goto no_memory;
> +    if ((caps = qemuCreateCapabilities(qemu_driver->caps,
> +                                       qemu_driver->securityDriver)) == NULL) {
> +        virCapabilitiesFree(caps);
> +        goto cleanup;
> +    }
>  
>      virCapabilitiesFree(qemu_driver->caps);
>      qemu_driver->caps = caps;
> @@ -3275,11 +3276,6 @@ cleanup:
>      qemuDriverUnlock(driver);
>  
>      return xml;
> -
> -no_memory:
> -    virCapabilitiesFree(caps);
> -    virReportOOMError(conn);
> -    goto cleanup;
>  }

  ACK, this looks cleaner too !

Daniel

-- 
Daniel Veillard      | libxml Gnome XML XSLT toolkit  http://xmlsoft.org/
daniel at veillard.com  | Rpmfind RPM search engine http://rpmfind.net/
http://veillard.com/ | virtualization library  http://libvirt.org/




More information about the libvir-list mailing list