From a10aa7a96bc554c43808710017a1a1603599c3f3 Mon Sep 17 00:00:00 2001 From: John Levon Date: Thu, 29 Jan 2009 17:05:49 +0000 Subject: [PATCH] correctly enable floppies for HVM guests. --- ChangeLog | 6 ++++++ src/xend_internal.c | 48 +++++++++++++++++++++++++++++++++------------ 2 files changed, 42 insertions(+), 12 deletions(-) diff --git a/ChangeLog b/ChangeLog index 3838db9334..d0d3e9ef87 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +Thu Jan 29 09:03:17 PST 2009 John Levon + + * src/xend_internal.c: correctly enable floppies for HVM guests. + Refuse to directly attach disks that won't work via + device_create. + Thu Jan 29 16:41:07 GMT 2009 John Levon * src/util.c: allow strtol replacements for libvirt proxy diff --git a/src/xend_internal.c b/src/xend_internal.c index 48e046afcc..46b4382bea 100644 --- a/src/xend_internal.c +++ b/src/xend_internal.c @@ -5020,14 +5020,26 @@ xenDaemonFormatSxprDisk(virConnectPtr conn ATTRIBUTE_UNUSED, * under the hvm (image (os)) block */ if (hvm && - def->device == VIR_DOMAIN_DISK_DEVICE_FLOPPY) + def->device == VIR_DOMAIN_DISK_DEVICE_FLOPPY) { + if (isAttach) { + virXendError(conn, VIR_ERR_INVALID_ARG, + _("Cannot directly attach floppy %s"), def->src); + return -1; + } return 0; + } /* Xend <= 3.0.2 doesn't include cdrom config here */ if (hvm && def->device == VIR_DOMAIN_DISK_DEVICE_CDROM && - xendConfigVersion == 1) + xendConfigVersion == 1) { + if (isAttach) { + virXendError(conn, VIR_ERR_INVALID_ARG, + _("Cannot directly attach CDROM %s"), def->src); + return -1; + } return 0; + } if (!isAttach) virBufferAddLit(buf, "(device "); @@ -5376,17 +5388,29 @@ xenDaemonFormatSxpr(virConnectPtr conn, } virBufferVSprintf(&buf, "(boot %s)", bootorder); - /* get the cdrom device file */ - /* Only XenD <= 3.0.2 wants cdrom config here */ - if (xendConfigVersion == 1) { - for (i = 0 ; i < def->ndisks ; i++) { - if (def->disks[i]->type == VIR_DOMAIN_DISK_DEVICE_CDROM && - STREQ(def->disks[i]->dst, "hdc") && - def->disks[i]->src) { - virBufferVSprintf(&buf, "(cdrom '%s')", - def->disks[i]->src); + /* some disk devices are defined here */ + for (i = 0 ; i < def->ndisks ; i++) { + switch (def->disks[i]->device) { + case VIR_DOMAIN_DISK_DEVICE_CDROM: + /* Only xend <= 3.0.2 wants cdrom config here */ + if (xendConfigVersion != 1) break; - } + if (!STREQ(def->disks[i]->dst, "hdc") || + def->disks[i]->src == NULL) + break; + + virBufferVSprintf(&buf, "(cdrom '%s')", + def->disks[i]->src); + break; + + case VIR_DOMAIN_DISK_DEVICE_FLOPPY: + /* all xend versions define floppies here */ + virBufferVSprintf(&buf, "(%s '%s')", def->disks[i]->dst, + def->disks[i]->src); + break; + + default: + break; } }