]> xenbits.xensource.com Git - libvirt.git/commitdiff
conf: Add 'bus' and 'target' to SCSI address conflict checks
authorJohn Ferlan <jferlan@redhat.com>
Fri, 19 Jun 2015 19:11:13 +0000 (15:11 -0400)
committerJohn Ferlan <jferlan@redhat.com>
Mon, 3 Aug 2015 20:48:45 +0000 (16:48 -0400)
Modify virDomainDriveAddressIsUsedBy{Disk|Hostdev} and
virDomainSCSIDriveAddressIsUsed to take 'bus' and 'target'
parameters.  Will be used by future patches for more complete
address conflict checks

Signed-off-by: John Ferlan <jferlan@redhat.com>
src/conf/domain_conf.c

index 463d19960d0782fe5aba22f92295df660aa30da7..5d96ddd5857780a0cf680a00b08ed42a7229be3e 100644 (file)
@@ -5236,13 +5236,15 @@ virDomainHostdevSubsysSCSIDefParseXML(xmlNodePtr sourcenode,
     return ret;
 }
 
-/* Check if a drive type address $controller:0:0:$unit is already
+/* Check if a drive type address $controller:$bus:$target:$unit is already
  * taken by a disk or not.
  */
 static bool
 virDomainDriveAddressIsUsedByDisk(const virDomainDef *def,
                                   virDomainDiskBus type,
                                   unsigned int controller,
+                                  unsigned int bus,
+                                  unsigned int target,
                                   unsigned int unit)
 {
     virDomainDiskDefPtr disk;
@@ -5257,21 +5259,23 @@ virDomainDriveAddressIsUsedByDisk(const virDomainDef *def,
 
         if (disk->info.addr.drive.controller == controller &&
             disk->info.addr.drive.unit == unit &&
-            disk->info.addr.drive.bus == 0 &&
-            disk->info.addr.drive.target == 0)
+            disk->info.addr.drive.bus == bus &&
+            disk->info.addr.drive.target == target)
             return true;
     }
 
     return false;
 }
 
-/* Check if a drive type address $controller:0:0:$unit is already
+/* Check if a drive type address $controller:$target:$bus:$unit is already
  * taken by a host device or not.
  */
 static bool
 virDomainDriveAddressIsUsedByHostdev(const virDomainDef *def,
                                      virDomainHostdevSubsysType type,
                                      unsigned int controller,
+                                     unsigned int bus,
+                                     unsigned int target,
                                      unsigned int unit)
 {
     virDomainHostdevDefPtr hostdev;
@@ -5285,8 +5289,8 @@ virDomainDriveAddressIsUsedByHostdev(const virDomainDef *def,
 
         if (hostdev->info->addr.drive.controller == controller &&
             hostdev->info->addr.drive.unit == unit &&
-            hostdev->info->addr.drive.bus == 0 &&
-            hostdev->info->addr.drive.target == 0)
+            hostdev->info->addr.drive.bus == bus &&
+            hostdev->info->addr.drive.target == target)
             return true;
     }
 
@@ -5296,6 +5300,8 @@ virDomainDriveAddressIsUsedByHostdev(const virDomainDef *def,
 static bool
 virDomainSCSIDriveAddressIsUsed(const virDomainDef *def,
                                 unsigned int controller,
+                                unsigned int bus,
+                                unsigned int target,
                                 unsigned int unit)
 {
     /* In current implementation, the maximum unit number of a controller
@@ -5305,9 +5311,10 @@ virDomainSCSIDriveAddressIsUsed(const virDomainDef *def,
         return true;
 
     if (virDomainDriveAddressIsUsedByDisk(def, VIR_DOMAIN_DISK_BUS_SCSI,
-                                          controller, unit) ||
-        virDomainDriveAddressIsUsedByHostdev(def, VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_SCSI,
-                                             controller, unit))
+                                          controller, bus, target, unit) ||
+        virDomainDriveAddressIsUsedByHostdev(def,
+                                             VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_SCSI,
+                                             controller, bus, target, unit))
         return true;
 
     return false;
@@ -5322,7 +5329,8 @@ virDomainControllerSCSINextUnit(const virDomainDef *def,
     size_t i;
 
     for (i = 0; i < max_unit; i++) {
-        if (!virDomainSCSIDriveAddressIsUsed(def, controller, i))
+        /* Default to assigning addresses using bus = target = 0 */
+        if (!virDomainSCSIDriveAddressIsUsed(def, controller, 0, 0, i))
             return i;
     }