From 5b723a5d8df44b69b8ba350e643059c8fd889315 Mon Sep 17 00:00:00 2001 From: Thomas Huth Date: Fri, 27 Nov 2020 09:23:53 +0100 Subject: qga/commands-posix: Send CCW address on s390x with the fsinfo data We need the CCW address on the libvirt side to correctly identify the disk, so add this information to the GuestDiskAddress on s390x. Signed-off-by: Thomas Huth Reviewed-by: Cornelia Huck Reviewed-by: Michael Roth Message-Id: <20201127082353.448251-1-thuth@redhat.com> Signed-off-by: Cornelia Huck --- qga/commands-posix.c | 34 ++++++++++++++++++++++++++++++++++ qga/qapi-schema.json | 20 +++++++++++++++++++- 2 files changed, 53 insertions(+), 1 deletion(-) diff --git a/qga/commands-posix.c b/qga/commands-posix.c index c089e38120..5aa5eff84f 100644 --- a/qga/commands-posix.c +++ b/qga/commands-posix.c @@ -1029,6 +1029,38 @@ static bool build_guest_fsinfo_for_nonpci_virtio(char const *syspath, return true; } +/* + * Store disk device info for CCW devices (s390x channel I/O devices). + * Returns true if information has been stored, or false for failure. + */ +static bool build_guest_fsinfo_for_ccw_dev(char const *syspath, + GuestDiskAddress *disk, + Error **errp) +{ + unsigned int cssid, ssid, subchno, devno; + char *p; + + p = strstr(syspath, "/devices/css"); + if (!p || sscanf(p + 12, "%*x/%x.%x.%x/%*x.%*x.%x/", + &cssid, &ssid, &subchno, &devno) < 4) { + g_debug("could not parse ccw device sysfs path: %s", syspath); + return false; + } + + disk->has_ccw_address = true; + disk->ccw_address = g_new0(GuestCCWAddress, 1); + disk->ccw_address->cssid = cssid; + disk->ccw_address->ssid = ssid; + disk->ccw_address->subchno = subchno; + disk->ccw_address->devno = devno; + + if (strstr(p, "/virtio")) { + build_guest_fsinfo_for_nonpci_virtio(syspath, disk, errp); + } + + return true; +} + /* Store disk device info specified by @sysfs into @fs */ static void build_guest_fsinfo_for_real_device(char const *syspath, GuestFilesystemInfo *fs, @@ -1081,6 +1113,8 @@ static void build_guest_fsinfo_for_real_device(char const *syspath, if (strstr(syspath, "/devices/pci")) { has_hwinf = build_guest_fsinfo_for_pci_dev(syspath, disk, errp); + } else if (strstr(syspath, "/devices/css")) { + has_hwinf = build_guest_fsinfo_for_ccw_dev(syspath, disk, errp); } else if (strstr(syspath, "/virtio")) { has_hwinf = build_guest_fsinfo_for_nonpci_virtio(syspath, disk, errp); } else { diff --git a/qga/qapi-schema.json b/qga/qapi-schema.json index 3b3d1d0bd9..9a82b7e952 100644 --- a/qga/qapi-schema.json +++ b/qga/qapi-schema.json @@ -846,6 +846,22 @@ 'data': {'domain': 'int', 'bus': 'int', 'slot': 'int', 'function': 'int'} } +## +# @GuestCCWAddress: +# +# @cssid: channel subsystem image id +# @ssid: subchannel set id +# @subchno: subchannel number +# @devno: device number +# +# Since: 6.0 +## +{ 'struct': 'GuestCCWAddress', + 'data': {'cssid': 'int', + 'ssid': 'int', + 'subchno': 'int', + 'devno': 'int'} } + ## # @GuestDiskAddress: # @@ -856,6 +872,7 @@ # @unit: unit id # @serial: serial number (since: 3.1) # @dev: device node (POSIX) or device UNC (Windows) (since: 3.1) +# @ccw-address: CCW address on s390x (since: 6.0) # # Since: 2.2 ## @@ -863,7 +880,8 @@ 'data': {'pci-controller': 'GuestPCIAddress', 'bus-type': 'GuestDiskBusType', 'bus': 'int', 'target': 'int', 'unit': 'int', - '*serial': 'str', '*dev': 'str'} } + '*serial': 'str', '*dev': 'str', + '*ccw-address': 'GuestCCWAddress'} } ## # @GuestDiskInfo: -- cgit v1.2.3