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;