From: Peter Krempa Date: Tue, 19 Jun 2018 13:38:11 +0000 (+0200) Subject: qemu: driver: Allow using blockdev with qemuDomainBlocksStatsGather X-Git-Tag: v4.7.0-rc1~57 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=6d736e292c62e2c6500d6dcda3c97319202ddc89;p=thirdparty%2Flibvirt.git qemu: driver: Allow using blockdev with qemuDomainBlocksStatsGather Use the 'qdev' instead of the disk alias to lookup the stats and transfer the capacity from the appropriate node name so that the function works with -blockdev. Signed-off-by: Peter Krempa Reviewed-by: Ján Tomko --- diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 69fea8211f..4d248b3be6 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -11061,11 +11061,13 @@ qemuDomainBlocksStatsGather(virQEMUDriverPtr driver, qemuBlockStatsPtr *retstats) { qemuDomainObjPrivatePtr priv = vm->privateData; - virDomainDiskDefPtr disk; + bool blockdev = virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_BLOCKDEV); + virDomainDiskDefPtr disk = NULL; virHashTablePtr blockstats = NULL; qemuBlockStatsPtr stats; size_t i; int nstats; + int rc = 0; const char *entryname = NULL; int ret = -1; @@ -11075,23 +11077,30 @@ qemuDomainBlocksStatsGather(virQEMUDriverPtr driver, goto cleanup; } - if (!disk->info.alias) { - virReportError(VIR_ERR_INTERNAL_ERROR, - _("missing disk device alias name for %s"), disk->dst); - goto cleanup; - } + if (blockdev) { + entryname = QEMU_DOMAIN_DISK_PRIVATE(disk)->qomName; + } else { + if (!disk->info.alias) { + virReportError(VIR_ERR_INTERNAL_ERROR, + _("missing disk device alias name for %s"), disk->dst); + goto cleanup; + } - entryname = disk->info.alias; + entryname = disk->info.alias; + } } qemuDomainObjEnterMonitor(driver, vm); nstats = qemuMonitorGetAllBlockStatsInfo(priv->mon, &blockstats, false); - if (capacity && nstats >= 0 && - qemuMonitorBlockStatsUpdateCapacity(priv->mon, blockstats, false) < 0) - nstats = -1; + if (capacity && nstats >= 0) { + if (blockdev) + rc = qemuMonitorBlockStatsUpdateCapacityBlockdev(priv->mon, blockstats); + else + rc = qemuMonitorBlockStatsUpdateCapacity(priv->mon, blockstats, false); + } - if (qemuDomainObjExitMonitor(driver, vm) < 0 || nstats < 0) + if (qemuDomainObjExitMonitor(driver, vm) < 0 || nstats < 0 || rc < 0) goto cleanup; if (VIR_ALLOC(*retstats) < 0) @@ -11104,12 +11113,29 @@ qemuDomainBlocksStatsGather(virQEMUDriverPtr driver, goto cleanup; } + if (blockdev) { + /* capacity are reported only per node-name so we need to transfer them */ + qemuBlockStatsPtr capstats; + + if (disk && disk->src && + (capstats = virHashLookup(blockstats, disk->src->nodeformat))) { + (*retstats)->capacity = capstats->capacity; + (*retstats)->physical = capstats->physical; + (*retstats)->wr_highest_offset = capstats->wr_highest_offset; + (*retstats)->wr_highest_offset_valid = capstats->wr_highest_offset_valid; + (*retstats)->write_threshold = capstats->write_threshold; + } + } + **retstats = *stats; } else { for (i = 0; i < vm->def->ndisks; i++) { disk = vm->def->disks[i]; entryname = disk->info.alias; + if (blockdev) + entryname = QEMU_DOMAIN_DISK_PRIVATE(disk)->qomName; + if (!entryname) continue;