* src/conf/domain_conf.h: Add new member "target" to struct
_virDomainDeviceDriveAddress.
* src/conf/domain_conf.c:
- virDomainDeviceDriveAddressParseXML: Parse "target".
- virDomainDeviceInfoFormat: new parameter "controllerType"
(disk controller type) and "bus" (disk bus type)" to
distiguish the lsilogic model and other models of disk
controller, if the model is lsilogic, then old address
format (without "target") is printed, otherwise new address
format (with "target") is printed.
- virDomainDiskDefFormat: New parameter "vmdef", to pass to
virDomainDiskFindControllerModel as an argument.
- New helper function virDomainDeviceInfoFormatCommon, which
is an simple wrapper of virDomainDeviceInfoFormat.
- Replace virDomainDeviceInfoFormat with
virDomainDeviceInfoFormatCommon accross the file, except
the one used for disk def formating.
* docs/schemas/domaincommon.rng: Define the rng schema for
"target".
* docs/formatdomain.html.in: Document "target".
---
docs/formatdomain.html.in | 13 +++++-
docs/schemas/domaincommon.rng | 10 +++++
src/conf/domain_conf.c | 87 ++++++++++++++++++++++++++++------------
src/conf/domain_conf.h | 1 +
4 files changed, 83 insertions(+), 28 deletions(-)
diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in
index 29497a0..f923c75 100644
--- a/docs/formatdomain.html.in
+++ b/docs/formatdomain.html.in
@@ -1094,7 +1094,14 @@
<target dev='hdc' bus='ide'/>
<readonly/>
</disk>
+ <disk type='block' device='lun'>
+ <driver name='qemu' type='raw'/>
+ <source dev='/dev/sda'/<
+ <target dev='sda' bus='scsi'/<
+ <address type='drive' controller='0' bus='0'
target='3' unit='0'/<
+ </disk>
</devices>
+
...</pre>
<dl>
@@ -1401,8 +1408,9 @@
Multifunction defaults to 'off'; any other value requires
QEMU 0.1.3 and <span class="since">libvirt 0.9.7</span>.
For a
"drive" controller, additional attributes
- <code>controller</code>, <code>bus</code>,
- and <code>unit</code> are available, each defaulting to 0.
+ <code>controller</code>, <code>bus</code>,
<code>target</code>
+ (<span class="since">libvirt 0.9.11</span>), and
<code>unit</code>
+ are available, each defaulting to 0.
</dd>
<dt><code>auth</code></dt>
<dd>If present, the <code>auth</code> element provides the
@@ -1592,6 +1600,7 @@
<dd>Drive addresses have the following additional
attributes: <code>controller</code> (a 2-digit controller
number), <code>bus</code> (a 2-digit bus number),
+ <code>target</code> (a 2-digit bus number),
and <code>unit</code> (a 2-digit unit number on the bus).
</dd>
<dt><code>type='virtio-serial'</code></dt>
diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng
index 724d7d0..3908733 100644
--- a/docs/schemas/domaincommon.rng
+++ b/docs/schemas/domaincommon.rng
@@ -2460,6 +2460,11 @@
</attribute>
</optional>
<optional>
+ <attribute name="target">
+ <ref name="driveTarget"/>
+ </attribute>
+ </optional>
+ <optional>
<attribute name="unit">
<ref name="driveUnit"/>
</attribute>
@@ -3147,6 +3152,11 @@
<param name="pattern">[0-9]{1,2}</param>
</data>
</define>
+ <define name="driveTarget">
+ <data type="string">
+ <param name="pattern">[0-9]{1,2}</param>
+ </data>
+ </define>
<define name="driveUnit">
<data type="string">
<param name="pattern">[0-9]{1,2}</param>
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index c36ac18..b8e5a78 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -240,7 +240,7 @@ VIR_ENUM_IMPL(virDomainControllerModelSCSI,
VIR_DOMAIN_CONTROLLER_MODEL_SCSI_LAS
"lsisas1068",
"vmpvscsi",
"ibmvscsi",
- "virtio-scsi")
+ "virtio-scsi");
VIR_ENUM_IMPL(virDomainControllerModelUSB, VIR_DOMAIN_CONTROLLER_MODEL_USB_LAST,
"piix3-uhci",
@@ -1913,11 +1913,13 @@ void virDomainDefClearDeviceAliases(virDomainDefPtr def)
/* Generate a string representation of a device address
- * @param address Device address to stringify
+ * @info address Device address to stringify
*/
static int ATTRIBUTE_NONNULL(2)
virDomainDeviceInfoFormat(virBufferPtr buf,
virDomainDeviceInfoPtr info,
+ int controllerModel,
+ int bus,
unsigned int flags)
{
if ((flags & VIR_DOMAIN_XML_INTERNAL_ALLOW_BOOT) && info->bootIndex)
@@ -1975,10 +1977,19 @@ virDomainDeviceInfoFormat(virBufferPtr buf,
break;
case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_DRIVE:
- virBufferAsprintf(buf, " controller='%d' bus='%d'
unit='%d'",
- info->addr.drive.controller,
- info->addr.drive.bus,
- info->addr.drive.unit);
+ if ((bus == VIR_DOMAIN_DISK_BUS_SCSI) &&
+ (controllerModel != VIR_DOMAIN_CONTROLLER_MODEL_SCSI_LSILOGIC)) {
+ virBufferAsprintf(buf, " controller='%d' bus='%d'
target='%d' unit='%d'",
+ info->addr.drive.controller,
+ info->addr.drive.bus,
+ info->addr.drive.target,
+ info->addr.drive.unit);
+ } else {
+ virBufferAsprintf(buf, " controller='%d' bus='%d'
unit='%d'",
+ info->addr.drive.controller,
+ info->addr.drive.bus,
+ info->addr.drive.unit);
+ }
break;
case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_VIRTIO_SERIAL:
@@ -2016,6 +2027,12 @@ virDomainDeviceInfoFormat(virBufferPtr buf,
return 0;
}
+static int ATTRIBUTE_NONNULL(2)
+virDomainDeviceInfoFormatCommon(virBufferPtr buf,
+ virDomainDeviceInfoPtr info,
+ unsigned int flags) {
+ return virDomainDeviceInfoFormat(buf, info, -1, -1, flags);
+}
static int
virDomainDevicePCIAddressParseXML(xmlNodePtr node,
@@ -2090,13 +2107,14 @@ static int
virDomainDeviceDriveAddressParseXML(xmlNodePtr node,
virDomainDeviceDriveAddressPtr addr)
{
- char *bus, *unit, *controller;
+ char *bus, *unit, *controller, *target;
int ret = -1;
memset(addr, 0, sizeof(*addr));
controller = virXMLPropString(node, "controller");
bus = virXMLPropString(node, "bus");
+ target = virXMLPropString(node, "target");
unit = virXMLPropString(node, "unit");
if (controller &&
@@ -2113,6 +2131,13 @@ virDomainDeviceDriveAddressParseXML(xmlNodePtr node,
goto cleanup;
}
+ if (target &&
+ virStrToLong_ui(target, NULL, 10, &addr->target) < 0) {
+ virDomainReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+ _("Cannot parse <address> 'target'
attribute"));
+ goto cleanup;
+ }
+
if (unit &&
virStrToLong_ui(unit, NULL, 10, &addr->unit) < 0) {
virDomainReportError(VIR_ERR_INTERNAL_ERROR, "%s",
@@ -2125,6 +2150,7 @@ virDomainDeviceDriveAddressParseXML(xmlNodePtr node,
cleanup:
VIR_FREE(controller);
VIR_FREE(bus);
+ VIR_FREE(target);
VIR_FREE(unit);
return ret;
}
@@ -3550,6 +3576,7 @@ virDomainControllerDefParseXML(xmlNodePtr node,
def->model = -1;
}
+ /* ESX detects the model itself if model is "auto". */
if (def->model == -1 ||
def->model == VIR_DOMAIN_CONTROLLER_MODEL_SCSI_AUTO)
def->model = virDomainControllerDefaultModel(dom, def->type);
@@ -10072,6 +10099,7 @@ virDomainLeaseDefFormat(virBufferPtr buf,
static int
virDomainDiskDefFormat(virBufferPtr buf,
+ virDomainDefPtr vmdef,
virDomainDiskDefPtr def,
unsigned int flags)
{
@@ -10088,6 +10116,7 @@ virDomainDiskDefFormat(virBufferPtr buf,
const char *startupPolicy =
virDomainStartupPolicyTypeToString(def->startupPolicy);
char uuidstr[VIR_UUID_STRING_BUFLEN];
+ int controllerModel = -1;
if (!type) {
virDomainReportError(VIR_ERR_INTERNAL_ERROR,
@@ -10297,7 +10326,13 @@ virDomainDiskDefFormat(virBufferPtr buf,
virBufferAdjustIndent(buf, -6);
}
- if (virDomainDeviceInfoFormat(buf, &def->info,
+ if (def->bus == VIR_DOMAIN_DISK_BUS_SCSI) {
+ controllerModel =
+ virDomainDiskFindControllerModel(vmdef, def,
+ VIR_DOMAIN_CONTROLLER_TYPE_SCSI);
+ }
+
+ if (virDomainDeviceInfoFormat(buf, &def->info, controllerModel, def->bus,
flags | VIR_DOMAIN_XML_INTERNAL_ALLOW_BOOT) < 0)
return -1;
@@ -10368,7 +10403,7 @@ virDomainControllerDefFormat(virBufferPtr buf,
if (virDomainDeviceInfoIsSet(&def->info, flags)) {
virBufferAddLit(buf, ">\n");
- if (virDomainDeviceInfoFormat(buf, &def->info, flags) < 0)
+ if (virDomainDeviceInfoFormatCommon(buf, &def->info, flags) < 0)
return -1;
virBufferAddLit(buf, " </controller>\n");
} else {
@@ -10445,7 +10480,7 @@ virDomainFSDefFormat(virBufferPtr buf,
if (def->readonly)
virBufferAddLit(buf, " <readonly/>\n");
- if (virDomainDeviceInfoFormat(buf, &def->info, flags) < 0)
+ if (virDomainDeviceInfoFormatCommon(buf, &def->info, flags) < 0)
return -1;
virBufferAddLit(buf, " </filesystem>\n");
@@ -10676,9 +10711,9 @@ virDomainNetDefFormat(virBufferPtr buf,
return -1;
virBufferAdjustIndent(buf, -6);
- if (virDomainDeviceInfoFormat(buf, &def->info,
- flags | VIR_DOMAIN_XML_INTERNAL_ALLOW_BOOT
- | VIR_DOMAIN_XML_INTERNAL_ALLOW_ROM) < 0)
+ if (virDomainDeviceInfoFormatCommon(buf, &def->info,
+ flags | VIR_DOMAIN_XML_INTERNAL_ALLOW_BOOT
+ | VIR_DOMAIN_XML_INTERNAL_ALLOW_ROM) < 0)
return -1;
virBufferAddLit(buf, " </interface>\n");
@@ -10870,7 +10905,7 @@ virDomainChrDefFormat(virBufferPtr buf,
}
if (virDomainDeviceInfoIsSet(&def->info, flags)) {
- if (virDomainDeviceInfoFormat(buf, &def->info, flags) < 0)
+ if (virDomainDeviceInfoFormatCommon(buf, &def->info, flags) < 0)
return -1;
}
@@ -10923,7 +10958,7 @@ virDomainSmartcardDefFormat(virBufferPtr buf,
_("unexpected smartcard type %d"), def->type);
return -1;
}
- if (virDomainDeviceInfoFormat(buf, &def->info, flags) < 0)
+ if (virDomainDeviceInfoFormatCommon(buf, &def->info, flags) < 0)
return -1;
virBufferAddLit(buf, " </smartcard>\n");
return 0;
@@ -10946,7 +10981,7 @@ virDomainSoundDefFormat(virBufferPtr buf,
if (virDomainDeviceInfoIsSet(&def->info, flags)) {
virBufferAddLit(buf, ">\n");
- if (virDomainDeviceInfoFormat(buf, &def->info, flags) < 0)
+ if (virDomainDeviceInfoFormatCommon(buf, &def->info, flags) < 0)
return -1;
virBufferAddLit(buf, " </sound>\n");
} else {
@@ -10974,7 +11009,7 @@ virDomainMemballoonDefFormat(virBufferPtr buf,
if (virDomainDeviceInfoIsSet(&def->info, flags)) {
virBufferAddLit(buf, ">\n");
- if (virDomainDeviceInfoFormat(buf, &def->info, flags) < 0)
+ if (virDomainDeviceInfoFormatCommon(buf, &def->info, flags) < 0)
return -1;
virBufferAddLit(buf, " </memballoon>\n");
} else {
@@ -11021,7 +11056,7 @@ virDomainWatchdogDefFormat(virBufferPtr buf,
if (virDomainDeviceInfoIsSet(&def->info, flags)) {
virBufferAddLit(buf, ">\n");
- if (virDomainDeviceInfoFormat(buf, &def->info, flags) < 0)
+ if (virDomainDeviceInfoFormatCommon(buf, &def->info, flags) < 0)
return -1;
virBufferAddLit(buf, " </watchdog>\n");
} else {
@@ -11072,7 +11107,7 @@ virDomainVideoDefFormat(virBufferPtr buf,
virBufferAddLit(buf, "/>\n");
}
- if (virDomainDeviceInfoFormat(buf, &def->info, flags) < 0)
+ if (virDomainDeviceInfoFormatCommon(buf, &def->info, flags) < 0)
return -1;
virBufferAddLit(buf, " </video>\n");
@@ -11104,7 +11139,7 @@ virDomainInputDefFormat(virBufferPtr buf,
if (virDomainDeviceInfoIsSet(&def->info, flags)) {
virBufferAddLit(buf, ">\n");
- if (virDomainDeviceInfoFormat(buf, &def->info, flags) < 0)
+ if (virDomainDeviceInfoFormatCommon(buf, &def->info, flags) < 0)
return -1;
virBufferAddLit(buf, " </input>\n");
} else {
@@ -11510,9 +11545,9 @@ virDomainHostdevDefFormat(virBufferPtr buf,
virBufferAddLit(buf, " </source>\n");
- if (virDomainDeviceInfoFormat(buf, &def->info,
- flags | VIR_DOMAIN_XML_INTERNAL_ALLOW_BOOT
- | VIR_DOMAIN_XML_INTERNAL_ALLOW_ROM) < 0)
+ if (virDomainDeviceInfoFormatCommon(buf, &def->info,
+ flags | VIR_DOMAIN_XML_INTERNAL_ALLOW_BOOT
+ | VIR_DOMAIN_XML_INTERNAL_ALLOW_ROM) < 0)
return -1;
virBufferAddLit(buf, " </hostdev>\n");
@@ -11532,7 +11567,7 @@ virDomainRedirdevDefFormat(virBufferPtr buf,
virBufferAsprintf(buf, " <redirdev bus='%s'", bus);
if (virDomainChrSourceDefFormat(buf, &def->source.chr, false, flags) < 0)
return -1;
- if (virDomainDeviceInfoFormat(buf, &def->info, flags) < 0)
+ if (virDomainDeviceInfoFormatCommon(buf, &def->info, flags) < 0)
return -1;
virBufferAddLit(buf, " </redirdev>\n");
@@ -11556,7 +11591,7 @@ virDomainHubDefFormat(virBufferPtr buf,
if (virDomainDeviceInfoIsSet(&def->info, flags)) {
virBufferAddLit(buf, ">\n");
- if (virDomainDeviceInfoFormat(buf, &def->info, flags) < 0)
+ if (virDomainDeviceInfoFormatCommon(buf, &def->info, flags) < 0)
return -1;
virBufferAddLit(buf, " </hub>\n");
} else {
@@ -11937,7 +11972,7 @@ virDomainDefFormatInternal(virDomainDefPtr def,
def->emulator);
for (n = 0 ; n < def->ndisks ; n++)
- if (virDomainDiskDefFormat(buf, def->disks[n], flags) < 0)
+ if (virDomainDiskDefFormat(buf, def, def->disks[n], flags) < 0)
goto cleanup;
for (n = 0 ; n < def->ncontrollers ; n++)
diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
index fed7cc3..596be4d 100644
--- a/src/conf/domain_conf.h
+++ b/src/conf/domain_conf.h
@@ -106,6 +106,7 @@ typedef virDomainDeviceDriveAddress *virDomainDeviceDriveAddressPtr;
struct _virDomainDeviceDriveAddress {
unsigned int controller;
unsigned int bus;
+ unsigned int target;
unsigned int unit;
};
--
1.7.7.3