Iterate over the PCI bridges to lookup the PCI device associated with the block device.
Fixes: https://bugzilla.redhat.com/show_bug.cgi?id=1567041 Signed-off-by: Marc-André Lureau <marcandre.lur...@redhat.com> --- qga/commands-posix.c | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/qga/commands-posix.c b/qga/commands-posix.c index 0dc219dbcf..5d4e5f627f 100644 --- a/qga/commands-posix.c +++ b/qga/commands-posix.c @@ -879,9 +879,24 @@ static void build_guest_fsinfo_for_real_device(char const *syspath, return; } - driver = get_pci_driver(syspath, (p + 12 + pcilen) - syspath, errp); - if (!driver) { - goto cleanup; + p += 12 + pcilen; + while (true) { + driver = get_pci_driver(syspath, p - syspath, errp); + if (!driver) { + goto cleanup; + } + + if (g_str_equal(driver, "pcieport")) { + if (sscanf(p, "/%x:%x:%x.%x%n", + pci, pci + 1, pci + 2, pci + 3, &pcilen) < 4) { + g_debug("only pci device is supported: sysfs path \"%s\"", + syspath); + return; + } + p += pcilen; + continue; + } + break; } p = strstr(syspath, "/target"); -- 2.17.0.253.g3dd125b46d