With -blockdev qemu will not report any useful "device" for the data returned by 'query-block'. We need to start using the 'qdev' field to do so. This patch adds data for the 'qdev' field into the returned data structure. Signed-off-by: Peter Krempa <pkrempa@xxxxxxxxxx> --- src/qemu/qemu_monitor_json.c | 69 +++++++++++++++++++++++++++++++++++--------- 1 file changed, 55 insertions(+), 14 deletions(-) diff --git a/src/qemu/qemu_monitor_json.c b/src/qemu/qemu_monitor_json.c index 75f40716ea..0579554016 100644 --- a/src/qemu/qemu_monitor_json.c +++ b/src/qemu/qemu_monitor_json.c @@ -2201,6 +2201,38 @@ qemuMonitorJSONGetBlockDevDevice(virJSONValuePtr dev) } +static int +qemuMonitorJSONBlockInfoAdd(virHashTablePtr table, + struct qemuDomainDiskInfo *info, + const char *entryname) +{ + struct qemuDomainDiskInfo *tmp = NULL; + int ret = -1; + + if (VIR_ALLOC(tmp) < 0) + goto cleanup; + + *tmp = *info; + tmp->nodename = NULL; + + if (info->nodename && + VIR_STRDUP(tmp->nodename, info->nodename) < 0) + goto cleanup; + + if (virHashAddEntry(table, entryname, tmp) < 0) + goto cleanup; + + tmp = NULL; + ret = 0; + + cleanup: + if (tmp) + VIR_FREE(tmp->nodename); + VIR_FREE(tmp); + return ret; +} + + int qemuMonitorJSONGetBlockInfo(qemuMonitorPtr mon, virHashTablePtr table) { @@ -2215,10 +2247,10 @@ int qemuMonitorJSONGetBlockInfo(qemuMonitorPtr mon, for (i = 0; i < virJSONValueArraySize(devices); i++) { virJSONValuePtr dev; virJSONValuePtr image; - struct qemuDomainDiskInfo *info; + struct qemuDomainDiskInfo info = { false }; const char *thisdev; const char *status; - const char *nodename; + const char *qdev; if (!(dev = qemuMonitorJSONGetBlockDev(devices, i))) goto cleanup; @@ -2227,16 +2259,18 @@ int qemuMonitorJSONGetBlockInfo(qemuMonitorPtr mon, goto cleanup; thisdev = qemuAliasDiskDriveSkipPrefix(thisdev); + qdev = virJSONValueObjectGetString(dev, "qdev"); - if (VIR_ALLOC(info) < 0) - goto cleanup; + if (*thisdev == '\0') + thisdev = NULL; - if (virHashAddEntry(table, thisdev, info) < 0) { - VIR_FREE(info); + if (!qdev && !thisdev) { + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", + _("query-block device entry was not in expected format")); goto cleanup; } - if (virJSONValueObjectGetBoolean(dev, "removable", &info->removable) < 0) { + if (virJSONValueObjectGetBoolean(dev, "removable", &info.removable) < 0) { virReportError(VIR_ERR_INTERNAL_ERROR, _("cannot read %s value"), "removable"); @@ -2244,23 +2278,30 @@ int qemuMonitorJSONGetBlockInfo(qemuMonitorPtr mon, } /* 'tray_open' is present only if the device has a tray */ - if (virJSONValueObjectGetBoolean(dev, "tray_open", &info->tray_open) == 0) - info->tray = true; + if (virJSONValueObjectGetBoolean(dev, "tray_open", &info.tray_open) == 0) + info.tray = true; /* presence of 'inserted' notifies that a medium is in the device */ if ((image = virJSONValueObjectGetObject(dev, "inserted"))) { - if ((nodename = virJSONValueObjectGetString(image, "node-name"))) - ignore_value(VIR_STRDUP(info->nodename, nodename)); + info.nodename = (char *) virJSONValueObjectGetString(image, "node-name"); } else { - info->empty = true; + info.empty = true; } /* Missing io-status indicates no error */ if ((status = virJSONValueObjectGetString(dev, "io-status"))) { - info->io_status = qemuMonitorBlockIOStatusToError(status); - if (info->io_status < 0) + info.io_status = qemuMonitorBlockIOStatusToError(status); + if (info.io_status < 0) goto cleanup; } + + if (thisdev && + qemuMonitorJSONBlockInfoAdd(table, &info, thisdev) < 0) + goto cleanup; + + if (qdev && + qemuMonitorJSONBlockInfoAdd(table, &info, qdev) < 0) + goto cleanup; } ret = 0; -- 2.16.2 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list