[PATCH 01/12] domain_conf: move duplicate check functions to domain_validate.c

Daniel Henrique Barboza danielhb413 at gmail.com
Fri Dec 11 18:05:05 UTC 2020


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 at gmail.com>
---
 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




More information about the libvir-list mailing list