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;
|
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,
|
||||||
|
|
Loading…
Reference in New Issue