[libvirt] [PATCH]Support virtio-scsi disk XML with tag 'model'

Chen Hanxiao chenhanxiao at cn.fujitsu.com
Mon Nov 12 09:18:41 UTC 2012


From: ChenHanxiao <chenhanxiao at cn.fujitsu.com>

If we add a virtio-disk, we need to add a SCSI controller with
model 'virtio-scsi'.
This patch allows libvirt to analyze disks XML with tag 'model':

<disk type='block' device='disk'>
    <driver name='qemu' type='raw'/>
    <source dev='/dev/sdb'/>
    <target dev='sda' bus='scsi' model = 'virtio-scsi'/>
</disk>

If we got a disks XML with bus='scsi' model = 'virtio-scsi',
we'll add a SCSI controller with model 'virtio-scsi' automatically.

Signed-off-by: ChenHanxiao <chenhanxiao at cn.fujitsu.com>
---
 src/conf/domain_conf.c |   29 ++++++++++++++++++++++++-----
 src/conf/domain_conf.h |    2 ++
 2 files changed, 26 insertions(+), 5 deletions(-)

diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index 99f03a9..0032df4 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -3528,6 +3528,7 @@ virDomainDiskDefParseXML(virCapsPtr caps,
     virDomainDiskHostDefPtr hosts = NULL;
     int nhosts = 0;
     char *bus = NULL;
+    char *model = NULL;
     char *cachetag = NULL;
     char *error_policy = NULL;
     char *rerror_policy = NULL;
@@ -3667,6 +3668,7 @@ virDomainDiskDefParseXML(virCapsPtr caps,
                 target = virXMLPropString(cur, "dev");
                 bus = virXMLPropString(cur, "bus");
                 tray = virXMLPropString(cur, "tray");
+                model = virXMLPropString(cur, "model");
 
                 /* HACK: Work around for compat with Xen
                  * driver in previous libvirt releases */
@@ -4015,6 +4017,14 @@ virDomainDiskDefParseXML(virCapsPtr caps,
         }
     }
 
+    if (model) {
+        if ((def->model = virDomainControllerModelSCSITypeFromString(model)) < 0) {
+            virReportError(VIR_ERR_INTERNAL_ERROR,
+                            _("unknown disk bus model type '%s'"), bus);
+            goto error;
+        }
+    }
+
     if (tray) {
         if ((def->tray_status = virDomainDiskTrayTypeFromString(tray)) < 0) {
             virReportError(VIR_ERR_XML_ERROR,
@@ -4221,6 +4231,7 @@ virDomainDiskDefParseXML(virCapsPtr caps,
 
 cleanup:
     VIR_FREE(bus);
+    VIR_FREE(model);
     VIR_FREE(type);
     VIR_FREE(snapshot);
     VIR_FREE(rawio);
@@ -8499,6 +8510,7 @@ virDomainLookupVcpuPin(virDomainDefPtr def,
 
 static int virDomainDefMaybeAddController(virDomainDefPtr def,
                                           int type,
+                                          int model,
                                           int idx)
 {
     int found = 0;
@@ -8521,7 +8533,7 @@ static int virDomainDefMaybeAddController(virDomainDefPtr def,
 
     cont->type = type;
     cont->idx = idx;
-    cont->model = -1;
+    cont->model = model;
 
     if (cont->type == VIR_DOMAIN_CONTROLLER_TYPE_VIRTIO_SERIAL) {
         cont->opts.vioserial.ports = -1;
@@ -9508,7 +9520,8 @@ static virDomainDefPtr virDomainDefParseXML(virCapsPtr caps,
     if (def->virtType == VIR_DOMAIN_VIRT_QEMU ||
         def->virtType == VIR_DOMAIN_VIRT_KQEMU ||
         def->virtType == VIR_DOMAIN_VIRT_KVM)
-        if (virDomainDefMaybeAddController(def, VIR_DOMAIN_CONTROLLER_TYPE_USB, 0) < 0)
+        if (virDomainDefMaybeAddController(def, VIR_DOMAIN_CONTROLLER_TYPE_USB, 
+                VIR_DOMAIN_CONTROLLER_MODEL_UNDEF, 0) < 0)
             goto error;
 
     /* analysis of the resource leases */
@@ -11390,6 +11403,7 @@ static int virDomainDefAddDiskControllersForType(virDomainDefPtr def,
 {
     int i;
     int maxController = -1;
+    int model = VIR_DOMAIN_CONTROLLER_MODEL_UNDEF;
 
     for (i = 0 ; i < def->ndisks ; i++) {
         if (def->disks[i]->bus != diskBus)
@@ -11400,10 +11414,12 @@ static int virDomainDefAddDiskControllersForType(virDomainDefPtr def,
 
         if ((int)def->disks[i]->info.addr.drive.controller > maxController)
             maxController = def->disks[i]->info.addr.drive.controller;
+
+        model = def->disks[i]->model;
     }
 
     for (i = 0 ; i <= maxController ; i++) {
-        if (virDomainDefMaybeAddController(def, controllerType, i) < 0)
+        if (virDomainDefMaybeAddController(def, controllerType, model, i) < 0)
             return -1;
     }
 
@@ -11425,7 +11441,8 @@ static int virDomainDefMaybeAddVirtioSerialController(virDomainDefPtr def)
                 idx = channel->info.addr.vioserial.controller;
 
             if (virDomainDefMaybeAddController(def,
-                VIR_DOMAIN_CONTROLLER_TYPE_VIRTIO_SERIAL, idx) < 0)
+                    VIR_DOMAIN_CONTROLLER_TYPE_VIRTIO_SERIAL, 
+                    VIR_DOMAIN_CONTROLLER_MODEL_UNDEF, idx) < 0)
                 return -1;
         }
     }
@@ -11440,7 +11457,8 @@ static int virDomainDefMaybeAddVirtioSerialController(virDomainDefPtr def)
                 idx = console->info.addr.vioserial.controller;
 
             if (virDomainDefMaybeAddController(def,
-                VIR_DOMAIN_CONTROLLER_TYPE_VIRTIO_SERIAL, idx) < 0)
+                    VIR_DOMAIN_CONTROLLER_TYPE_VIRTIO_SERIAL, 
+                    VIR_DOMAIN_CONTROLLER_MODEL_UNDEF, idx) < 0)
                 return -1;
         }
     }
@@ -11480,6 +11498,7 @@ virDomainDefMaybeAddSmartcardController(virDomainDefPtr def)
 
         if (virDomainDefMaybeAddController(def,
                                            VIR_DOMAIN_CONTROLLER_TYPE_CCID,
+                                           VIR_DOMAIN_CONTROLLER_MODEL_UNDEF,
                                            idx) < 0)
             return -1;
     }
diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
index 6539281..ba7accf 100644
--- a/src/conf/domain_conf.h
+++ b/src/conf/domain_conf.h
@@ -553,6 +553,7 @@ struct _virDomainDiskDef {
     int type;
     int device;
     int bus;
+    int model;
     char *src;
     char *dst;
     int tray_status;
@@ -672,6 +673,7 @@ struct _virDomainControllerDef {
     virDomainDeviceInfo info;
 };
 
+#define VIR_DOMAIN_CONTROLLER_MODEL_UNDEF -1
 
 /* Two types of disk backends */
 enum virDomainFSType {
-- 
1.7.1




More information about the libvir-list mailing list