On 06/19/2018 06:01 AM, Chen Hanxiao wrote:
From: Chen Hanxiao <chenhanxiao(a)gmail.com>
This patch introduces --all to show all block devices info
of guests like:
virsh # domblkinfo w08 --all
Target Capacity Allocation Physical
---------------------------------------------------
hda 42949672960 9878110208 9878110208
vda 10737418240 10736439296 10737418240
Target Capacity Allocation Physical
---------------------------------------------------
hda 40.000 GiB 9.200 GiB 9.200 GiB
vda 10.000 GiB 9.999 GiB 10.000 GiB
Signed-off-by: Chen Hanxiao <chenhanxiao(a)gmail.com>
---
v3:
check error code on network disk
v2:
add support --human to --all
v1.1:
fix self-test
tools/virsh-domain-monitor.c | 128 +++++++++++++++++++++++++++++------
tools/virsh.pod | 5 +-
2 files changed, 112 insertions(+), 21 deletions(-)
Made a few adjustments as noted below... and will push shortly.
Reviewed-by: John Ferlan <jferlan(a)redhat.com>
John
diff --git a/tools/virsh-domain-monitor.c
b/tools/virsh-domain-monitor.c
index daa86e8310..43e39f79c1 100644
--- a/tools/virsh-domain-monitor.c
+++ b/tools/virsh-domain-monitor.c
[...]
static bool
@@ -430,25 +466,77 @@ cmdDomblkinfo(vshControl *ctl, const vshCmd *cmd)
virDomainPtr dom;
bool ret = false;
bool human = false;
[...]
+
+ for (i = 0; i < ndisks; i++) {
+ ctxt->node = disks[i];
+ protocol = virXPathString("string(./source/@protocol)", ctxt);
+ target = virXPathString("string(./target/@dev)", ctxt);
+
+ rc = virDomainGetBlockInfo(dom, target, &info, 0);
+
+ if (rc < 0) {
Added the following comment:
/* If protocol is present that's an indication of a networked
* storage device which cannot provide statistics, so generate
* 0 based data and get the next disk. */
+ if (protocol && !active &&
+ virGetLastErrorCode() == VIR_ERR_INTERNAL_ERROR &&
+ virGetLastErrorDomain() == VIR_FROM_STORAGE)
+ memset(&info, 0, sizeof(info));
Since we're ditching the error and continuing:
vshResetLibvirtError();
+ else
+ goto cleanup;
+ }
+
+ cmdDomblkinfoPrint(ctl, &info, target, human, false);
+
+ VIR_FREE(target);
Since we're in the loop:
VIR_FREE(protocol);
+ }
+ } else {
+ if (virDomainGetBlockInfo(dom, device, &info, 0) < 0)
+ goto cleanup;
+
+ cmdDomblkinfoPrint(ctl, &info, NULL, human, false);
+ }
ret = true;
[...]