@@ -650,7 +650,12 @@ virDomainDiskDefParseXML(virConnectPtr conn,
char *driverType = NULL;
char *source = NULL;
char *target = NULL;
+ char *controller = NULL;
+ char *bus_id = NULL;
+ char *unit_id = NULL;
+ char *controller_id = NULL;
char *bus = NULL;
+ char *unit = NULL;
char *cachetag = NULL;
char *devaddr = NULL;
virStorageEncryptionPtr encryption = NULL;
@@ -694,12 +699,18 @@ virDomainDiskDefParseXML(virConnectPtr conn,
(xmlStrEqual(cur->name, BAD_CAST "target"))) {
target = virXMLPropString(cur, "dev");
bus = virXMLPropString(cur, "bus");
+ unit = virXMLPropString(cur, "unit");
/* HACK: Work around for compat with Xen
* driver in previous libvirt releases */
if (target &&
STRPREFIX(target, "ioemu:"))
memmove(target, target+6, strlen(target)-5);
+ } else if ((controller == NULL) &&
+ (xmlStrEqual(cur->name, BAD_CAST "controller"))) {
+ controller_id = virXMLPropString(cur, "id");
+ bus_id = virXMLPropString(cur, "bus");
+ unit_id = virXMLPropString(cur, "unit");
} else if ((driverName == NULL) &&
(xmlStrEqual(cur->name, BAD_CAST "driver"))) {
driverName = virXMLPropString(cur, "name");
@@ -800,6 +811,24 @@ virDomainDiskDefParseXML(virConnectPtr conn,
}
}
+ if (controller) {
+ def->controller_id = controller_id;
+
+ def->bus_id = -1;
+ if (bus_id && virStrToLong_i(bus_id, NULL, 10, &def->bus_id) < 0) {
+ virDomainReportError(conn, VIR_ERR_INTERNAL_ERROR, "%s",
+ _("Cannot parse <controller> 'bus' attribute"));
+ goto error;
+ }
+
+ def->unit_id = -1;
+ if (unit_id && virStrToLong_i(unit_id, NULL, 10, &def->unit_id) < 0) {
+ virDomainReportError(conn, VIR_ERR_INTERNAL_ERROR, "%s",
+ _("Cannot parse <controller> 'unit' attribute"));
+ goto error;
+ }
+ }
+
if (def->device == VIR_DOMAIN_DISK_DEVICE_FLOPPY &&
def->bus != VIR_DOMAIN_DISK_BUS_FDC) {
virDomainReportError(conn, VIR_ERR_INTERNAL_ERROR,
@@ -105,9 +105,12 @@ typedef virDomainDiskDef *virDomainDiskDefPtr;
struct _virDomainDiskDef {
int type;
int device;
- int bus;
+ int bus; /* Bus type, e.g. scsi or ide */
+ int bus_id; /* Bus number on the controller */
+ int unit_id; /* Unit on the controller */
char *src;
char *dst;
+ char *controller_id;
char *driverName;
char *driverType;
char *serial;