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
1 changed files with 41 additions and 24 deletions

View File

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