[libvirt] PATCH: Fix default bus type selection for disks

Jim Meyering jim at meyering.net
Tue May 13 08:31:10 UTC 2008


"Daniel P. Berrange" <berrange at redhat.com> wrote:
> We recently added a new bus type attribute to disks to select between IDE,
> SCSI, etc. This attribute is optional and many tools won't set it. In such
> cases we default to IDE, which is clearly wrong. This patch updates it to
> pick the default bus based on the prefix of the disk target name, so that
> it DWIM, eg  hdXXX == IDE, sdXXX == SCSI, xvdXXX == Xen, etc.
>
>  qemu_conf.c |   16 +++++++++++++---
>  1 file changed, 13 insertions(+), 3 deletions(-)
>
> Dan
>
> diff -r 68901592c1ce src/qemu_conf.c
> --- a/src/qemu_conf.c	Sat May 10 13:18:35 2008 -0400
> +++ b/src/qemu_conf.c	Sat May 10 13:55:59 2008 -0400
> @@ -698,10 +698,20 @@
>      }
>
>      if (!bus) {
> -        if (disk->device == QEMUD_DISK_FLOPPY)
> +        if (disk->device == QEMUD_DISK_FLOPPY) {
>              disk->bus = QEMUD_DISK_BUS_FDC;
> -        else
> -            disk->bus = QEMUD_DISK_BUS_IDE;
> +        } else {
> +            if (STRPREFIX((const char *)target, "hd"))
> +                disk->bus = QEMUD_DISK_BUS_IDE;
> +            else if (STRPREFIX((const char *)target, "sd"))
> +                disk->bus = QEMUD_DISK_BUS_SCSI;
> +            else if (STRPREFIX((const char *)target, "vd"))
> +                disk->bus = QEMUD_DISK_BUS_VIRTIO;
> +            else if (STRPREFIX((const char *)target, "xvd"))
> +                disk->bus = QEMUD_DISK_BUS_XEN;
> +            else
> +                disk->bus = QEMUD_DISK_BUS_IDE;
> +        }
>      } else if (STREQ((const char *)bus, "ide"))
>          disk->bus = QEMUD_DISK_BUS_IDE;
>      else if (STREQ((const char *)bus, "fdc"))

ACK,

in spite of the proliferation of casts --
That's not good for readability/maintainability.

What do you think of this?

    static inline char *xml2char(xmlChar *x) { return (char *) x; }

The uses are still ugly, but at least they're safer:
(note that the parameter cannot be a "const" pointer because the
incoming xmlChar* is almost always non-const, as it must be, since
it's going to be freed).

>      if (!bus) {
> -        if (disk->device == QEMUD_DISK_FLOPPY)
> +        if (disk->device == QEMUD_DISK_FLOPPY) {
>              disk->bus = QEMUD_DISK_BUS_FDC;
> -        else
> -            disk->bus = QEMUD_DISK_BUS_IDE;
> +        } else {
> +            if (STRPREFIX(xml2char(target), "hd"))
> +                disk->bus = QEMUD_DISK_BUS_IDE;
> +            else if (STRPREFIX(xml2char(target), "sd"))
> +                disk->bus = QEMUD_DISK_BUS_SCSI;
> +            else if (STRPREFIX(xml2char(target), "vd"))
> +                disk->bus = QEMUD_DISK_BUS_VIRTIO;
> +            else if (STRPREFIX(xml2char(target), "xvd"))
> +                disk->bus = QEMUD_DISK_BUS_XEN;
> +            else
> +                disk->bus = QEMUD_DISK_BUS_IDE;
> +        }
>      } else if (STREQ(xml2char(bus), "ide"))
>          disk->bus = QEMUD_DISK_BUS_IDE;
>      else if (STREQ(xml2char(bus), "fdc"))




More information about the libvir-list mailing list