And adding controller implicitly, ESX detects the default model
automatically itself, and partly depends on the guest os. So we
only try to set the default model for QEMU/KVM driver.
---
src/conf/domain_conf.c | 32 ++++++++++++++++++++++++++++++--
1 files changed, 30 insertions(+), 2 deletions(-)
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index 2da41f8..ccdb80d 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -2502,6 +2502,28 @@ virDomainParseLegacyDeviceAddress(char *devaddr,
return 0;
}
+static int
+virDomainControllerDefaultModel(virDomainDefPtr def,
+ int type)
+{
+ switch(def->virtType) {
+ case VIR_DOMAIN_VIRT_TEST:
+ case VIR_DOMAIN_VIRT_QEMU:
+ case VIR_DOMAIN_VIRT_KQEMU:
+ case VIR_DOMAIN_VIRT_KVM:
+ if (type == VIR_DOMAIN_CONTROLLER_TYPE_SCSI) {
+ if (STREQ(def->os.arch, "ppc64") &&
+ STREQ(def->os.machine, "pseries")) {
+ return VIR_DOMAIN_CONTROLLER_MODEL_SCSI_IBMVSCSI;
+ } else {
+ return VIR_DOMAIN_CONTROLLER_MODEL_SCSI_LSILOGIC;
+ }
+ }
+ default:
+ return -1;
+ }
+}
+
int
virDomainDiskDefAssignAddress(virCapsPtr caps, virDomainDiskDefPtr def)
{
@@ -3469,6 +3491,7 @@ virDomainControllerModelTypeFromString(const
virDomainControllerDefPtr def,
*/
static virDomainControllerDefPtr
virDomainControllerDefParseXML(xmlNodePtr node,
+ virDomainDefPtr dom,
unsigned int flags)
{
virDomainControllerDefPtr def;
@@ -3510,6 +3533,10 @@ virDomainControllerDefParseXML(xmlNodePtr node,
def->model = -1;
}
+ if (def->model == -1 ||
+ def->model == VIR_DOMAIN_CONTROLLER_MODEL_SCSI_AUTO)
+ def->model = virDomainControllerDefaultModel(dom, def->type);
+
if (virDomainDeviceInfoParseXML(node, NULL, &def->info, flags) < 0)
goto error;
@@ -6562,7 +6589,7 @@ virDomainDeviceDefPtr virDomainDeviceDefParse(virCapsPtr caps,
goto error;
} else if (xmlStrEqual(node->name, BAD_CAST "controller")) {
dev->type = VIR_DOMAIN_DEVICE_CONTROLLER;
- if (!(dev->data.controller = virDomainControllerDefParseXML(node, flags)))
+ if (!(dev->data.controller = virDomainControllerDefParseXML(node, def,
flags)))
goto error;
} else if (xmlStrEqual(node->name, BAD_CAST "graphics")) {
dev->type = VIR_DOMAIN_DEVICE_GRAPHICS;
@@ -7124,7 +7151,7 @@ static int virDomainDefMaybeAddController(virDomainDefPtr def,
cont->type = type;
cont->idx = idx;
- cont->model = -1;
+ cont->model = virDomainControllerDefaultModel(def, type);
if (cont->type == VIR_DOMAIN_CONTROLLER_TYPE_VIRTIO_SERIAL) {
cont->opts.vioserial.ports = -1;
@@ -7693,6 +7720,7 @@ static virDomainDefPtr virDomainDefParseXML(virCapsPtr caps,
goto no_memory;
for (i = 0 ; i < n ; i++) {
virDomainControllerDefPtr controller = virDomainControllerDefParseXML(nodes[i],
+ def,
flags);
if (!controller)
goto error;
--
1.7.7.3