[libvirt] [PATCH] Do not search xenstore for disk device IDs

Daniel P. Berrange berrange at redhat.com
Tue Feb 23 08:08:16 UTC 2010


On Mon, Feb 22, 2010 at 02:50:07PM -0700, Jim Fehlig wrote:
> Disk devices can be referenced by name in Xen, e.g. when modifying
> their configuration or remvoving them.  As such, don't search
> xenstore for a device ID corresponding to the disk device.  Instead,
> search the disks contained in the domain definition and use the
> disk's target name if found.
> 
> This approach allows removing a disk when domain is inactive.  We
> obviously can't search xenstore when the domain is inactive.

This sounds reasonable, but I'm wondering if old XenD support the
lookup-based on name ?

Daniel

> ---
>  src/xen/xend_internal.c |   38 +++++++++++++++++++++++---------------
>  1 files changed, 23 insertions(+), 15 deletions(-)
> 
> diff --git a/src/xen/xend_internal.c b/src/xen/xend_internal.c
> index 9d95291..d0d32e2 100644
> --- a/src/xen/xend_internal.c
> +++ b/src/xen/xend_internal.c
> @@ -93,6 +93,7 @@ xenDaemonFormatSxprOnePCI(virConnectPtr conn,
>  
>  static int
>  virDomainXMLDevID(virDomainPtr domain,
> +                  virDomainDefPtr domDef,
>                    virDomainDeviceDefPtr dev,
>                    char *class,
>                    char *ref,
> @@ -4212,7 +4213,7 @@ xenDaemonAttachDeviceFlags(virDomainPtr domain, const char *xml,
>  
>      sexpr = virBufferContentAndReset(&buf);
>  
> -    if (virDomainXMLDevID(domain, dev, class, ref, sizeof(ref))) {
> +    if (virDomainXMLDevID(domain, def, dev, class, ref, sizeof(ref))) {
>          /* device doesn't exist, define it */
>          ret = xend_op(domain->conn, domain->name, "op", "device_create",
>                        "config", sexpr, NULL);
> @@ -4306,7 +4307,7 @@ xenDaemonDetachDeviceFlags(virDomainPtr domain, const char *xml,
>                                          def, xml, VIR_DOMAIN_XML_INACTIVE)))
>          goto cleanup;
>  
> -    if (virDomainXMLDevID(domain, dev, class, ref, sizeof(ref)))
> +    if (virDomainXMLDevID(domain, def, dev, class, ref, sizeof(ref)))
>          goto cleanup;
>  
>      if (dev->type == VIR_DOMAIN_DEVICE_HOSTDEV) {
> @@ -6048,6 +6049,7 @@ error:
>   */
>  static int
>  virDomainXMLDevID(virDomainPtr domain,
> +                  virDomainDefPtr domDef,
>                    virDomainDeviceDefPtr dev,
>                    char *class,
>                    char *ref,
> @@ -6056,27 +6058,33 @@ virDomainXMLDevID(virDomainPtr domain,
>      xenUnifiedPrivatePtr priv = domain->conn->privateData;
>      char *xref;
>      char *tmp;
> +    unsigned int i;
> +    virDomainDiskDefPtr disk;
>  
>      if (dev->type == VIR_DOMAIN_DEVICE_DISK) {
> +        if (dev->data.disk->dst == NULL)
> +            return -1;
>          if (dev->data.disk->driverName &&
>              STREQ(dev->data.disk->driverName, "tap"))
>              strcpy(class, "tap");
>          else
>              strcpy(class, "vbd");
>  
> -        if (dev->data.disk->dst == NULL)
> -            return -1;
> -        xenUnifiedLock(priv);
> -        xref = xenStoreDomainGetDiskID(domain->conn, domain->id,
> -                                       dev->data.disk->dst);
> -        xenUnifiedUnlock(priv);
> -        if (xref == NULL)
> -            return -1;
> -
> -        tmp = virStrcpy(ref, xref, ref_len);
> -        VIR_FREE(xref);
> -        if (tmp == NULL)
> -            return -1;
> +        /* For disks, the device name can be used directly.
> +         * If disk device exists in domain definintion,
> +         * copy it to ref and return success.
> +         */
> +        for (i = 0; i < domDef->ndisks; i++) {
> +            disk = domDef->disks[i];
> +            if (STREQ(dev->data.disk->dst, disk->dst)) {
> +                tmp = virStrcpy(ref, disk->dst, ref_len);
> +                if (tmp == NULL)
> +                    return -1;
> +                else
> +                    return 0;
> +            }
> +        }
> +        return -1;
>      } else if (dev->type == VIR_DOMAIN_DEVICE_NET) {
>          char mac[30];
>          virDomainNetDefPtr def = dev->data.net;
> -- 
> 1.6.0.2
> 
> --
> libvir-list mailing list
> libvir-list at redhat.com
> https://www.redhat.com/mailman/listinfo/libvir-list

-- 
|: Red Hat, Engineering, London    -o-   http://people.redhat.com/berrange/ :|
|: http://libvirt.org -o- http://virt-manager.org -o- http://deltacloud.org :|
|: http://autobuild.org        -o-         http://search.cpan.org/~danberr/ :|
|: GnuPG: 7D3B9505  -o-   F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505 :|




More information about the libvir-list mailing list