The attached patch adds code to xend_internal.c:xenDomainAttachDevice
that checks to see if the device mentioned in the passed-in XML already
exists, and if so calls op_device_configure to modify the device. It is
particularly useful for connecting and disconnecting a hardware cdrom
device to an FV guest.
I considered making new API a la virDomainModifyDevice, but decided
overloading virDomainAttachDevice was cleaner (and didn't change
existing API).
I have tested the patch on f7 with xen 3.1 and a windows 2000 guest.
Since the patch merely wraps Xen's device_configure call, we're not
adding much risk of breakage.
Please ACK.
Take care,
--Hugh
--
Red Hat Virtualization Group http://redhat.com/virtualization
Hugh Brock | virt-manager http://virt-manager.org
hbrock@xxxxxxxxxx | virtualization library http://libvirt.org
diff -ruN libvirt.orig/src/xend_internal.c libvirt/src/xend_internal.c
--- libvirt.orig/src/xend_internal.c 2007-09-06 11:28:05.000000000 -0400
+++ libvirt/src/xend_internal.c 2007-09-06 10:47:25.000000000 -0400
@@ -3087,6 +3087,7 @@
char *sexpr, *conf, *str;
int hvm = 0, ret;
xenUnifiedPrivatePtr priv;
+ char class[8], ref[80];
if ((domain == NULL) || (domain->conn == NULL) || (domain->name == NULL)) {
virXendError((domain ? domain->conn : NULL), VIR_ERR_INVALID_ARG,
@@ -3116,8 +3117,16 @@
*(conf + strlen(conf) -1) = 0; /* suppress final ) */
}
else conf = sexpr;
- ret = xend_op(domain->conn, domain->name, "op", "device_create",
- "config", conf, NULL);
+ if (virDomainXMLDevID(domain, xml, class, ref)) {
+ /* device doesn't exist, define it */
+ ret = xend_op(domain->conn, domain->name, "op", "device_create",
+ "config", conf, NULL);
+ }
+ else {
+ /* device exists, attempt to modify it */
+ ret = xend_op(domain->conn, domain->name, "op", "device_configure",
+ "config", conf, "dev", ref, NULL);
+ }
free(sexpr);
return ret;
}
--
Libvir-list mailing list
Libvir-list@xxxxxxxxxx
https://www.redhat.com/mailman/listinfo/libvir-list