[libvirt] [PATCH v2] virsh: Don't break loop of domblkinfo for disks

Han Han posted 1 patch 5 years, 8 months ago
Patches applied successfully (tree, apply log)
git fetch https://github.com/patchew-project/libvirt tags/patchew/20180822094621.9017-1-hhan@redhat.com
Test syntax-check passed
There is a newer version of this series
tools/virsh-domain-monitor.c | 13 +++++++++----
1 file changed, 9 insertions(+), 4 deletions(-)
[libvirt] [PATCH v2] virsh: Don't break loop of domblkinfo for disks
Posted by Han Han 5 years, 8 months ago
https://bugzilla.redhat.com/show_bug.cgi?id=1619625

--all option is added to cmdDomblkinfo since commit 62c39193 allowing to
show all block devices info. Reset error when empty source in case error
breaks the loop of domblkinfo for disks.

Signed-off-by: Han Han <hhan@redhat.com>
---
 tools/virsh-domain-monitor.c | 13 +++++++++----
 1 file changed, 9 insertions(+), 4 deletions(-)

diff --git a/tools/virsh-domain-monitor.c b/tools/virsh-domain-monitor.c
index b9b4f9739b..576610f005 100644
--- a/tools/virsh-domain-monitor.c
+++ b/tools/virsh-domain-monitor.c
@@ -475,6 +475,7 @@ cmdDomblkinfo(vshControl *ctl, const vshCmd *cmd)
     int ndisks;
     size_t i;
     xmlNodePtr *disks = NULL;
+    char *source = NULL;
     char *target = NULL;
     char *protocol = NULL;
 
@@ -505,16 +506,18 @@ cmdDomblkinfo(vshControl *ctl, const vshCmd *cmd)
 
         for (i = 0; i < ndisks; i++) {
             ctxt->node = disks[i];
+            source = virXPathString("string(./source)", ctxt);
             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 &&
+                /* For the case of empty cdrom, networked disk which cannot
+                 * provide statistics, generate 0 based data and get the next
+                 * disk.
+                 */
+                if (!source && protocol && !active &&
                     virGetLastErrorCode() == VIR_ERR_INTERNAL_ERROR &&
                     virGetLastErrorDomain() == VIR_FROM_STORAGE) {
                     memset(&info, 0, sizeof(info));
@@ -526,6 +529,7 @@ cmdDomblkinfo(vshControl *ctl, const vshCmd *cmd)
 
             cmdDomblkinfoPrint(ctl, &info, target, human, false);
 
+            VIR_FREE(source);
             VIR_FREE(target);
             VIR_FREE(protocol);
         }
@@ -540,6 +544,7 @@ cmdDomblkinfo(vshControl *ctl, const vshCmd *cmd)
 
  cleanup:
     virshDomainFree(dom);
+    VIR_FREE(source);
     VIR_FREE(target);
     VIR_FREE(protocol);
     VIR_FREE(disks);
-- 
2.18.0

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list
Re: [libvirt] [PATCH v2] virsh: Don't break loop of domblkinfo for disks
Posted by Michal Privoznik 5 years, 7 months ago
On 08/22/2018 11:46 AM, Han Han wrote:
> https://bugzilla.redhat.com/show_bug.cgi?id=1619625
> 
> --all option is added to cmdDomblkinfo since commit 62c39193 allowing to
> show all block devices info. Reset error when empty source in case error
> breaks the loop of domblkinfo for disks.
> 
> Signed-off-by: Han Han <hhan@redhat.com>
> ---
>  tools/virsh-domain-monitor.c | 13 +++++++++----
>  1 file changed, 9 insertions(+), 4 deletions(-)
> 
> diff --git a/tools/virsh-domain-monitor.c b/tools/virsh-domain-monitor.c
> index b9b4f9739b..576610f005 100644
> --- a/tools/virsh-domain-monitor.c
> +++ b/tools/virsh-domain-monitor.c
> @@ -475,6 +475,7 @@ cmdDomblkinfo(vshControl *ctl, const vshCmd *cmd)
>      int ndisks;
>      size_t i;
>      xmlNodePtr *disks = NULL;
> +    char *source = NULL;
>      char *target = NULL;
>      char *protocol = NULL;
>  
> @@ -505,16 +506,18 @@ cmdDomblkinfo(vshControl *ctl, const vshCmd *cmd)
>  
>          for (i = 0; i < ndisks; i++) {
>              ctxt->node = disks[i];
> +            source = virXPathString("string(./source)", ctxt);
>              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 &&
> +                /* For the case of empty cdrom, networked disk which cannot
> +                 * provide statistics, generate 0 based data and get the next
> +                 * disk.
> +                 */
> +                if (!source && protocol && !active &&

Shouldn't this look like:

if ((!source || protocol) && !active &&

I guess we want this to be:

  - either source is missing, or
  - disk is a network one

Michal

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list
Re: [libvirt] [PATCH v2] virsh: Don't break loop of domblkinfo for disks
Posted by John Ferlan 5 years, 7 months ago

On 09/21/2018 08:32 AM, Michal Privoznik wrote:
> On 08/22/2018 11:46 AM, Han Han wrote:
>> https://bugzilla.redhat.com/show_bug.cgi?id=1619625
>>
>> --all option is added to cmdDomblkinfo since commit 62c39193 allowing to
>> show all block devices info. Reset error when empty source in case error
>> breaks the loop of domblkinfo for disks.
>>
>> Signed-off-by: Han Han <hhan@redhat.com>
>> ---
>>  tools/virsh-domain-monitor.c | 13 +++++++++----
>>  1 file changed, 9 insertions(+), 4 deletions(-)
>>
>> diff --git a/tools/virsh-domain-monitor.c b/tools/virsh-domain-monitor.c
>> index b9b4f9739b..576610f005 100644
>> --- a/tools/virsh-domain-monitor.c
>> +++ b/tools/virsh-domain-monitor.c
>> @@ -475,6 +475,7 @@ cmdDomblkinfo(vshControl *ctl, const vshCmd *cmd)
>>      int ndisks;
>>      size_t i;
>>      xmlNodePtr *disks = NULL;
>> +    char *source = NULL;
>>      char *target = NULL;
>>      char *protocol = NULL;
>>  
>> @@ -505,16 +506,18 @@ cmdDomblkinfo(vshControl *ctl, const vshCmd *cmd)
>>  
>>          for (i = 0; i < ndisks; i++) {
>>              ctxt->node = disks[i];
>> +            source = virXPathString("string(./source)", ctxt);
>>              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 &&
>> +                /* For the case of empty cdrom, networked disk which cannot
>> +                 * provide statistics, generate 0 based data and get the next
>> +                 * disk.
>> +                 */
>> +                if (!source && protocol && !active &&
> 
> Shouldn't this look like:
> 
> if ((!source || protocol) && !active &&
> 
> I guess we want this to be:
> 
>   - either source is missing, or
>   - disk is a network one
> 
> Michal
> 

There's a v3 already:

https://www.redhat.com/archives/libvir-list/2018-August/msg01418.html

John

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list