]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
domain_conf: Allow to look up scsi disks when controller uses a CCW address
authorThomas Huth <thuth@redhat.com>
Wed, 25 Nov 2020 11:06:48 +0000 (12:06 +0100)
committerMichal Privoznik <mprivozn@redhat.com>
Tue, 22 Dec 2020 13:16:31 +0000 (14:16 +0100)
On s390x, devices are attached to the channel IO subsytem by default,
so we need to look up scsi controllers via their CCW address there
instead of using PCI.

This fixes "virsh domfsinfo" on s390x for virtio-scsi devices (the first
attempt from commit f8333b3b0a7 did it in the wrong way, reporting the
device name on the guest side instead of the target name on the host side).

Fixes: f8333b3b0a ("qemu: Fix domfsinfo for non-PCI device information ...")
Buglink: https://bugzilla.redhat.com/show_bug.cgi?id=1858771
Signed-off-by: Thomas Huth <thuth@redhat.com>
Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
src/conf/domain_conf.c
src/conf/domain_conf.h

index f26b72e6c7a15fbe4620769906803c7146953f21..384710da408c2b0d6e8311cb0668d63d75d9d81d 100644 (file)
@@ -16101,6 +16101,12 @@ virDomainDiskIndexByAddress(virDomainDefPtr def,
     if ((cidx = virDomainControllerFindByPCIAddress(def, pci_address)) >= 0)
         controller = def->controllers[cidx];
 
+    if (!controller && ccw_addr) {
+        cidx = virDomainControllerFindByCCWAddress(def, ccw_addr);
+        if (cidx >= 0)
+            controller = def->controllers[cidx];
+    }
+
     for (i = 0; i < def->ndisks; i++) {
         vdisk = def->disks[i];
         if (vdisk->info.type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI &&
@@ -16734,6 +16740,23 @@ virDomainControllerFindByType(virDomainDefPtr def,
     return -1;
 }
 
+int
+virDomainControllerFindByCCWAddress(virDomainDefPtr def,
+                                    virDomainDeviceCCWAddressPtr addr)
+{
+    size_t i;
+
+    for (i = 0; i < def->ncontrollers; i++) {
+        virDomainDeviceInfoPtr info = &def->controllers[i]->info;
+
+        if (info->type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_CCW &&
+            virDomainDeviceCCWAddressEqual(&info->addr.ccw, addr))
+            return i;
+    }
+
+    return -1;
+}
+
 int
 virDomainControllerFindByPCIAddress(virDomainDefPtr def,
                                     virPCIDeviceAddressPtr addr)
index 9944ecfa5f4f200bc6724cc6eb8a721d0e7f3ff1..f49b68e39ad680ab66911bd62c055d17ac737b5a 100644 (file)
@@ -3464,6 +3464,8 @@ void virDomainControllerInsertPreAlloced(virDomainDefPtr def,
                                          virDomainControllerDefPtr controller);
 int virDomainControllerFind(const virDomainDef *def, int type, int idx);
 int virDomainControllerFindByType(virDomainDefPtr def, int type);
+int virDomainControllerFindByCCWAddress(virDomainDefPtr def,
+                                        virDomainDeviceCCWAddressPtr addr);
 int virDomainControllerFindByPCIAddress(virDomainDefPtr def,
                                         virPCIDeviceAddressPtr addr);
 int virDomainControllerFindUnusedIndex(virDomainDef const *def, int type);