virDomainDefCheckDuplicateDiskInfo() and virDomainDefCheckDuplicateDriveAddresses() are static functions used by virDomainDefValidateInternal(). Let's move them to domain_validate.c to start clearing up the path to move virDomainDefValidateInternal(). Change the functions name slightly to be more on par with their new home. Signed-off-by: Daniel Henrique Barboza <danielhb413@xxxxxxxxx> --- src/conf/domain_conf.c | 129 +------------------------------------ src/conf/domain_conf.h | 5 ++ src/conf/domain_validate.c | 125 +++++++++++++++++++++++++++++++++++ src/conf/domain_validate.h | 2 + 4 files changed, 135 insertions(+), 126 deletions(-) diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 23415b323c..0f5d314e2c 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -4867,7 +4867,7 @@ virDomainDefPostParseGraphics(virDomainDef *def) * Return true if any disk is already using the given address on the * given bus, false otherwise. */ -static bool +bool virDomainDriveAddressIsUsedByDisk(const virDomainDef *def, virDomainDiskBus bus_type, const virDomainDeviceDriveAddress *addr) @@ -6599,129 +6599,6 @@ virDomainDefValidateDeviceIterator(virDomainDefPtr def, } -static int -virDomainDefCheckDuplicateDiskInfo(const virDomainDef *def) -{ - size_t i; - size_t j; - - for (i = 0; i < def->ndisks; i++) { - for (j = i + 1; j < def->ndisks; j++) { - if (virDomainDiskDefCheckDuplicateInfo(def->disks[i], - def->disks[j]) < 0) - return -1; - } - } - - return 0; -} - -/** - * virDomainDefCheckDuplicateDriveAddresses: - * @def: domain definition to check against - * - * This function checks @def for duplicate drive addresses. Drive - * addresses are only in use for disks and hostdevs at the moment. - * - * Returns 0 in case of there are no duplicate drive addresses, -1 - * otherwise. - */ -static int -virDomainDefCheckDuplicateDriveAddresses(const virDomainDef *def) -{ - size_t i; - size_t j; - - for (i = 0; i < def->ndisks; i++) { - virDomainDiskDefPtr disk_i = def->disks[i]; - virDomainDeviceInfoPtr disk_info_i = &disk_i->info; - - if (disk_info_i->type != VIR_DOMAIN_DEVICE_ADDRESS_TYPE_DRIVE) - continue; - - for (j = i + 1; j < def->ndisks; j++) { - virDomainDiskDefPtr disk_j = def->disks[j]; - virDomainDeviceInfoPtr disk_info_j = &disk_j->info; - - if (disk_i->bus != disk_j->bus) - continue; - - if (disk_info_j->type != VIR_DOMAIN_DEVICE_ADDRESS_TYPE_DRIVE) - continue; - - if (virDomainDeviceInfoAddressIsEqual(disk_info_i, disk_info_j)) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, - _("Found duplicate drive address for disk with " - "target name '%s' controller='%u' bus='%u' " - "target='%u' unit='%u'"), - disk_i->dst, - disk_info_i->addr.drive.controller, - disk_info_i->addr.drive.bus, - disk_info_i->addr.drive.target, - disk_info_i->addr.drive.unit); - return -1; - } - } - - /* Note: There is no need to check for conflicts with SCSI - * hostdevs above, because conflicts with hostdevs are checked - * in the next loop. - */ - } - - for (i = 0; i < def->nhostdevs; i++) { - virDomainHostdevDefPtr hdev_i = def->hostdevs[i]; - virDomainDeviceInfoPtr hdev_info_i = hdev_i->info; - virDomainDeviceDriveAddressPtr hdev_addr_i; - - if (!virHostdevIsSCSIDevice(hdev_i)) - continue; - - if (hdev_i->info->type != VIR_DOMAIN_DEVICE_ADDRESS_TYPE_DRIVE) - continue; - - hdev_addr_i = &hdev_info_i->addr.drive; - for (j = i + 1; j < def->nhostdevs; j++) { - virDomainHostdevDefPtr hdev_j = def->hostdevs[j]; - virDomainDeviceInfoPtr hdev_info_j = hdev_j->info; - - if (!virHostdevIsSCSIDevice(hdev_j)) - continue; - - /* Address type check for hdev_j will be done implicitly - * in virDomainDeviceInfoAddressIsEqual() */ - - if (virDomainDeviceInfoAddressIsEqual(hdev_info_i, hdev_info_j)) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, - _("SCSI host address controller='%u' " - "bus='%u' target='%u' unit='%u' in " - "use by another SCSI host device"), - hdev_addr_i->bus, - hdev_addr_i->controller, - hdev_addr_i->target, - hdev_addr_i->unit); - return -1; - } - } - - if (virDomainDriveAddressIsUsedByDisk(def, VIR_DOMAIN_DISK_BUS_SCSI, - hdev_addr_i)) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, - _("SCSI host address controller='%u' " - "bus='%u' target='%u' unit='%u' in " - "use by another SCSI disk"), - hdev_addr_i->bus, - hdev_addr_i->controller, - hdev_addr_i->target, - hdev_addr_i->unit); - return -1; - } - } - - return 0; -} - - bool virDomainDefLifecycleActionAllowed(virDomainLifecycle type, virDomainLifecycleAction action) @@ -6899,10 +6776,10 @@ static int virDomainDefValidateInternal(const virDomainDef *def, virDomainXMLOptionPtr xmlopt) { - if (virDomainDefCheckDuplicateDiskInfo(def) < 0) + if (virDomainDefDuplicateDiskInfoValidate(def) < 0) return -1; - if (virDomainDefCheckDuplicateDriveAddresses(def) < 0) + if (virDomainDefDuplicateDriveAddressesValidate(def) < 0) return -1; if (virDomainDefGetVcpusTopology(def, NULL) < 0) diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index 72771c46b9..71e42d6617 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -3915,6 +3915,11 @@ bool virDomainBlockIoTuneInfoEqual(const virDomainBlockIoTuneInfo *a, const virDomainBlockIoTuneInfo *b); +bool +virDomainDriveAddressIsUsedByDisk(const virDomainDef *def, + virDomainDiskBus bus_type, + const virDomainDeviceDriveAddress *addr); + bool virHostdevIsSCSIDevice(const virDomainHostdevDef *hostdev) ATTRIBUTE_NONNULL(1); diff --git a/src/conf/domain_validate.c b/src/conf/domain_validate.c index 0eed1ba982..8bbd60c836 100644 --- a/src/conf/domain_validate.c +++ b/src/conf/domain_validate.c @@ -635,3 +635,128 @@ virDomainDefIdMapValidate(const virDomainDef *def) return 0; } + + +int +virDomainDefDuplicateDiskInfoValidate(const virDomainDef *def) +{ + size_t i; + size_t j; + + for (i = 0; i < def->ndisks; i++) { + for (j = i + 1; j < def->ndisks; j++) { + if (virDomainDiskDefCheckDuplicateInfo(def->disks[i], + def->disks[j]) < 0) + return -1; + } + } + + return 0; +} + + + +/** + * virDomainDefDuplicateDriveAddressesValidate: + * @def: domain definition to check against + * + * This function checks @def for duplicate drive addresses. Drive + * addresses are only in use for disks and hostdevs at the moment. + * + * Returns 0 in case of there are no duplicate drive addresses, -1 + * otherwise. + */ +int +virDomainDefDuplicateDriveAddressesValidate(const virDomainDef *def) +{ + size_t i; + size_t j; + + for (i = 0; i < def->ndisks; i++) { + virDomainDiskDefPtr disk_i = def->disks[i]; + virDomainDeviceInfoPtr disk_info_i = &disk_i->info; + + if (disk_info_i->type != VIR_DOMAIN_DEVICE_ADDRESS_TYPE_DRIVE) + continue; + + for (j = i + 1; j < def->ndisks; j++) { + virDomainDiskDefPtr disk_j = def->disks[j]; + virDomainDeviceInfoPtr disk_info_j = &disk_j->info; + + if (disk_i->bus != disk_j->bus) + continue; + + if (disk_info_j->type != VIR_DOMAIN_DEVICE_ADDRESS_TYPE_DRIVE) + continue; + + if (virDomainDeviceInfoAddressIsEqual(disk_info_i, disk_info_j)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("Found duplicate drive address for disk with " + "target name '%s' controller='%u' bus='%u' " + "target='%u' unit='%u'"), + disk_i->dst, + disk_info_i->addr.drive.controller, + disk_info_i->addr.drive.bus, + disk_info_i->addr.drive.target, + disk_info_i->addr.drive.unit); + return -1; + } + } + + /* Note: There is no need to check for conflicts with SCSI + * hostdevs above, because conflicts with hostdevs are checked + * in the next loop. + */ + } + + for (i = 0; i < def->nhostdevs; i++) { + virDomainHostdevDefPtr hdev_i = def->hostdevs[i]; + virDomainDeviceInfoPtr hdev_info_i = hdev_i->info; + virDomainDeviceDriveAddressPtr hdev_addr_i; + + if (!virHostdevIsSCSIDevice(hdev_i)) + continue; + + if (hdev_i->info->type != VIR_DOMAIN_DEVICE_ADDRESS_TYPE_DRIVE) + continue; + + hdev_addr_i = &hdev_info_i->addr.drive; + for (j = i + 1; j < def->nhostdevs; j++) { + virDomainHostdevDefPtr hdev_j = def->hostdevs[j]; + virDomainDeviceInfoPtr hdev_info_j = hdev_j->info; + + if (!virHostdevIsSCSIDevice(hdev_j)) + continue; + + /* Address type check for hdev_j will be done implicitly + * in virDomainDeviceInfoAddressIsEqual() */ + + if (virDomainDeviceInfoAddressIsEqual(hdev_info_i, hdev_info_j)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("SCSI host address controller='%u' " + "bus='%u' target='%u' unit='%u' in " + "use by another SCSI host device"), + hdev_addr_i->bus, + hdev_addr_i->controller, + hdev_addr_i->target, + hdev_addr_i->unit); + return -1; + } + } + + if (virDomainDriveAddressIsUsedByDisk(def, VIR_DOMAIN_DISK_BUS_SCSI, + hdev_addr_i)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("SCSI host address controller='%u' " + "bus='%u' target='%u' unit='%u' in " + "use by another SCSI disk"), + hdev_addr_i->bus, + hdev_addr_i->controller, + hdev_addr_i->target, + hdev_addr_i->unit); + return -1; + } + } + + return 0; +} diff --git a/src/conf/domain_validate.h b/src/conf/domain_validate.h index 497a02b9b3..1f1a5b1bd1 100644 --- a/src/conf/domain_validate.h +++ b/src/conf/domain_validate.h @@ -45,3 +45,5 @@ int virDomainSmartcardDefValidate(const virDomainSmartcardDef *smartcard, int virDomainDefTunablesValidate(const virDomainDef *def); int virDomainControllerDefValidate(const virDomainControllerDef *controller); int virDomainDefIdMapValidate(const virDomainDef *def); +int virDomainDefDuplicateDiskInfoValidate(const virDomainDef *def); +int virDomainDefDuplicateDriveAddressesValidate(const virDomainDef *def); -- 2.26.2