Disk image size data are not contained in the reply of query-blockstats but need to be gathered from query-block. For use with -blockdev we really need to call 'query-named-block-nodes' and process it to retrieve the correct data. This patch introduces qemuMonitorBlockStatsUpdateCapacityBlockdev which updates the capacity data by nodename rather than device name. Signed-off-by: Peter Krempa <pkrempa@xxxxxxxxxx> --- src/qemu/qemu_monitor.c | 11 +++++++++++ src/qemu/qemu_monitor.h | 4 ++++ src/qemu/qemu_monitor_json.c | 46 ++++++++++++++++++++++++++++++++++++++++++++ src/qemu/qemu_monitor_json.h | 3 +++ 4 files changed, 64 insertions(+) diff --git a/src/qemu/qemu_monitor.c b/src/qemu/qemu_monitor.c index d665f33d81..ed6a53e3a5 100644 --- a/src/qemu/qemu_monitor.c +++ b/src/qemu/qemu_monitor.c @@ -2309,6 +2309,17 @@ qemuMonitorBlockStatsUpdateCapacity(qemuMonitorPtr mon, } +int +qemuMonitorBlockStatsUpdateCapacityBlockdev(qemuMonitorPtr mon, + virHashTablePtr stats) +{ + VIR_DEBUG("stats=%p", stats); + + QEMU_CHECK_MONITOR(mon); + + return qemuMonitorJSONBlockStatsUpdateCapacityBlockdev(mon, stats); +} + int qemuMonitorBlockResize(qemuMonitorPtr mon, const char *device, diff --git a/src/qemu/qemu_monitor.h b/src/qemu/qemu_monitor.h index 0734588f66..3e4822c6ec 100644 --- a/src/qemu/qemu_monitor.h +++ b/src/qemu/qemu_monitor.h @@ -595,6 +595,10 @@ int qemuMonitorBlockStatsUpdateCapacity(qemuMonitorPtr mon, bool backingChain) ATTRIBUTE_NONNULL(2); +int qemuMonitorBlockStatsUpdateCapacityBlockdev(qemuMonitorPtr mon, + virHashTablePtr stats) + ATTRIBUTE_NONNULL(2); + int qemuMonitorBlockResize(qemuMonitorPtr mon, const char *device, const char *nodename, diff --git a/src/qemu/qemu_monitor_json.c b/src/qemu/qemu_monitor_json.c index 24e3d61699..51d6ee2917 100644 --- a/src/qemu/qemu_monitor_json.c +++ b/src/qemu/qemu_monitor_json.c @@ -2585,6 +2585,52 @@ qemuMonitorJSONBlockStatsUpdateCapacity(qemuMonitorPtr mon, } +static int +qemuMonitorJSONBlockStatsUpdateCapacityBlockdevWorker(size_t pos ATTRIBUTE_UNUSED, + virJSONValuePtr val, + void *opaque) +{ + virHashTablePtr stats = opaque; + virJSONValuePtr image; + const char *nodename; + + if (!(nodename = virJSONValueObjectGetString(val, "node-name")) || + !(image = virJSONValueObjectGetObject(val, "image"))) { + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", + _("query-named-block-nodes entry was not in expected format")); + return -1; + } + + if (qemuMonitorJSONBlockStatsUpdateCapacityData(image, nodename, stats) < 0) + return -1; + + return 1; /* we don't want to steal the value from the JSON array */ +} + + +int +qemuMonitorJSONBlockStatsUpdateCapacityBlockdev(qemuMonitorPtr mon, + virHashTablePtr stats) +{ + virJSONValuePtr nodes; + int ret = -1; + + if (!(nodes = qemuMonitorJSONQueryNamedBlockNodes(mon))) + return -1; + + if (virJSONValueArrayForeachSteal(nodes, + qemuMonitorJSONBlockStatsUpdateCapacityBlockdevWorker, + stats) < 0) + goto cleanup; + + ret = 0; + + cleanup: + virJSONValueFree(nodes); + return ret; +} + + int qemuMonitorJSONBlockResize(qemuMonitorPtr mon, const char *device, const char *nodename, diff --git a/src/qemu/qemu_monitor_json.h b/src/qemu/qemu_monitor_json.h index 3c5839db38..51214e3797 100644 --- a/src/qemu/qemu_monitor_json.h +++ b/src/qemu/qemu_monitor_json.h @@ -93,6 +93,9 @@ int qemuMonitorJSONGetAllBlockStatsInfo(qemuMonitorPtr mon, int qemuMonitorJSONBlockStatsUpdateCapacity(qemuMonitorPtr mon, virHashTablePtr stats, bool backingChain); +int qemuMonitorJSONBlockStatsUpdateCapacityBlockdev(qemuMonitorPtr mon, + virHashTablePtr stats); + int qemuMonitorJSONBlockResize(qemuMonitorPtr mon, const char *device, const char *nodename, -- 2.16.2 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list