Index: src/xml.c
===================================================================
RCS file: /data/cvs/libvirt/src/xml.c,v
retrieving revision 1.98
diff -u -p -r1.98 xml.c
--- src/xml.c	5 Nov 2007 10:14:42 -0000	1.98
+++ src/xml.c	6 Nov 2007 00:00:35 -0000
@@ -1922,9 +1922,22 @@ virDomainXMLDevID(virDomainPtr domain, c
             attr = xmlGetProp(cur, BAD_CAST "dev");
             if (attr == NULL)
                 goto error;
-            strncpy(ref, (char *) attr, ref_len);
-            ref[ref_len - 1] = '\0';
-            goto cleanup;
+#ifdef WITH_XEN
+            xref = xenStoreDomainGetDiskID(domain->conn, domain->id,
+                                              (char *) attr);
+            if (xref != NULL) {
+                strncpy(ref, xref, ref_len);
+                free(xref);
+                ref[ref_len - 1] = '\0';
+                goto cleanup;
+            }
+#else /* !WITH_XEN */
+            /* hack to avoid the warning that domain is unused */
+            if (domain->id < 0)
+                ret = -1;
+#endif /* !WITH_XEN */
+
+            goto error;
         }
     } else if (xmlStrEqual(node->name, BAD_CAST "interface")) {
         strcpy(class, "vif");
@@ -1945,11 +1958,11 @@ virDomainXMLDevID(virDomainPtr domain, c
                 ref[ref_len - 1] = '\0';
                 goto cleanup;
             }
-#else /* without xen */
+#else /* !WITH_XEN */
             /* hack to avoid the warning that domain is unused */
             if (domain->id < 0)
                 ret = -1;
-#endif /* WITH_XEN */
+#endif /* !WITH_XEN */
 
             goto error;
         }
Index: src/xs_internal.c
===================================================================
RCS file: /data/cvs/libvirt/src/xs_internal.c,v
retrieving revision 1.49
diff -u -p -r1.49 xs_internal.c
--- src/xs_internal.c	29 Sep 2007 18:37:47 -0000	1.49
+++ src/xs_internal.c	6 Nov 2007 00:00:35 -0000
@@ -879,6 +879,58 @@ xenStoreDomainGetNetworkID(virConnectPtr
     return(ret);
 }
 
+/*
+ * xenStoreDomainGetDiskID:
+ * @conn: pointer to the connection.
+ * @id: the domain id
+ * @dev: the virtual block device name
+ *
+ * Get the reference (i.e. the string number) for the device on that domain
+ * which uses the given virtual block device name
+ *
+ * Returns the new string or NULL in case of error, the string must be
+ *         freed by the caller.
+ */
+char *
+xenStoreDomainGetDiskID(virConnectPtr conn, int id, const char *dev) {
+    char dir[80], path[128], **list = NULL, *val = NULL;
+    unsigned int devlen, len, i, num;
+    char *ret = NULL;
+    xenUnifiedPrivatePtr priv;
+
+    if (id < 0)
+        return(NULL);
+
+    priv = (xenUnifiedPrivatePtr) conn->privateData;
+    if (priv->xshandle == NULL)
+        return (NULL);
+    if (dev == NULL)
+        return (NULL);
+    devlen = strlen(dev);
+    if (devlen <= 0)
+        return (NULL);
+
+    snprintf(dir, sizeof(dir), "/local/domain/0/backend/vbd/%d", id);
+    list = xs_directory(priv->xshandle, 0, dir, &num);
+    if (list == NULL)
+        return(NULL);
+    for (i = 0; i < num; i++) {
+        snprintf(path, sizeof(path), "%s/%s/%s", dir, list[i], "dev");
+        val = xs_read(priv->xshandle, 0, path, &len);
+        if (val == NULL)
+            break;
+        if ((devlen != len) || memcmp(val, dev, len)) {
+            free(val);
+        } else {
+            ret = strdup(list[i]);
+            free(val);
+            break;
+        }
+    }
+    free(list);
+    return(ret);
+}
+
 char *xenStoreDomainGetName(virConnectPtr conn,
                             int id) {
     char prop[200];
Index: src/xs_internal.h
===================================================================
RCS file: /data/cvs/libvirt/src/xs_internal.h,v
retrieving revision 1.11
diff -u -p -r1.11 xs_internal.h
--- src/xs_internal.h	10 Aug 2007 18:25:15 -0000	1.11
+++ src/xs_internal.h	6 Nov 2007 00:00:35 -0000
@@ -50,6 +50,9 @@ char *		xenStoreDomainGetOSTypeID(virCon
 char *		xenStoreDomainGetNetworkID(virConnectPtr conn,
 					 int id,
 					 const char *mac);
+char *		xenStoreDomainGetDiskID(virConnectPtr conn,
+					 int id,
+					 const char *mac);
 char *          xenStoreDomainGetName(virConnectPtr conn,
 				      int id);
 
