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

This fixes "virsh domfsinfo" on s390x for virtio-block 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 ...")
Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1858771
Signed-off-by: Thomas Huth <thuth@redhat.com>
Reviewed-by: Cornelia Huck <cohuck@redhat.com>
Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
src/conf/domain_conf.c
src/conf/domain_conf.h
src/qemu/qemu_driver.c

index b301ac0a0818a4b0108680dc8e334a3b71e299b1..f26b72e6c7a15fbe4620769906803c7146953f21 100644 (file)
@@ -16089,6 +16089,7 @@ virDomainDiskControllerMatch(int controller_type, int disk_bus)
 int
 virDomainDiskIndexByAddress(virDomainDefPtr def,
                             virPCIDeviceAddressPtr pci_address,
+                            virDomainDeviceCCWAddressPtr ccw_addr,
                             unsigned int bus, unsigned int target,
                             unsigned int unit)
 {
@@ -16105,6 +16106,11 @@ virDomainDiskIndexByAddress(virDomainDefPtr def,
         if (vdisk->info.type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI &&
             virPCIDeviceAddressEqual(&vdisk->info.addr.pci, pci_address))
             return i;
+        if (vdisk->info.type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_CCW &&
+            ccw_addr &&
+            virDomainDeviceCCWAddressEqual(&vdisk->info.addr.ccw, ccw_addr)) {
+            return i;
+        }
         if (vdisk->info.type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_DRIVE) {
             virDomainDeviceDriveAddressPtr drive = &vdisk->info.addr.drive;
             if (controller &&
@@ -16121,11 +16127,13 @@ virDomainDiskIndexByAddress(virDomainDefPtr def,
 virDomainDiskDefPtr
 virDomainDiskByAddress(virDomainDefPtr def,
                        virPCIDeviceAddressPtr pci_address,
+                       virDomainDeviceCCWAddressPtr ccw_addr,
                        unsigned int bus,
                        unsigned int target,
                        unsigned int unit)
 {
-    int idx = virDomainDiskIndexByAddress(def, pci_address, bus, target, unit);
+    int idx = virDomainDiskIndexByAddress(def, pci_address, ccw_addr,
+                                          bus, target, unit);
     return idx < 0 ? NULL : def->disks[idx];
 }
 
index ce8ed48a049d1aa7257f6a6738f9181a0a6922cb..9944ecfa5f4f200bc6724cc6eb8a721d0e7f3ff1 100644 (file)
@@ -3378,10 +3378,12 @@ void virDomainRNGDefFree(virDomainRNGDefPtr def);
 
 int virDomainDiskIndexByAddress(virDomainDefPtr def,
                                 virPCIDeviceAddressPtr pci_controller,
+                                virDomainDeviceCCWAddressPtr ccw_addr,
                                 unsigned int bus, unsigned int target,
                                 unsigned int unit);
 virDomainDiskDefPtr virDomainDiskByAddress(virDomainDefPtr def,
                                            virPCIDeviceAddressPtr pci_controller,
+                                           virDomainDeviceCCWAddressPtr ccw_addr,
                                            unsigned int bus,
                                            unsigned int target,
                                            unsigned int unit);
index 9caaa07237200b22a1ecda63f8651ef79a9974d8..62b0852c3368e14def898daa2df7ef820d17047c 100644 (file)
@@ -18887,15 +18887,15 @@ qemuAgentFSInfoToPublic(qemuAgentFSInfoPtr agent,
 
         diskDef = virDomainDiskByAddress(vmdef,
                                          &agentdisk->pci_controller,
+                                         agentdisk->has_ccw_address ?
+                                             &agentdisk->ccw_addr : NULL,
                                          agentdisk->bus,
                                          agentdisk->target,
                                          agentdisk->unit);
         if (diskDef != NULL)
             ret->devAlias[i] = g_strdup(diskDef->dst);
-        else if (agentdisk->devnode != NULL)
-            ret->devAlias[i] = g_strdup(agentdisk->devnode);
         else
-            VIR_DEBUG("Missing devnode name for '%s'.", ret->mountpoint);
+            VIR_DEBUG("Missing target name for '%s'.", ret->mountpoint);
     }
 
     return ret;
@@ -19931,6 +19931,8 @@ qemuAgentDiskInfoFormatParams(qemuAgentDiskInfoPtr *info,
             /* match the disk to the target in the vm definition */
             diskdef = virDomainDiskByAddress(vmdef,
                                              &info[i]->address->pci_controller,
+                                             info[i]->address->has_ccw_address ?
+                                                &info[i]->address->ccw_addr : NULL,
                                              info[i]->address->bus,
                                              info[i]->address->target,
                                              info[i]->address->unit);
@@ -20015,6 +20017,8 @@ qemuAgentFSInfoFormatParams(qemuAgentFSInfoPtr *fsinfo,
             /* match the disk to the target in the vm definition */
             diskdef = virDomainDiskByAddress(vmdef,
                                              &d->pci_controller,
+                                             d->has_ccw_address ?
+                                                 &d->ccw_addr : NULL,
                                              d->bus,
                                              d->target,
                                              d->unit);