File xen-name-for-devid.patch of Package libvirt.import4712

commit 7906a668fa8d5c21cc729db8a13b08e3dd1d241f
Author: Jim Fehlig <jfehlig@novell.com>
Date:   Wed Jan 27 16:11:41 2010 -0700

    Do not search xenstore for disk device IDs
    
    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.

Index: libvirt-0.8.8/src/xen/xend_internal.c
===================================================================
--- libvirt-0.8.8.orig/src/xen/xend_internal.c
+++ libvirt-0.8.8/src/xen/xend_internal.c
@@ -89,6 +89,7 @@ xenDaemonFormatSxprOnePCI(virDomainHostd
 
 static int
 virDomainXMLDevID(virDomainPtr domain,
+                  virDomainDefPtr domDef,
                   virDomainDeviceDefPtr dev,
                   char *class,
                   char *ref,
@@ -4088,7 +4089,7 @@ xenDaemonAttachDeviceFlags(virDomainPtr
 
     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);
@@ -4211,7 +4212,7 @@ xenDaemonUpdateDeviceFlags(virDomainPtr
 
     sexpr = virBufferContentAndReset(&buf);
 
-    if (virDomainXMLDevID(domain, dev, class, ref, sizeof(ref))) {
+    if (virDomainXMLDevID(domain, def, dev, class, ref, sizeof(ref))) {
         virXendError(VIR_ERR_OPERATION_INVALID, "%s",
                      _("requested device does not exist"));
         goto cleanup;
@@ -4304,7 +4305,7 @@ xenDaemonDetachDeviceFlags(virDomainPtr
                                         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) {
@@ -6085,6 +6086,7 @@ error:
  */
 static int
 virDomainXMLDevID(virDomainPtr domain,
+                  virDomainDefPtr domDef,
                   virDomainDeviceDefPtr dev,
                   char *class,
                   char *ref,
@@ -6093,8 +6095,12 @@ 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");
@@ -6104,19 +6110,21 @@ virDomainXMLDevID(virDomainPtr domain,
         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;