File detach-disk.patch of Package libvirt

Index: libvirt-0.4.6/src/xend_internal.c
===================================================================
--- libvirt-0.4.6.orig/src/xend_internal.c
+++ libvirt-0.4.6/src/xend_internal.c
@@ -107,6 +107,7 @@ xenDaemonFormatSxprNet(virConnectPtr con
                        int isAttach);
 static int
 virDomainXMLDevID(virDomainPtr domain,
+                  virDomainDefPtr domDef,
                   virDomainDeviceDefPtr dev,
                   char *class,
                   char *ref,
@@ -4016,7 +4017,7 @@ xenDaemonAttachDevice(virDomainPtr domai
 
     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);
@@ -4076,7 +4077,7 @@ xenDaemonDetachDevice(virDomainPtr domai
     if (!(dev = virDomainDeviceDefParse(domain->conn, def, xml)))
         goto cleanup;
 
-    if (virDomainXMLDevID(domain, dev, class, ref, sizeof(ref)))
+    if (virDomainXMLDevID(domain, def, dev, class, ref, sizeof(ref)))
         goto cleanup;
 
     ret = xend_op(domain->conn, domain->name, "op", "device_destroy",
@@ -5607,25 +5608,33 @@ error:
  */
 static int
 virDomainXMLDevID(virDomainPtr domain,
+                  virDomainDefPtr domDef,
                   virDomainDeviceDefPtr dev,
                   char *class,
                   char *ref,
                   int ref_len)
 {
     char *xref;
+    virDomainDiskDefPtr disk;
 
     if (dev->type == VIR_DOMAIN_DEVICE_DISK) {
-        strcpy(class, "vbd");
         if (dev->data.disk->dst == NULL)
             return -1;
-        xref = xenStoreDomainGetDiskID(domain->conn, domain->id,
-                                       dev->data.disk->dst);
-        if (xref == NULL)
-            return -1;
 
-        strncpy(ref, xref, ref_len);
-        free(xref);
-        ref[ref_len - 1] = '\0';
+        if (dev->data.disk->driverName &&
+            (strcasecmp(dev->data.disk->driverName, "tap") == 0))
+            strcpy(class, "tap");
+        else
+            strcpy(class, "vbd");
+
+        for (disk = domDef->disks; disk != NULL; disk = disk->next) {
+            if (STREQ(dev->data.disk->dst, disk->dst)) {
+                strncpy(ref, disk->dst, ref_len);
+                ref[ref_len - 1] = '\0';
+                return 0;
+            }
+        }
+        return -1;
     } else if (dev->type == VIR_DOMAIN_DEVICE_NET) {
         char mac[30];
         virDomainNetDefPtr def = dev->data.net;
openSUSE Build Service is sponsored by