mirror of https://github.com/xemu-project/xemu.git
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:
parent
c47edb8dda
commit
d9fe4f0fea
|
@ -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,
|
||||
|
|
Loading…
Reference in New Issue