mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2024-12-22 21:55:25 +00:00
conf: Add SCSI hostdev check for disk drive address already in use
https://bugzilla.redhat.com/show_bug.cgi?id=1210587 (partial) If a SCSI subsystem <hostdev> element address is provided, we need to make sure the address provided doesn't conflict with an existing or libvirt generated address for a SCSI <disk> element. We can handle this condition in device post processing since we're not generating an address based on some target name - rather it's either generated based on space or provided from the user. If the user provides one that conflicts, then we need to disallow the change. This will fix the issue where the domain XML provided an <address> for the <hostdev>, but not the <disk> element where the address provided ends up being the same address used for the <disk>. A <disk> address is generated using it's assigned <target> 'dev' name prior to the check/validation of the <hostdev> address value.
This commit is contained in:
parent
69a3b0df2d
commit
8d46386bfe
@ -4141,12 +4141,33 @@ virDomainDeviceDefPostParseInternal(virDomainDeviceDefPtr dev,
|
||||
virDomainHostdevDefPtr hdev = dev->data.hostdev;
|
||||
|
||||
if (hdev->mode == VIR_DOMAIN_HOSTDEV_MODE_SUBSYS &&
|
||||
hdev->source.subsys.type == VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_SCSI &&
|
||||
hdev->info->type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE &&
|
||||
virDomainHostdevAssignAddress(xmlopt, def, hdev) < 0) {
|
||||
hdev->source.subsys.type == VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_SCSI) {
|
||||
|
||||
if (hdev->info->type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE &&
|
||||
virDomainHostdevAssignAddress(xmlopt, def, hdev) < 0) {
|
||||
virReportError(VIR_ERR_XML_ERROR, "%s",
|
||||
_("Cannot assign SCSI host device address"));
|
||||
return -1;
|
||||
} else {
|
||||
/* Ensure provided address doesn't conflict with existing
|
||||
* scsi disk drive address
|
||||
*/
|
||||
virDomainDeviceDriveAddressPtr addr = &hdev->info->addr.drive;
|
||||
if (virDomainDriveAddressIsUsedByDisk(def,
|
||||
VIR_DOMAIN_DISK_BUS_SCSI,
|
||||
addr->controller,
|
||||
addr->bus,
|
||||
addr->target,
|
||||
addr->unit)) {
|
||||
virReportError(VIR_ERR_XML_ERROR,
|
||||
_("SCSI host address controller='%u' "
|
||||
"bus='%u' target='%u' unit='%u' in "
|
||||
"use by a SCSI disk"),
|
||||
addr->controller, addr->bus,
|
||||
addr->target, addr->unit);
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
|
Loading…
Reference in New Issue
Block a user