
On 06/19/2018 06:01 AM, Chen Hanxiao wrote:
From: Chen Hanxiao <chenhanxiao@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@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@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; [...]