[libvirt] [PATCH 2/3] Add optional model attribute to the controller element

Matthias Bolte matthias.bolte at googlemail.com
Thu Jun 17 21:15:43 UTC 2010


This is a step towards controller support for the ESX driver.
---
 docs/schemas/domain.rng |    9 +++++++++
 src/conf/domain_conf.c  |   34 ++++++++++++++++++++++++++++++++++
 src/conf/domain_conf.h  |   11 +++++++++++
 src/qemu/qemu_driver.c  |    1 +
 4 files changed, 55 insertions(+), 0 deletions(-)

diff --git a/docs/schemas/domain.rng b/docs/schemas/domain.rng
index 9121da3..6f3408d 100644
--- a/docs/schemas/domain.rng
+++ b/docs/schemas/domain.rng
@@ -669,6 +669,15 @@
         <ref name="unsignedInt"/>
       </attribute>
       <optional>
+        <attribute name="model">
+          <choice>
+            <value>buslogic</value>
+            <value>lsilogic</value>
+            <value>lsisas1068</value>
+          </choice>
+        </attribute>
+      </optional>
+      <optional>
         <ref name="address"/>
       </optional>
     </element>
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index cac4042..182d8ab 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -139,6 +139,11 @@ VIR_ENUM_IMPL(virDomainController, VIR_DOMAIN_CONTROLLER_TYPE_LAST,
               "sata",
               "virtio-serial")
 
+VIR_ENUM_IMPL(virDomainControllerModel, VIR_DOMAIN_CONTROLLER_MODEL_LAST,
+              "buslogic",
+              "lsilogic",
+              "lsisas1068")
+
 VIR_ENUM_IMPL(virDomainFS, VIR_DOMAIN_FS_TYPE_LAST,
               "mount",
               "block",
@@ -1670,6 +1675,7 @@ virDomainControllerDefParseXML(xmlNodePtr node,
     virDomainControllerDefPtr def;
     char *type = NULL;
     char *idx = NULL;
+    char *model = NULL;
 
     if (VIR_ALLOC(def) < 0) {
         virReportOOMError();
@@ -1694,6 +1700,17 @@ virDomainControllerDefParseXML(xmlNodePtr node,
         }
     }
 
+    model = virXMLPropString(node, "model");
+    if (model) {
+        if ((def->model = virDomainControllerModelTypeFromString(model)) < 0) {
+            virDomainReportError(VIR_ERR_INTERNAL_ERROR,
+                                 _("Unknown model type '%s'"), model);
+            goto error;
+        }
+    } else {
+        def->model = -1;
+    }
+
     if (virDomainDeviceInfoParseXML(node, &def->info, flags) < 0)
         goto error;
 
@@ -1745,6 +1762,7 @@ virDomainControllerDefParseXML(xmlNodePtr node,
 cleanup:
     VIR_FREE(type);
     VIR_FREE(idx);
+    VIR_FREE(model);
 
     return def;
 
@@ -4819,6 +4837,7 @@ static int virDomainDefMaybeAddController(virDomainDefPtr def,
 
     cont->type = type;
     cont->idx = idx;
+    cont->model = -1;
 
     if (cont->type == VIR_DOMAIN_CONTROLLER_TYPE_VIRTIO_SERIAL) {
         cont->opts.vioserial.ports = -1;
@@ -5232,6 +5251,7 @@ virDomainControllerDefFormat(virBufferPtr buf,
                              int flags)
 {
     const char *type = virDomainControllerTypeToString(def->type);
+    const char *model = NULL;
 
     if (!type) {
         virDomainReportError(VIR_ERR_INTERNAL_ERROR,
@@ -5239,10 +5259,24 @@ virDomainControllerDefFormat(virBufferPtr buf,
         return -1;
     }
 
+    if (def->model != -1) {
+        model = virDomainControllerModelTypeToString(def->model);
+
+        if (!model) {
+            virDomainReportError(VIR_ERR_INTERNAL_ERROR,
+                                 _("unexpected model type %d"), def->model);
+            return -1;
+        }
+    }
+
     virBufferVSprintf(buf,
                       "    <controller type='%s' index='%d'",
                       type, def->idx);
 
+    if (model) {
+        virBufferEscapeString(buf, " model='%s'", model);
+    }
+
     switch (def->type) {
     case VIR_DOMAIN_CONTROLLER_TYPE_VIRTIO_SERIAL:
         if (def->opts.vioserial.ports != -1) {
diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
index 701849f..55893d6 100644
--- a/src/conf/domain_conf.h
+++ b/src/conf/domain_conf.h
@@ -194,6 +194,15 @@ enum virDomainControllerType {
     VIR_DOMAIN_CONTROLLER_TYPE_LAST
 };
 
+
+enum virDomainControllerModel {
+    VIR_DOMAIN_CONTROLLER_MODEL_BUSLOGIC,
+    VIR_DOMAIN_CONTROLLER_MODEL_LSILOGIC,
+    VIR_DOMAIN_CONTROLLER_MODEL_LSISAS1068,
+
+    VIR_DOMAIN_CONTROLLER_MODEL_LAST
+};
+
 typedef struct _virDomainVirtioSerialOpts virDomainVirtioSerialOpts;
 typedef virDomainVirtioSerialOpts *virDomainVirtioSerialOptsPtr;
 struct _virDomainVirtioSerialOpts {
@@ -207,6 +216,7 @@ typedef virDomainControllerDef *virDomainControllerDefPtr;
 struct _virDomainControllerDef {
     int type;
     int idx;
+    int model; /* -1 == undef */
     union {
         virDomainVirtioSerialOpts vioserial;
     } opts;
@@ -1073,6 +1083,7 @@ VIR_ENUM_DECL(virDomainDiskBus)
 VIR_ENUM_DECL(virDomainDiskCache)
 VIR_ENUM_DECL(virDomainDiskErrorPolicy)
 VIR_ENUM_DECL(virDomainController)
+VIR_ENUM_DECL(virDomainControllerModel)
 VIR_ENUM_DECL(virDomainFS)
 VIR_ENUM_DECL(virDomainNet)
 VIR_ENUM_DECL(virDomainChrTarget)
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index c7923bc..25caa29 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -7260,6 +7260,7 @@ qemuDomainFindOrCreateSCSIDiskController(struct qemud_driver *driver,
     }
     cont->type = VIR_DOMAIN_CONTROLLER_TYPE_SCSI;
     cont->idx = 0;
+    cont->model = -1;
 
     VIR_INFO0("No SCSI controller present, hotplugging one");
     if (qemudDomainAttachPciControllerDevice(driver,
-- 
1.7.0.4




More information about the libvir-list mailing list