diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in index 4b31e2a331..e7ba566d2b 100644 --- a/docs/formatdomain.html.in +++ b/docs/formatdomain.html.in @@ -1541,8 +1541,8 @@ attributes ports and vectors, which control how many devices can be connected through the controller. A "scsi" controller has an optional - attribute model, which is one of "auto", - "buslogic", "lsilogic", "lsias1068", or "vmpvscsi". + attribute model, which is one of "auto", "buslogic", + "ibmvscsi", "lsilogic", "lsias1068" or "vmpvscsi". A "usb" controller has an optional attribute model, which is one of "piix3-uhci", "piix4-uhci", "ehci", "ich9-ehci1", "ich9-uhci1", "ich9-uhci2", "ich9-uhci3", diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng index fdcbc28ee3..5f67a6f18b 100644 --- a/docs/schemas/domaincommon.rng +++ b/docs/schemas/domaincommon.rng @@ -1081,6 +1081,7 @@ lsilogic lsisas1068 vmpvscsi + ibmvscsi piix3-uhci piix4-uhci ehci diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index d4745510f1..f01650aef2 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -234,7 +234,8 @@ VIR_ENUM_IMPL(virDomainControllerModelSCSI, VIR_DOMAIN_CONTROLLER_MODEL_SCSI_LAS "buslogic", "lsilogic", "lsisas1068", - "vmpvscsi") + "vmpvscsi", + "ibmvscsi"); VIR_ENUM_IMPL(virDomainControllerModelUSB, VIR_DOMAIN_CONTROLLER_MODEL_USB_LAST, "piix3-uhci", diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index bac5a872a8..c6c4e271ed 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -422,6 +422,7 @@ enum virDomainControllerModelSCSI { VIR_DOMAIN_CONTROLLER_MODEL_SCSI_LSILOGIC, VIR_DOMAIN_CONTROLLER_MODEL_SCSI_LSISAS1068, VIR_DOMAIN_CONTROLLER_MODEL_SCSI_VMPVSCSI, + VIR_DOMAIN_CONTROLLER_MODEL_SCSI_IBMVSCSI, VIR_DOMAIN_CONTROLLER_MODEL_SCSI_LAST }; diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index 1bd1f3765b..6d98036af5 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -2288,14 +2288,30 @@ qemuBuildControllerDevStr(virDomainDefPtr domainDef, int *nusbcontroller) { virBuffer buf = VIR_BUFFER_INITIALIZER; + int model; switch (def->type) { case VIR_DOMAIN_CONTROLLER_TYPE_SCSI: - if (STREQ(domainDef->os.arch, "ppc64") && - STREQ(domainDef->os.machine, "pseries")) { - virBufferAddLit(&buf, "spapr-vscsi"); - } else { + model = def->model; + if (model == -1 || model == VIR_DOMAIN_CONTROLLER_MODEL_SCSI_AUTO) { + if (STREQ(domainDef->os.arch, "ppc64") && + STREQ(domainDef->os.machine, "pseries")) { + model = VIR_DOMAIN_CONTROLLER_MODEL_SCSI_IBMVSCSI; + } else { + model = VIR_DOMAIN_CONTROLLER_MODEL_SCSI_LSILOGIC; + } + } + switch (model) { + case VIR_DOMAIN_CONTROLLER_MODEL_SCSI_LSILOGIC: virBufferAddLit(&buf, "lsi"); + break; + case VIR_DOMAIN_CONTROLLER_MODEL_SCSI_IBMVSCSI: + virBufferAddLit(&buf, "spapr-vscsi"); + break; + default: + qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("Unsupported controller model: %s"), + virDomainControllerModelSCSITypeToString(model)); } virBufferAsprintf(&buf, ",id=scsi%d", def->idx); break; diff --git a/src/vmx/vmx.c b/src/vmx/vmx.c index c250aeeb98..6ac500c616 100644 --- a/src/vmx/vmx.c +++ b/src/vmx/vmx.c @@ -481,16 +481,17 @@ def->parallels[0]... #define VMX_BUILD_NAME(_suffix) \ VMX_BUILD_NAME_EXTRA(_suffix, #_suffix) -/* directly map the virDomainControllerModel to virVMXSCSIControllerModel, - * this is good enough for now because all virDomainControllerModel values - * are actually SCSI controller models in the ESX case */ +/* directly map the virDomainControllerModel to virVMXSCSIControllerModel. + * Using an uppercase name for unused values ensures that they will never + * be used. */ VIR_ENUM_DECL(virVMXControllerModelSCSI) VIR_ENUM_IMPL(virVMXControllerModelSCSI, VIR_DOMAIN_CONTROLLER_MODEL_SCSI_LAST, "auto", /* just to match virDomainControllerModel, will never be used */ "buslogic", "lsilogic", "lsisas1068", - "pvscsi"); + "pvscsi", + "UNUSED ibmvscsi"); diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-scsi-vscsi.args b/tests/qemuxml2argvdata/qemuxml2argv-disk-scsi-vscsi.args new file mode 100644 index 0000000000..799eb920eb --- /dev/null +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-scsi-vscsi.args @@ -0,0 +1,8 @@ +LC_ALL=C PATH=/bin HOME=/home/test USER=test LOGNAME=test /usr/bin/qemu -S -M \ +pc -m 214 -smp 1 -nographic -nodefconfig -nodefaults -monitor \ +unix:/tmp/test-monitor,server,nowait -no-acpi -boot c -device spapr-vscsi,id=scsi0,\ +bus=pci.0,addr=0x3 -drive file=/dev/HostVG/QEMUGuest1,if=none,\ +id=drive-ide0-0-0 -device ide-drive,bus=ide.0,unit=0,drive=drive-ide0-0-0,\ +id=ide0-0-0 -drive file=/tmp/scsidisk.img,if=none,id=drive-scsi0-0-0 -device \ +scsi-disk,bus=scsi0.0,scsi-id=0,drive=drive-scsi0-0-0,id=scsi0-0-0 -usb \ +-device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x4 diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-scsi-vscsi.xml b/tests/qemuxml2argvdata/qemuxml2argv-disk-scsi-vscsi.xml new file mode 100644 index 0000000000..7cf5798c14 --- /dev/null +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-scsi-vscsi.xml @@ -0,0 +1,31 @@ + + QEMUGuest1 + c7a5fdbd-edaf-9455-926a-d65c16db1809 + 219136 + 219136 + 1 + + hvm + + + + destroy + restart + destroy + + /usr/bin/qemu + + + +
+ + + + +
+ + + + + + diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c index 30bea3759e..754d898a0e 100644 --- a/tests/qemuxml2argvtest.c +++ b/tests/qemuxml2argvtest.c @@ -429,6 +429,8 @@ mymain(void) QEMU_CAPS_DRIVE, QEMU_CAPS_DEVICE, QEMU_CAPS_NODEFCONFIG); DO_TEST("disk-scsi-device-auto", false, QEMU_CAPS_DRIVE, QEMU_CAPS_DEVICE, QEMU_CAPS_NODEFCONFIG); + DO_TEST("disk-scsi-vscsi", false, + QEMU_CAPS_DRIVE, QEMU_CAPS_DEVICE, QEMU_CAPS_NODEFCONFIG); DO_TEST("disk-sata-device", false, QEMU_CAPS_DRIVE, QEMU_CAPS_DEVICE, QEMU_CAPS_NODEFCONFIG, QEMU_CAPS_ICH9_AHCI); diff --git a/tests/qemuxml2xmltest.c b/tests/qemuxml2xmltest.c index 2cc1f7dde6..f35caee696 100644 --- a/tests/qemuxml2xmltest.c +++ b/tests/qemuxml2xmltest.c @@ -139,6 +139,7 @@ mymain(void) DO_TEST("disk-drive-cache-v1-wb"); DO_TEST("disk-drive-cache-v1-none"); DO_TEST("disk-scsi-device"); + DO_TEST("disk-scsi-vscsi"); DO_TEST("graphics-listen-network"); DO_TEST("graphics-vnc"); DO_TEST("graphics-vnc-sasl");