[libvirt] [PATCH v2 1/1] fixed handling of sourceless disks in 'domblkinfo' cmd

Pavel Mores pmores at redhat.com
Fri Oct 4 11:35:09 UTC 2019


virDomainGetBlockInfo() returns error if called on a disk with no
source (a sourceless disk might be a removable media drive with no
media in it, for instance an empty CDROM or floppy drive).

So far this caused the virsh domblkinfo --all command to abort and
ignore any remaining (not yet displayed) disk devices.  This patch
fixes the problem by first checking for existence of a <source>
element in the corresponding XML.  If none is found, we avoid calling
virDomainGetBlockInfo() altogether as we know it's bound to fail in
that case.

https://bugzilla.redhat.com/show_bug.cgi?id=1619625

Signed-off-by: Pavel Mores <pmores at redhat.com>
---
 tools/virsh-domain-monitor.c | 33 ++++++++++++++++++++-------------
 1 file changed, 20 insertions(+), 13 deletions(-)

diff --git a/tools/virsh-domain-monitor.c b/tools/virsh-domain-monitor.c
index 0e2c4191d7..b69283b2da 100644
--- a/tools/virsh-domain-monitor.c
+++ b/tools/virsh-domain-monitor.c
@@ -507,20 +507,27 @@ cmdDomblkinfo(vshControl *ctl, const vshCmd *cmd)
             protocol = virXPathString("string(./source/@protocol)", ctxt);
             target = virXPathString("string(./target/@dev)", ctxt);
 
-            rc = virDomainGetBlockInfo(dom, target, &info, 0);
-
-            if (rc < 0) {
-                /* 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));
-                    vshResetLibvirtError();
-                } else {
-                    goto cleanup;
+            if (virXPathBoolean("boolean(./source)", ctxt) == 1) {
+
+                rc = virDomainGetBlockInfo(dom, target, &info, 0);
+
+                if (rc < 0) {
+                    /* 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));
+                        vshResetLibvirtError();
+                    } else {
+                        goto cleanup;
+                    }
                 }
+            } else {
+                /* if we don't call virDomainGetBlockInfo() who clears 'info'
+                 * we have to do it manually */
+                memset(&info, 0, sizeof(info));
             }
 
             if (!cmdDomblkinfoGet(ctl, &info, &cap, &alloc, &phy, human))
-- 
2.21.0




More information about the libvir-list mailing list