[libvirt] [PATCH 03/10] conf: Set default scsi controller model when parsing

Osier Yang jyang at redhat.com
Fri Feb 17 17:18:00 UTC 2012


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




More information about the libvir-list mailing list