From: ChenHanxiao <chenhanxiao(a)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(a)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