The prior refactoring can now be put to use. With the same domain
as the previous commit (one qcow2 disk and an empty cdrom drive):
$ virsh domstats --block foo
Domain: 'foo'
block.count=2
block.0.name=hda
block.0.allocation=200704
block.0.capacity=42949672960
block.0.physical=200704
block.1.name=hdc
* src/qemu/qemu_driver.c (qemuStorageLimitsRefresh): Tweak
semantics of helper function.
(qemuDomainGetStatsBlock): Use it to report offline statistics.
Signed-off-by: Eric Blake <eblake(a)redhat.com>
---
src/qemu/qemu_driver.c | 60 +++++++++++++++++++++++++++++++++++---------------
1 file changed, 42 insertions(+), 18 deletions(-)
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index 404decd..723391b 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -10983,7 +10983,9 @@ qemuDomainMemoryPeek(virDomainPtr dom,
/* Refresh the capacity and allocation limits of a given storage
* source. Assumes that the caller has already obtained a domain job.
- * Set *activeFail to true if data cannot be obtained because a
+ * Pass NULL for path to skip any errors about an empty drive.
+ * Pass NULL for activeFail to skip any monitor attempt, otherwise,
+ * set *activeFail to true if data cannot be obtained because a
* transient guest is no longer active. */
static int
qemuStorageLimitsRefresh(virQEMUDriverPtr driver, virQEMUDriverConfigPtr cfg,
@@ -11000,6 +11002,12 @@ qemuStorageLimitsRefresh(virQEMUDriverPtr driver,
virQEMUDriverConfigPtr cfg,
char *buf = NULL;
ssize_t len;
+ if (!path) {
+ if (virStorageSourceIsEmpty(src))
+ return 0;
+ path = src->path;
+ }
+
/* FIXME: For an offline domain, we always want to check current
* on-disk statistics (as users have been known to change offline
* images behind our backs). For a running domain, however, it
@@ -11116,23 +11124,27 @@ qemuStorageLimitsRefresh(virQEMUDriverPtr driver,
virQEMUDriverConfigPtr cfg,
if (virStorageSourceGetActualType(src) == VIR_STORAGE_TYPE_BLOCK &&
format != VIR_STORAGE_FILE_RAW &&
S_ISBLK(sb.st_mode)) {
- qemuDomainObjPrivatePtr priv = vm->privateData;
-
- /* If the guest is not running, then success/failure return
- * depends on whether domain is persistent
- */
- if (!virDomainObjIsActive(vm)) {
- *activeFail = true;
+ if (!activeFail) {
+ disk->src->allocation = 0;
ret = 0;
- goto cleanup;
+ } else {
+ qemuDomainObjPrivatePtr priv = vm->privateData;
+
+ /* If the guest is not running, then success/failure return
+ * depends on whether domain is persistent
+ */
+ if (!virDomainObjIsActive(vm)) {
+ *activeFail = true;
+ ret = 0;
+ goto cleanup;
+ }
+
+ qemuDomainObjEnterMonitor(driver, vm);
+ ret = qemuMonitorGetBlockExtent(priv->mon,
+ disk->info.alias,
+ &src->allocation);
+ qemuDomainObjExitMonitor(driver, vm);
}
-
- qemuDomainObjEnterMonitor(driver, vm);
- ret = qemuMonitorGetBlockExtent(priv->mon,
- disk->info.alias,
- &src->allocation);
- qemuDomainObjExitMonitor(driver, vm);
-
} else {
ret = 0;
}
@@ -18530,6 +18542,7 @@ qemuDomainGetStatsBlock(virQEMUDriverPtr driver,
virHashTablePtr stats = NULL;
qemuDomainObjPrivatePtr priv = dom->privateData;
bool abbreviated = false;
+ virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver);
if (!HAVE_JOB(privflags) || !virDomainObjIsActive(dom)) {
abbreviated = true; /* it's ok, just go ahead silently */
@@ -18555,8 +18568,18 @@ qemuDomainGetStatsBlock(virQEMUDriverPtr driver,
if (abbreviated || !disk->info.alias ||
!(entry = virHashLookup(stats, disk->info.alias))) {
- /* FIXME: we could still look up sizing by sharing code
- * with qemuDomainGetBlockInfo */
+ if (qemuStorageLimitsRefresh(driver, cfg, dom,
+ disk, disk->src, NULL, NULL) < 0)
+ goto cleanup;
+ if (disk->src->allocation)
+ QEMU_ADD_BLOCK_PARAM_ULL(record, maxparams, i,
+ "allocation",
disk->src->allocation);
+ if (disk->src->capacity)
+ QEMU_ADD_BLOCK_PARAM_ULL(record, maxparams, i,
+ "capacity",
disk->src->capacity);
+ if (disk->src->physical)
+ QEMU_ADD_BLOCK_PARAM_ULL(record, maxparams, i,
+ "physical",
disk->src->physical);
continue;
}
@@ -18593,6 +18616,7 @@ qemuDomainGetStatsBlock(virQEMUDriverPtr driver,
cleanup:
virHashFree(stats);
+ virObjectUnref(cfg);
return ret;
}
--
1.9.3