[libvirt] [PATCH 3/5] conf: Add SCSI hostdev check for disk drive address already in use

John Ferlan jferlan at redhat.com
Mon Jun 22 21:05:05 UTC 2015


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.

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.

Signed-off-by: John Ferlan <jferlan at redhat.com>
---
 src/conf/domain_conf.c | 31 ++++++++++++++++++++++++++-----
 1 file changed, 26 insertions(+), 5 deletions(-)

diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index 3205c43..e02cd49 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -11754,18 +11754,39 @@ virDomainHostdevDefParseXML(virDomainXMLOptionPtr xmlopt,
             }
             break;
         case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_SCSI:
-            if (def->info->type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE &&
-                virDomainHostdevAssignAddress(xmlopt, vmdef, def) < 0) {
+            if (def->info->type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE) {
+                if (virDomainHostdevAssignAddress(xmlopt, vmdef, def) < 0) {
 
-                virReportError(VIR_ERR_XML_ERROR, "%s",
-                               _("SCSI host devices must have address specified"));
-                goto error;
+                    virReportError(VIR_ERR_XML_ERROR, "%s",
+                                   _("Failed to assign SCSI host "
+                                     "device address"));
+                    goto error;
+                }
             } else if (def->info->type !=
                        VIR_DOMAIN_DEVICE_ADDRESS_TYPE_DRIVE) {
                 virReportError(VIR_ERR_XML_ERROR, "%s",
                                _("SCSI host device must use 'drive' "
                                  "address type"));
                 goto error;
+            } else {
+                /* Ensure provided address doesn't conflict with existing
+                 * scsi disk drive address
+                 */
+                virDomainDeviceDriveAddressPtr addr = &def->info->addr.drive;
+                if (virDomainDriveAddressIsUsedByDisk(vmdef,
+                                                      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);
+                    goto error;
+                }
             }
 
             if (virXPathBoolean("boolean(./readonly)", ctxt))
-- 
2.1.0




More information about the libvir-list mailing list