[libvirt] [PATCH]: Fix "virsh attach-disk" and "virsh attach-interface"

Daniel P. Berrange berrange at redhat.com
Tue Aug 5 15:10:59 UTC 2008


On Tue, Aug 05, 2008 at 12:02:47PM +0200, Chris Lalancette wrote:
> With the recent refactoring of the domain code, plus the changes with the Xend
> code, a couple of bugs were introduced into the attach-disk and attach-interface
> functionality.  This patch fixes 3 bugs:
> 
> 1)  In xenDaemonAttachDevice(), there is a switch statement to determine which
> of the xenDaemonFormatSxpr{Disk,Net} functions to call.  Unfortunately, the case
> statements are all missing the corresponding "break", so we always fall-through
> to the default error case.  This patch just adds the appropriate break statements.

ACK

> 2)  (minor) In xenDaemonDomainDefineXML (that's a mouthful!), there is a stray
> "fprintf".  This is now converted to a proper virXendError().

ACK

> 3)  xenDaemonFormatSxpr{Disk,Net} were adding an extra (device to the front of
> the sexpr expressions that xend did not expect (this is Xend on RHEL 5.2).
> Because of this, the attaches would fail.  The patch fixes this by removing the
> (device from the front, which makes attach-disk and attach-interface work again.

This isn't entirely correct. The previous code was in fact inconsistent in this
area. Taking libvirt 0.4.4 as an example

  - xenDaemonAttachDevice  calls into
  - virParseXMLDevice  returns the SEXPR by calling into
  - virDomainParseXMLDiskDesc or virDomainParseXMLIfDesc

The DiskDesc method returns an SEXPR with a '(device ' prefix. THe IfDesc method
returns a SEXPR without a '(device ' prefix. I'm pretty sure I've used the disk
hotplug in RHEL5, which implies it does accept a (device prefix. I've never tried
network hotplug, so can't say whether that worked or not. In any case I think this
needs some more investigation of behaviour on Xen 3.0.3, vs  3.1.0 and 3.2.0 before
we change the SEXPR again

Regards,
Daniel

> Index: src/xend_internal.c
> ===================================================================
> RCS file: /data/cvs/libvirt/src/xend_internal.c,v
> retrieving revision 1.207
> diff -u -r1.207 xend_internal.c
> --- a/src/xend_internal.c	4 Aug 2008 06:33:25 -0000	1.207
> +++ b/src/xend_internal.c	5 Aug 2008 09:59:57 -0000
> @@ -3900,6 +3900,7 @@
>                                      STREQ(def->os.type, "hvm") ? 1 : 0,
>                                      priv->xendConfigVersion) < 0)
>              goto cleanup;
> +        break;
>  
>      case VIR_DOMAIN_DEVICE_NET:
>          if (xenDaemonFormatSxprNet(domain->conn,
> @@ -3908,6 +3909,7 @@
>                                     STREQ(def->os.type, "hvm") ? 1 : 0,
>                                     priv->xendConfigVersion) < 0)
>              goto cleanup;
> +        break;
>  
>      default:
>          virXendError(domain->conn, VIR_ERR_NO_SUPPORT, "%s",
> @@ -4292,7 +4294,8 @@
>      ret = xend_op(conn, "", "op", "new", "config", sexpr, NULL);
>      VIR_FREE(sexpr);
>      if (ret != 0) {
> -        fprintf(stderr, _("Failed to create inactive domain %s\n"), name);
> +        virXendError(conn, VIR_ERR_XEN_CALL,
> +                     _("Failed to create inactive domain %s\n"), name);
>          goto error;
>      }
>  
> @@ -5029,7 +5032,6 @@
>          xendConfigVersion == 1)
>          return 0;
>  
> -    virBufferAddLit(buf, "(device ");
>      /* Normally disks are in a (device (vbd ...)) block
>       * but blktap disks ended up in a differently named
>       * (device (tap ....)) block.... */
> @@ -5083,7 +5085,7 @@
>      else
>          virBufferAddLit(buf, "(mode 'w')");
>  
> -    virBufferAddLit(buf, "))");
> +    virBufferAddLit(buf, ")");
>  
>      return 0;
>  }
> @@ -5117,7 +5119,7 @@
>          return -1;
>      }
>  
> -    virBufferAddLit(buf, "(device (vif ");
> +    virBufferAddLit(buf, "(vif ");
>  
>      virBufferVSprintf(buf,
>                        "(mac '%02x:%02x:%02x:%02x:%02x:%02x')",
> @@ -5177,7 +5179,7 @@
>      if ((hvm) && (xendConfigVersion < 4))
>          virBufferAddLit(buf, "(type ioemu)");
>  
> -    virBufferAddLit(buf, "))");
> +    virBufferAddLit(buf, ")");
>  
>      return 0;
>  }

> --
> Libvir-list mailing list
> Libvir-list at redhat.com
> https://www.redhat.com/mailman/listinfo/libvir-list


-- 
|: Red Hat, Engineering, London   -o-   http://people.redhat.com/berrange/ :|
|: http://libvirt.org  -o-  http://virt-manager.org  -o-  http://ovirt.org :|
|: http://autobuild.org       -o-         http://search.cpan.org/~danberr/ :|
|: GnuPG: 7D3B9505  -o-  F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505 :|




More information about the libvir-list mailing list