}
+static int
+qemuDomainGetStatsOneBlockNode(virDomainStatsRecordPtr record,
+ int *maxparams,
+ virStorageSourcePtr src,
+ size_t block_idx,
+ virHashTablePtr nodedata)
+{
+ virJSONValuePtr data;
+ unsigned long long tmp;
+ int ret = -1;
+
+ if (src->nodebacking &&
+ (data = virHashLookup(nodedata, src->nodebacking))) {
+ if (virJSONValueObjectGetNumberUlong(data, "write_threshold", &tmp) == 0 &&
+ tmp > 0)
+ QEMU_ADD_BLOCK_PARAM_ULL(record, maxparams, block_idx,
+ "threshold", tmp);
+ }
+
+ ret = 0;
+
+ cleanup:
+ return ret;
+}
+
+
static int
qemuDomainGetStatsOneBlock(virQEMUDriverPtr driver,
virQEMUDriverConfigPtr cfg,
virStorageSourcePtr src,
size_t block_idx,
unsigned int backing_idx,
- virHashTablePtr stats)
+ virHashTablePtr stats,
+ virHashTablePtr nodedata)
{
qemuBlockStats *entry;
int ret = -1;
}
}
+ if (qemuDomainGetStatsOneBlockNode(record, maxparams, src, block_idx,
+ nodedata) < 0)
+ goto cleanup;
+
ret = 0;
cleanup:
VIR_FREE(alias);
int ret = -1;
int rc;
virHashTablePtr stats = NULL;
+ virHashTablePtr nodestats = NULL;
+ virJSONValuePtr nodedata = NULL;
qemuDomainObjPrivatePtr priv = dom->privateData;
virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver);
+ bool fetchnodedata = virQEMUCapsGet(priv->qemuCaps,
+ QEMU_CAPS_QUERY_NAMED_BLOCK_NODES);
int count_index = -1;
size_t visited = 0;
bool visitBacking = !!(privflags & QEMU_DOMAIN_STATS_BACKING);
if (rc >= 0)
ignore_value(qemuMonitorBlockStatsUpdateCapacity(priv->mon, stats,
visitBacking));
+
+ if (fetchnodedata)
+ nodedata = qemuMonitorQueryNamedBlockNodes(priv->mon);
+
if (qemuDomainObjExitMonitor(driver, dom) < 0)
goto cleanup;
/* failure to retrieve stats is fine at this point */
- if (rc < 0)
+ if (rc < 0 || (fetchnodedata && !nodedata))
virResetLastError();
}
+ if (nodedata &&
+ !(nodestats = qemuBlockGetNodeData(nodedata)))
+ goto cleanup;
+
/* When listing backing chains, it's easier to fix up the count
* after the iteration than it is to iterate twice; but we still
* want count listed first. */
while (src && (backing_idx == 0 || visitBacking)) {
if (qemuDomainGetStatsOneBlock(driver, cfg, dom, record, maxparams,
disk, src, visited, backing_idx,
- stats) < 0)
+ stats, nodestats) < 0)
goto cleanup;
visited++;
backing_idx++;
cleanup:
virHashFree(stats);
+ virHashFree(nodestats);
+ virJSONValueFree(nodedata);
virObjectUnref(cfg);
return ret;
}