qga/commands-posix: Rework build_guest_fsinfo_for_real_device() function

We are going to support non-PCI devices soon. For this we need to split
the generic GuestDiskAddress and GuestDiskAddressList memory allocation
and list chaining into a separate function first.

Signed-off-by: Thomas Huth <thuth@redhat.com>
Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>
Signed-off-by: Michael Roth <mdroth@linux.vnet.ibm.com>
This commit is contained in:
Thomas Huth 2020-07-22 06:40:26 +02:00 committed by Michael Roth
parent c47edb8dda
commit d9fe4f0fea

View file

@ -861,28 +861,30 @@ static int build_hosts(char const *syspath, char const *host, bool ata,
return i;
}
/* Store disk device info specified by @sysfs into @fs */
static void build_guest_fsinfo_for_real_device(char const *syspath,
GuestFilesystemInfo *fs,
Error **errp)
/*
* Store disk device info for devices on the PCI bus.
* Returns true if information has been stored, or false for failure.
*/
static bool build_guest_fsinfo_for_pci_dev(char const *syspath,
GuestDiskAddress *disk,
Error **errp)
{
unsigned int pci[4], host, hosts[8], tgt[3];
int i, nhosts = 0, pcilen;
GuestDiskAddress *disk;
GuestPCIAddress *pciaddr;
GuestDiskAddressList *list = NULL;
GuestPCIAddress *pciaddr = disk->pci_controller;
bool has_ata = false, has_host = false, has_tgt = false;
char *p, *q, *driver = NULL;
#ifdef CONFIG_LIBUDEV
struct udev *udev = NULL;
struct udev_device *udevice = NULL;
#endif
bool ret = false;
p = strstr(syspath, "/devices/pci");
if (!p || sscanf(p + 12, "%*x:%*x/%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;
return false;
}
p += 12 + pcilen;
@ -903,7 +905,7 @@ static void build_guest_fsinfo_for_real_device(char const *syspath,
}
g_debug("unsupported driver or sysfs path '%s'", syspath);
return;
return false;
}
p = strstr(syspath, "/target");
@ -929,18 +931,11 @@ static void build_guest_fsinfo_for_real_device(char const *syspath,
}
}
pciaddr = g_malloc0(sizeof(*pciaddr));
pciaddr->domain = pci[0];
pciaddr->bus = pci[1];
pciaddr->slot = pci[2];
pciaddr->function = pci[3];
disk = g_malloc0(sizeof(*disk));
disk->pci_controller = pciaddr;
list = g_malloc0(sizeof(*list));
list->value = disk;
#ifdef CONFIG_LIBUDEV
udev = udev_new();
udevice = udev_device_new_from_syspath(udev, syspath);
@ -1018,21 +1013,43 @@ static void build_guest_fsinfo_for_real_device(char const *syspath,
goto cleanup;
}
list->next = fs->disk;
fs->disk = list;
goto out;
ret = true;
cleanup:
if (list) {
qapi_free_GuestDiskAddressList(list);
}
out:
g_free(driver);
#ifdef CONFIG_LIBUDEV
udev_unref(udev);
udev_device_unref(udevice);
#endif
return;
return ret;
}
/* Store disk device info specified by @sysfs into @fs */
static void build_guest_fsinfo_for_real_device(char const *syspath,
GuestFilesystemInfo *fs,
Error **errp)
{
GuestDiskAddress *disk;
GuestPCIAddress *pciaddr;
GuestDiskAddressList *list = NULL;
bool has_hwinf;
pciaddr = g_new0(GuestPCIAddress, 1);
disk = g_new0(GuestDiskAddress, 1);
disk->pci_controller = pciaddr;
list = g_new0(GuestDiskAddressList, 1);
list->value = disk;
has_hwinf = build_guest_fsinfo_for_pci_dev(syspath, disk, errp);
if (has_hwinf) {
list->next = fs->disk;
fs->disk = list;
} else {
qapi_free_GuestDiskAddressList(list);
}
}
static void build_guest_fsinfo_for_device(char const *devpath,