mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-03-07 17:28:15 +00:00
conf: Check for hostdev conflicts when assign default disk address
https://bugzilla.redhat.com/show_bug.cgi?id=1210587 (completed) When generating the default drive address for a SCSI <disk> device, check the generated address to ensure it doesn't conflict with a SCSI <hostdev> address. The <disk> address generation algorithm uses the <target> "dev" name in order to determine which controller and unit in order to place the device. Since a SCSI <hostdev> device doesn't require a target device name, its placement on the guest SCSI address "could" conflict. For instance, if a SCSI <hostdev> exists at controller=0 unit=0 and an attempt to hotplug 'sda' into the guest made, there would be a conflict if the <hostdev> is already using /dev/sda.
This commit is contained in:
parent
d6ea4adbfc
commit
1b08cc170a
@ -4127,7 +4127,7 @@ virDomainDeviceDefPostParseInternal(virDomainDeviceDefPtr dev,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (disk->info.type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE &&
|
if (disk->info.type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE &&
|
||||||
virDomainDiskDefAssignAddress(xmlopt, disk) < 0)
|
virDomainDiskDefAssignAddress(xmlopt, disk, def) < 0)
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -5929,7 +5929,8 @@ virDomainDiskDiffersSourceOnly(virDomainDiskDefPtr disk,
|
|||||||
|
|
||||||
int
|
int
|
||||||
virDomainDiskDefAssignAddress(virDomainXMLOptionPtr xmlopt,
|
virDomainDiskDefAssignAddress(virDomainXMLOptionPtr xmlopt,
|
||||||
virDomainDiskDefPtr def)
|
virDomainDiskDefPtr def,
|
||||||
|
const virDomainDef *vmdef)
|
||||||
{
|
{
|
||||||
int idx = virDiskNameToIndex(def->dst);
|
int idx = virDiskNameToIndex(def->dst);
|
||||||
if (idx < 0) {
|
if (idx < 0) {
|
||||||
@ -5965,6 +5966,17 @@ virDomainDiskDefAssignAddress(virDomainXMLOptionPtr xmlopt,
|
|||||||
unit = idx % 7;
|
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.controller = controller;
|
||||||
def->info.addr.drive.bus = 0;
|
def->info.addr.drive.bus = 0;
|
||||||
def->info.addr.drive.target = 0;
|
def->info.addr.drive.target = 0;
|
||||||
|
@ -2755,7 +2755,8 @@ int virDomainDiskInsert(virDomainDefPtr def,
|
|||||||
void virDomainDiskInsertPreAlloced(virDomainDefPtr def,
|
void virDomainDiskInsertPreAlloced(virDomainDefPtr def,
|
||||||
virDomainDiskDefPtr disk);
|
virDomainDiskDefPtr disk);
|
||||||
int virDomainDiskDefAssignAddress(virDomainXMLOptionPtr xmlopt,
|
int virDomainDiskDefAssignAddress(virDomainXMLOptionPtr xmlopt,
|
||||||
virDomainDiskDefPtr def);
|
virDomainDiskDefPtr def,
|
||||||
|
const virDomainDef *vmdef);
|
||||||
|
|
||||||
virDomainDiskDefPtr
|
virDomainDiskDefPtr
|
||||||
virDomainDiskRemove(virDomainDefPtr def, size_t i);
|
virDomainDiskRemove(virDomainDefPtr def, size_t i);
|
||||||
|
@ -12105,7 +12105,7 @@ qemuParseCommandLineDisk(virDomainXMLOptionPtr xmlopt,
|
|||||||
else
|
else
|
||||||
def->dst[2] = 'a' + idx;
|
def->dst[2] = 'a' + idx;
|
||||||
|
|
||||||
if (virDomainDiskDefAssignAddress(xmlopt, def) < 0) {
|
if (virDomainDiskDefAssignAddress(xmlopt, def, dom) < 0) {
|
||||||
virReportError(VIR_ERR_INTERNAL_ERROR,
|
virReportError(VIR_ERR_INTERNAL_ERROR,
|
||||||
_("invalid device name '%s'"), def->dst);
|
_("invalid device name '%s'"), def->dst);
|
||||||
virDomainDiskDefFree(def);
|
virDomainDiskDefFree(def);
|
||||||
@ -13248,7 +13248,7 @@ qemuParseCommandLine(virCapsPtr qemuCaps,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (virDomainDiskDefAssignAddress(xmlopt, disk) < 0) {
|
if (virDomainDiskDefAssignAddress(xmlopt, disk, def) < 0) {
|
||||||
virReportError(VIR_ERR_INTERNAL_ERROR,
|
virReportError(VIR_ERR_INTERNAL_ERROR,
|
||||||
_("Cannot assign address for device name '%s'"),
|
_("Cannot assign address for device name '%s'"),
|
||||||
disk->dst);
|
disk->dst);
|
||||||
|
@ -960,7 +960,9 @@ virVMXFloppyDiskNameToUnit(const char *name, int *unit)
|
|||||||
|
|
||||||
|
|
||||||
static int
|
static int
|
||||||
virVMXVerifyDiskAddress(virDomainXMLOptionPtr xmlopt, virDomainDiskDefPtr disk)
|
virVMXVerifyDiskAddress(virDomainXMLOptionPtr xmlopt,
|
||||||
|
virDomainDiskDefPtr disk,
|
||||||
|
virDomainDefPtr vmdef)
|
||||||
{
|
{
|
||||||
virDomainDiskDef def;
|
virDomainDiskDef def;
|
||||||
virDomainDeviceDriveAddressPtr drive;
|
virDomainDeviceDriveAddressPtr drive;
|
||||||
@ -979,7 +981,7 @@ virVMXVerifyDiskAddress(virDomainXMLOptionPtr xmlopt, virDomainDiskDefPtr disk)
|
|||||||
def.dst = disk->dst;
|
def.dst = disk->dst;
|
||||||
def.bus = disk->bus;
|
def.bus = disk->bus;
|
||||||
|
|
||||||
if (virDomainDiskDefAssignAddress(xmlopt, &def) < 0) {
|
if (virDomainDiskDefAssignAddress(xmlopt, &def, vmdef) < 0) {
|
||||||
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
|
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
|
||||||
_("Could not verify disk address"));
|
_("Could not verify disk address"));
|
||||||
return -1;
|
return -1;
|
||||||
@ -1588,7 +1590,7 @@ virVMXParseConfig(virVMXContext *ctx,
|
|||||||
|
|
||||||
if (virVMXParseDisk(ctx, xmlopt, conf, VIR_DOMAIN_DISK_DEVICE_DISK,
|
if (virVMXParseDisk(ctx, xmlopt, conf, VIR_DOMAIN_DISK_DEVICE_DISK,
|
||||||
VIR_DOMAIN_DISK_BUS_SCSI, controller, unit,
|
VIR_DOMAIN_DISK_BUS_SCSI, controller, unit,
|
||||||
&def->disks[def->ndisks]) < 0) {
|
&def->disks[def->ndisks], def) < 0) {
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1599,7 +1601,7 @@ virVMXParseConfig(virVMXContext *ctx,
|
|||||||
|
|
||||||
if (virVMXParseDisk(ctx, xmlopt, conf, VIR_DOMAIN_DISK_DEVICE_CDROM,
|
if (virVMXParseDisk(ctx, xmlopt, conf, VIR_DOMAIN_DISK_DEVICE_CDROM,
|
||||||
VIR_DOMAIN_DISK_BUS_SCSI, controller, unit,
|
VIR_DOMAIN_DISK_BUS_SCSI, controller, unit,
|
||||||
&def->disks[def->ndisks]) < 0) {
|
&def->disks[def->ndisks], def) < 0) {
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1613,7 +1615,7 @@ virVMXParseConfig(virVMXContext *ctx,
|
|||||||
for (unit = 0; unit < 2; ++unit) {
|
for (unit = 0; unit < 2; ++unit) {
|
||||||
if (virVMXParseDisk(ctx, xmlopt, conf, VIR_DOMAIN_DISK_DEVICE_DISK,
|
if (virVMXParseDisk(ctx, xmlopt, conf, VIR_DOMAIN_DISK_DEVICE_DISK,
|
||||||
VIR_DOMAIN_DISK_BUS_IDE, bus, unit,
|
VIR_DOMAIN_DISK_BUS_IDE, bus, unit,
|
||||||
&def->disks[def->ndisks]) < 0) {
|
&def->disks[def->ndisks], def) < 0) {
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1624,7 +1626,7 @@ virVMXParseConfig(virVMXContext *ctx,
|
|||||||
|
|
||||||
if (virVMXParseDisk(ctx, xmlopt, conf, VIR_DOMAIN_DISK_DEVICE_CDROM,
|
if (virVMXParseDisk(ctx, xmlopt, conf, VIR_DOMAIN_DISK_DEVICE_CDROM,
|
||||||
VIR_DOMAIN_DISK_BUS_IDE, bus, unit,
|
VIR_DOMAIN_DISK_BUS_IDE, bus, unit,
|
||||||
&def->disks[def->ndisks]) < 0) {
|
&def->disks[def->ndisks], def) < 0) {
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1637,7 +1639,7 @@ virVMXParseConfig(virVMXContext *ctx,
|
|||||||
for (unit = 0; unit < 2; ++unit) {
|
for (unit = 0; unit < 2; ++unit) {
|
||||||
if (virVMXParseDisk(ctx, xmlopt, conf, VIR_DOMAIN_DISK_DEVICE_FLOPPY,
|
if (virVMXParseDisk(ctx, xmlopt, conf, VIR_DOMAIN_DISK_DEVICE_FLOPPY,
|
||||||
VIR_DOMAIN_DISK_BUS_FDC, 0, unit,
|
VIR_DOMAIN_DISK_BUS_FDC, 0, unit,
|
||||||
&def->disks[def->ndisks]) < 0) {
|
&def->disks[def->ndisks], def) < 0) {
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1925,7 +1927,7 @@ virVMXParseSCSIController(virConfPtr conf, int controller, bool *present,
|
|||||||
int
|
int
|
||||||
virVMXParseDisk(virVMXContext *ctx, virDomainXMLOptionPtr xmlopt, virConfPtr conf,
|
virVMXParseDisk(virVMXContext *ctx, virDomainXMLOptionPtr xmlopt, virConfPtr conf,
|
||||||
int device, int busType, int controllerOrBus, int unit,
|
int device, int busType, int controllerOrBus, int unit,
|
||||||
virDomainDiskDefPtr *def)
|
virDomainDiskDefPtr *def, virDomainDefPtr vmdef)
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
* device = {VIR_DOMAIN_DISK_DEVICE_DISK,
|
* device = {VIR_DOMAIN_DISK_DEVICE_DISK,
|
||||||
@ -2280,7 +2282,7 @@ virVMXParseDisk(virVMXContext *ctx, virDomainXMLOptionPtr xmlopt, virConfPtr con
|
|||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (virDomainDiskDefAssignAddress(xmlopt, *def) < 0) {
|
if (virDomainDiskDefAssignAddress(xmlopt, *def, vmdef) < 0) {
|
||||||
virReportError(VIR_ERR_INTERNAL_ERROR,
|
virReportError(VIR_ERR_INTERNAL_ERROR,
|
||||||
_("Could not assign address to disk '%s'"),
|
_("Could not assign address to disk '%s'"),
|
||||||
virDomainDiskGetSource(*def));
|
virDomainDiskGetSource(*def));
|
||||||
@ -3189,7 +3191,7 @@ virVMXFormatConfig(virVMXContext *ctx, virDomainXMLOptionPtr xmlopt, virDomainDe
|
|||||||
|
|
||||||
/* def:disks */
|
/* def:disks */
|
||||||
for (i = 0; i < def->ndisks; ++i) {
|
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) {
|
virVMXHandleLegacySCSIDiskDriverName(def, def->disks[i]) < 0) {
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
@ -89,7 +89,8 @@ int virVMXParseSCSIController(virConfPtr conf, int controller, bool *present,
|
|||||||
|
|
||||||
int virVMXParseDisk(virVMXContext *ctx, virDomainXMLOptionPtr xmlopt,
|
int virVMXParseDisk(virVMXContext *ctx, virDomainXMLOptionPtr xmlopt,
|
||||||
virConfPtr conf, int device, int busType,
|
virConfPtr conf, int device, int busType,
|
||||||
int controllerOrBus, int unit, virDomainDiskDefPtr *def);
|
int controllerOrBus, int unit, virDomainDiskDefPtr *def,
|
||||||
|
virDomainDefPtr vmdef);
|
||||||
|
|
||||||
int virVMXParseFileSystem(virConfPtr conf, int number, virDomainFSDefPtr *def);
|
int virVMXParseFileSystem(virConfPtr conf, int number, virDomainFSDefPtr *def);
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user