From: Peter Krempa Date: Mon, 24 Jul 2017 10:51:10 +0000 (+0200) Subject: qemu: monitor: Extract call of 'query-blockstats' and add new API for it X-Git-Url: http://xenbits.xensource.com/gitweb?a=commitdiff_plain;h=51d243bdbfc9c9e6c4de9479b8a6ced37fc35aa1;p=libvirt.git qemu: monitor: Extract call of 'query-blockstats' and add new API for it Allow getting the raw data from query-blockstats, so that we can use it to detect the backing chain later on. Reviewed-by: Eric Blake --- diff --git a/src/qemu/qemu_monitor.c b/src/qemu/qemu_monitor.c index 2b0afcc21c..19082d8bf7 100644 --- a/src/qemu/qemu_monitor.c +++ b/src/qemu/qemu_monitor.c @@ -2241,6 +2241,21 @@ qemuMonitorGetBlockInfo(qemuMonitorPtr mon) } +/** + * qemuMonitorQueryBlockstats: + * @mon: monitor object + * + * Returns data from a call to 'query-blockstats'. + */ +virJSONValuePtr +qemuMonitorQueryBlockstats(qemuMonitorPtr mon) +{ + QEMU_CHECK_MONITOR_JSON_NULL(mon); + + return qemuMonitorJSONQueryBlockstats(mon); +} + + /** * qemuMonitorGetAllBlockStatsInfo: * @mon: monitor object diff --git a/src/qemu/qemu_monitor.h b/src/qemu/qemu_monitor.h index 1697db55cd..31f7e97ba8 100644 --- a/src/qemu/qemu_monitor.h +++ b/src/qemu/qemu_monitor.h @@ -523,6 +523,8 @@ int qemuMonitorSetMemoryStatsPeriod(qemuMonitorPtr mon, int qemuMonitorBlockIOStatusToError(const char *status); virHashTablePtr qemuMonitorGetBlockInfo(qemuMonitorPtr mon); +virJSONValuePtr qemuMonitorQueryBlockstats(qemuMonitorPtr mon); + typedef struct _qemuBlockStats qemuBlockStats; typedef qemuBlockStats *qemuBlockStatsPtr; struct _qemuBlockStats { diff --git a/src/qemu/qemu_monitor_json.c b/src/qemu/qemu_monitor_json.c index 65b1fbb8ee..b8a68154a7 100644 --- a/src/qemu/qemu_monitor_json.c +++ b/src/qemu/qemu_monitor_json.c @@ -2061,34 +2061,49 @@ qemuMonitorJSONGetOneBlockStatsInfo(virJSONValuePtr dev, } -int -qemuMonitorJSONGetAllBlockStatsInfo(qemuMonitorPtr mon, - virHashTablePtr hash, - bool backingChain) +virJSONValuePtr +qemuMonitorJSONQueryBlockstats(qemuMonitorPtr mon) { - int ret = -1; - int nstats = 0; - int rc; - size_t i; virJSONValuePtr cmd; virJSONValuePtr reply = NULL; - virJSONValuePtr devices; + virJSONValuePtr ret = NULL; if (!(cmd = qemuMonitorJSONMakeCommand("query-blockstats", NULL))) - return -1; + return NULL; - if ((rc = qemuMonitorJSONCommand(mon, cmd, &reply)) < 0) + if (qemuMonitorJSONCommand(mon, cmd, &reply) < 0) goto cleanup; if (qemuMonitorJSONCheckError(cmd, reply) < 0) goto cleanup; - if (!(devices = virJSONValueObjectGetArray(reply, "return"))) { + if (!(ret = virJSONValueObjectStealArray(reply, "return"))) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", - _("blockstats reply was missing device list")); + _("query-blockstats reply was missing device list")); goto cleanup; } + cleanup: + virJSONValueFree(cmd); + virJSONValueFree(reply); + return ret; +} + + +int +qemuMonitorJSONGetAllBlockStatsInfo(qemuMonitorPtr mon, + virHashTablePtr hash, + bool backingChain) +{ + int ret = -1; + int nstats = 0; + int rc; + size_t i; + virJSONValuePtr devices; + + if (!(devices = qemuMonitorJSONQueryBlockstats(mon))) + return -1; + for (i = 0; i < virJSONValueArraySize(devices); i++) { virJSONValuePtr dev = virJSONValueArrayGet(devices, i); const char *dev_name; @@ -2120,8 +2135,7 @@ qemuMonitorJSONGetAllBlockStatsInfo(qemuMonitorPtr mon, ret = nstats; cleanup: - virJSONValueFree(cmd); - virJSONValueFree(reply); + virJSONValueFree(devices); return ret; } diff --git a/src/qemu/qemu_monitor_json.h b/src/qemu/qemu_monitor_json.h index d090d57091..7462967b51 100644 --- a/src/qemu/qemu_monitor_json.h +++ b/src/qemu/qemu_monitor_json.h @@ -81,6 +81,8 @@ int qemuMonitorJSONSetMemoryStatsPeriod(qemuMonitorPtr mon, int period); int qemuMonitorJSONGetBlockInfo(qemuMonitorPtr mon, virHashTablePtr table); + +virJSONValuePtr qemuMonitorJSONQueryBlockstats(qemuMonitorPtr mon); int qemuMonitorJSONGetAllBlockStatsInfo(qemuMonitorPtr mon, virHashTablePtr hash, bool backingChain);