From 250227a53c1d43d2bd8346922edb3452f3534be6 Mon Sep 17 00:00:00 2001 From: Thomas Huth Date: Fri, 2 Oct 2020 10:17:42 -0400 Subject: [PATCH 03/14] qga/commands-posix: Support fsinfo for non-PCI virtio devices, too MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit RH-Author: Thomas Huth Message-id: <20201002101742.249169-4-thuth@redhat.com> Patchwork-id: 98528 O-Subject: [RHEL-8.4.0 qemu-kvm PATCH 3/3] qga/commands-posix: Support fsinfo for non-PCI virtio devices, too Bugzilla: 1755075 RH-Acked-by: Danilo de Paula RH-Acked-by: Cornelia Huck RH-Acked-by: David Hildenbrand QEMU on s390x uses virtio via channel I/O instead of PCI by default. Add a function to detect and provide information for virtio-scsi and virtio-block devices here, too. Signed-off-by: Thomas Huth Reviewed-by: Daniel P. Berrangé Signed-off-by: Michael Roth (cherry picked from commit 23843c129d5e1ca360605e511a43a34faebb47c4) Signed-off-by: Danilo C. L. de Paula --- qga/commands-posix.c | 42 +++++++++++++++++++++++++++++++++++++++++- 1 file changed, 41 insertions(+), 1 deletion(-) diff --git a/qga/commands-posix.c b/qga/commands-posix.c index 6db76aadd1..c86c87ed52 100644 --- a/qga/commands-posix.c +++ b/qga/commands-posix.c @@ -1000,6 +1000,39 @@ cleanup: return ret; } +/* + * Store disk device info for non-PCI virtio devices (for example s390x + * channel I/O devices). Returns true if information has been stored, or + * false for failure. + */ +static bool build_guest_fsinfo_for_nonpci_virtio(char const *syspath, + GuestDiskAddress *disk, + Error **errp) +{ + unsigned int tgt[3]; + char *p; + + if (!strstr(syspath, "/virtio") || !strstr(syspath, "/block")) { + g_debug("Unsupported virtio device '%s'", syspath); + return false; + } + + p = strstr(syspath, "/target"); + if (p && sscanf(p + 7, "%*u:%*u:%*u/%*u:%u:%u:%u", + &tgt[0], &tgt[1], &tgt[2]) == 3) { + /* virtio-scsi: target*:0:: */ + disk->bus_type = GUEST_DISK_BUS_TYPE_SCSI; + disk->bus = tgt[0]; + disk->target = tgt[1]; + disk->unit = tgt[2]; + } else { + /* virtio-blk: 1 disk per 1 device */ + disk->bus_type = GUEST_DISK_BUS_TYPE_VIRTIO; + } + + return true; +} + /* Store disk device info specified by @sysfs into @fs */ static void build_guest_fsinfo_for_real_device(char const *syspath, GuestFilesystemInfo *fs, @@ -1050,7 +1083,14 @@ static void build_guest_fsinfo_for_real_device(char const *syspath, udev_device_unref(udevice); #endif - has_hwinf = build_guest_fsinfo_for_pci_dev(syspath, disk, errp); + if (strstr(syspath, "/devices/pci")) { + has_hwinf = build_guest_fsinfo_for_pci_dev(syspath, disk, errp); + } else if (strstr(syspath, "/virtio")) { + has_hwinf = build_guest_fsinfo_for_nonpci_virtio(syspath, disk, errp); + } else { + g_debug("Unsupported device type for '%s'", syspath); + has_hwinf = false; + } if (has_hwinf || disk->has_dev || disk->has_serial) { list->next = fs->disk; -- 2.27.0