And provide domain summary stats in that case, for lxc backend.
Use case is a container domain using passthrough bind mounts of the
host filesystem, which is a common case for lxc.
---
src/libvirt.c | 1 -
src/lxc/lxc_driver.c | 10 ++++++++++
src/qemu/qemu_driver.c | 2 ++
src/remote/remote_driver.c | 2 ++
src/test/test_driver.c | 2 ++
src/xen/xen_driver.c | 2 ++
6 files changed, 18 insertions(+), 1 deletion(-)
diff --git a/src/libvirt.c b/src/libvirt.c
index 87a4d46..14ffca0 100644
--- a/src/libvirt.c
+++ b/src/libvirt.c
@@ -7804,7 +7804,6 @@ virDomainBlockStats(virDomainPtr dom, const char *disk,
virResetLastError();
virCheckDomainReturn(dom, -1);
- virCheckNonNullArgGoto(disk, error);
virCheckNonNullArgGoto(stats, error);
if (size > sizeof(stats2)) {
virReportInvalidArg(size,
diff --git a/src/lxc/lxc_driver.c b/src/lxc/lxc_driver.c
index 1d2a457..fba9c12 100644
--- a/src/lxc/lxc_driver.c
+++ b/src/lxc/lxc_driver.c
@@ -2044,6 +2044,16 @@ lxcDomainBlockStats(virDomainPtr dom,
goto cleanup;
}
+ if (!path || !*path) {
+ /* empty/NULL path - return entire domain blkstats instead */
+ ret = virCgroupGetBlkioIoServiced(priv->cgroup,
+ &stats->rd_bytes,
+ &stats->wr_bytes,
+ &stats->rd_req,
+ &stats->wr_req);
+ goto cleanup;
+ }
+
if ((idx = virDomainDiskIndexByName(vm->def, path, false)) < 0) {
virReportError(VIR_ERR_INVALID_ARG,
_("invalid path: %s"), path);
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index 2d92873..4dcf12b 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -9021,6 +9021,8 @@ qemuDomainBlockStats(virDomainPtr dom,
virDomainDiskDefPtr disk = NULL;
qemuDomainObjPrivatePtr priv;
+ virCheckNonNullArgReturn(path, -1);
+
if (!(vm = qemuDomObjFromDomain(dom)))
goto cleanup;
diff --git a/src/remote/remote_driver.c b/src/remote/remote_driver.c
index da9c1c9..160bdd4 100644
--- a/src/remote/remote_driver.c
+++ b/src/remote/remote_driver.c
@@ -1713,6 +1713,8 @@ remoteDomainBlockStatsFlags(virDomainPtr domain,
remote_domain_block_stats_flags_ret ret;
struct private_data *priv = domain->conn->privateData;
+ virCheckNonNullArgReturn(path, -1);
+
remoteDriverLock(priv);
make_nonnull_domain(&args.dom, domain);
diff --git a/src/test/test_driver.c b/src/test/test_driver.c
index b724f82..7c637bb 100644
--- a/src/test/test_driver.c
+++ b/src/test/test_driver.c
@@ -3362,6 +3362,8 @@ static int testDomainBlockStats(virDomainPtr domain,
unsigned long long statbase;
int ret = -1;
+ virCheckNonNullArgReturn(path, -1);
+
testDriverLock(privconn);
privdom = virDomainObjListFindByName(privconn->domains,
domain->name);
diff --git a/src/xen/xen_driver.c b/src/xen/xen_driver.c
index c45d10f..2b9ac21 100644
--- a/src/xen/xen_driver.c
+++ b/src/xen/xen_driver.c
@@ -2217,6 +2217,8 @@ xenUnifiedDomainBlockStats(virDomainPtr dom, const char *path,
virDomainDefPtr def = NULL;
int ret = -1;
+ virCheckNonNullArgReturn(path, -1);
+
if (!(def = xenGetDomainDefForDom(dom)))
goto cleanup;
--
1.8.4