}
if (disk->info.type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE &&
- virDomainDiskDefAssignAddress(xmlopt, disk) < 0)
+ virDomainDiskDefAssignAddress(xmlopt, disk, def) < 0)
return -1;
}
int
virDomainDiskDefAssignAddress(virDomainXMLOptionPtr xmlopt,
- virDomainDiskDefPtr def)
+ virDomainDiskDefPtr def,
+ const virDomainDef *vmdef)
{
int idx = virDiskNameToIndex(def->dst);
if (idx < 0) {
unit = idx % 7;
}
+ if (virDomainDriveAddressIsUsedByHostdev(vmdef,
+ VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_SCSI,
+ controller, 0, 0, unit)) {
+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+ _("using disk target name '%s' conflicts with "
+ "SCSI host device address controller='%u' "
+ "bus='%u' target='%u' unit='%u"),
+ def->dst, controller, 0, 0, unit);
+ return -1;
+ }
+
def->info.addr.drive.controller = controller;
def->info.addr.drive.bus = 0;
def->info.addr.drive.target = 0;
static int
-virVMXVerifyDiskAddress(virDomainXMLOptionPtr xmlopt, virDomainDiskDefPtr disk)
+virVMXVerifyDiskAddress(virDomainXMLOptionPtr xmlopt,
+ virDomainDiskDefPtr disk,
+ virDomainDefPtr vmdef)
{
virDomainDiskDef def;
virDomainDeviceDriveAddressPtr drive;
def.dst = disk->dst;
def.bus = disk->bus;
- if (virDomainDiskDefAssignAddress(xmlopt, &def) < 0) {
+ if (virDomainDiskDefAssignAddress(xmlopt, &def, vmdef) < 0) {
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
_("Could not verify disk address"));
return -1;
if (virVMXParseDisk(ctx, xmlopt, conf, VIR_DOMAIN_DISK_DEVICE_DISK,
VIR_DOMAIN_DISK_BUS_SCSI, controller, unit,
- &def->disks[def->ndisks]) < 0) {
+ &def->disks[def->ndisks], def) < 0) {
goto cleanup;
}
if (virVMXParseDisk(ctx, xmlopt, conf, VIR_DOMAIN_DISK_DEVICE_CDROM,
VIR_DOMAIN_DISK_BUS_SCSI, controller, unit,
- &def->disks[def->ndisks]) < 0) {
+ &def->disks[def->ndisks], def) < 0) {
goto cleanup;
}
for (unit = 0; unit < 2; ++unit) {
if (virVMXParseDisk(ctx, xmlopt, conf, VIR_DOMAIN_DISK_DEVICE_DISK,
VIR_DOMAIN_DISK_BUS_IDE, bus, unit,
- &def->disks[def->ndisks]) < 0) {
+ &def->disks[def->ndisks], def) < 0) {
goto cleanup;
}
if (virVMXParseDisk(ctx, xmlopt, conf, VIR_DOMAIN_DISK_DEVICE_CDROM,
VIR_DOMAIN_DISK_BUS_IDE, bus, unit,
- &def->disks[def->ndisks]) < 0) {
+ &def->disks[def->ndisks], def) < 0) {
goto cleanup;
}
for (unit = 0; unit < 2; ++unit) {
if (virVMXParseDisk(ctx, xmlopt, conf, VIR_DOMAIN_DISK_DEVICE_FLOPPY,
VIR_DOMAIN_DISK_BUS_FDC, 0, unit,
- &def->disks[def->ndisks]) < 0) {
+ &def->disks[def->ndisks], def) < 0) {
goto cleanup;
}
int
virVMXParseDisk(virVMXContext *ctx, virDomainXMLOptionPtr xmlopt, virConfPtr conf,
int device, int busType, int controllerOrBus, int unit,
- virDomainDiskDefPtr *def)
+ virDomainDiskDefPtr *def, virDomainDefPtr vmdef)
{
/*
* device = {VIR_DOMAIN_DISK_DEVICE_DISK,
goto cleanup;
}
- if (virDomainDiskDefAssignAddress(xmlopt, *def) < 0) {
+ if (virDomainDiskDefAssignAddress(xmlopt, *def, vmdef) < 0) {
virReportError(VIR_ERR_INTERNAL_ERROR,
_("Could not assign address to disk '%s'"),
virDomainDiskGetSource(*def));
/* def:disks */
for (i = 0; i < def->ndisks; ++i) {
- if (virVMXVerifyDiskAddress(xmlopt, def->disks[i]) < 0 ||
+ if (virVMXVerifyDiskAddress(xmlopt, def->disks[i], def) < 0 ||
virVMXHandleLegacySCSIDiskDriverName(def, def->disks[i]) < 0) {
goto cleanup;
}