[Libvir] [PATCH] Allow modifying existing block device, making virDomainAttachDevice modify the device if it already exists

Daniel Veillard veillard at redhat.com
Thu Sep 6 15:59:08 UTC 2007


On Thu, Sep 06, 2007 at 11:45:39AM -0400, Hugh Brock wrote:
> 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.

  Okay looks sensible. 
> 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;
>  }

  virDomainXMLDevID looks frightening to me since we write to an array of
undisclosed size, but that is independant from the patch which looks fine to
me.

  +1

  Thanks !

Daniel

-- 
Red Hat Virtualization group http://redhat.com/virtualization/
Daniel Veillard      | virtualization library  http://libvirt.org/
veillard at redhat.com  | libxml GNOME XML XSLT toolkit  http://xmlsoft.org/
http://veillard.com/ | Rpmfind RPM search engine  http://rpmfind.net/




More information about the libvir-list mailing list