block: Improve empty format-specific info dump
When a block driver supports obtaining format-specific information, but
that object only contains optional fields, it is possible that none of
them are present, so that dump_qobject() (called by
bdrv_image_info_specific_dump()) will not print anything.
The callers of bdrv_image_info_specific_dump() put a header above this
information ("Format specific information:\n"), which will look strange
when there is nothing below.  Modify bdrv_image_info_specific_dump() to
print this header instead of its callers, and only if there is indeed
something to be printed.
Signed-off-by: Hanna Reitz <hreitz@redhat.com>
Message-Id: <20220620162704.80987-2-hreitz@redhat.com>
Reviewed-by: Kevin Wolf <kwolf@redhat.com>
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
			
			
This commit is contained in:
		
							parent
							
								
									fcb9e05144
								
							
						
					
					
						commit
						3716470b24
					
				
							
								
								
									
										41
									
								
								block/qapi.c
									
									
									
									
									
								
							
							
						
						
									
										41
									
								
								block/qapi.c
									
									
									
									
									
								
							@ -760,7 +760,35 @@ static void dump_qdict(int indentation, QDict *dict)
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void bdrv_image_info_specific_dump(ImageInfoSpecific *info_spec)
 | 
					/*
 | 
				
			||||||
 | 
					 * Return whether dumping the given QObject with dump_qobject() would
 | 
				
			||||||
 | 
					 * yield an empty dump, i.e. not print anything.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					static bool qobject_is_empty_dump(const QObject *obj)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    switch (qobject_type(obj)) {
 | 
				
			||||||
 | 
					    case QTYPE_QNUM:
 | 
				
			||||||
 | 
					    case QTYPE_QSTRING:
 | 
				
			||||||
 | 
					    case QTYPE_QBOOL:
 | 
				
			||||||
 | 
					        return false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    case QTYPE_QDICT:
 | 
				
			||||||
 | 
					        return qdict_size(qobject_to(QDict, obj)) == 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    case QTYPE_QLIST:
 | 
				
			||||||
 | 
					        return qlist_empty(qobject_to(QList, obj));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    default:
 | 
				
			||||||
 | 
					        abort();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * Dumps the given ImageInfoSpecific object in a human-readable form,
 | 
				
			||||||
 | 
					 * prepending an optional prefix if the dump is not empty.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					void bdrv_image_info_specific_dump(ImageInfoSpecific *info_spec,
 | 
				
			||||||
 | 
					                                   const char *prefix)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    QObject *obj, *data;
 | 
					    QObject *obj, *data;
 | 
				
			||||||
    Visitor *v = qobject_output_visitor_new(&obj);
 | 
					    Visitor *v = qobject_output_visitor_new(&obj);
 | 
				
			||||||
@ -768,7 +796,12 @@ void bdrv_image_info_specific_dump(ImageInfoSpecific *info_spec)
 | 
				
			|||||||
    visit_type_ImageInfoSpecific(v, NULL, &info_spec, &error_abort);
 | 
					    visit_type_ImageInfoSpecific(v, NULL, &info_spec, &error_abort);
 | 
				
			||||||
    visit_complete(v, &obj);
 | 
					    visit_complete(v, &obj);
 | 
				
			||||||
    data = qdict_get(qobject_to(QDict, obj), "data");
 | 
					    data = qdict_get(qobject_to(QDict, obj), "data");
 | 
				
			||||||
    dump_qobject(1, data);
 | 
					    if (!qobject_is_empty_dump(data)) {
 | 
				
			||||||
 | 
					        if (prefix) {
 | 
				
			||||||
 | 
					            qemu_printf("%s", prefix);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        dump_qobject(1, data);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
    qobject_unref(obj);
 | 
					    qobject_unref(obj);
 | 
				
			||||||
    visit_free(v);
 | 
					    visit_free(v);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@ -849,7 +882,7 @@ void bdrv_image_info_dump(ImageInfo *info)
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (info->format_specific) {
 | 
					    if (info->format_specific) {
 | 
				
			||||||
        qemu_printf("Format specific information:\n");
 | 
					        bdrv_image_info_specific_dump(info->format_specific,
 | 
				
			||||||
        bdrv_image_info_specific_dump(info->format_specific);
 | 
					                                      "Format specific information:\n");
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -40,6 +40,7 @@ void bdrv_query_image_info(BlockDriverState *bs,
 | 
				
			|||||||
                           Error **errp);
 | 
					                           Error **errp);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void bdrv_snapshot_dump(QEMUSnapshotInfo *sn);
 | 
					void bdrv_snapshot_dump(QEMUSnapshotInfo *sn);
 | 
				
			||||||
void bdrv_image_info_specific_dump(ImageInfoSpecific *info_spec);
 | 
					void bdrv_image_info_specific_dump(ImageInfoSpecific *info_spec,
 | 
				
			||||||
 | 
					                                   const char *prefix);
 | 
				
			||||||
void bdrv_image_info_dump(ImageInfo *info);
 | 
					void bdrv_image_info_dump(ImageInfo *info);
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
				
			|||||||
@ -1788,8 +1788,8 @@ static int info_f(BlockBackend *blk, int argc, char **argv)
 | 
				
			|||||||
        return -EIO;
 | 
					        return -EIO;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    if (spec_info) {
 | 
					    if (spec_info) {
 | 
				
			||||||
        printf("Format specific information:\n");
 | 
					        bdrv_image_info_specific_dump(spec_info,
 | 
				
			||||||
        bdrv_image_info_specific_dump(spec_info);
 | 
					                                      "Format specific information:\n");
 | 
				
			||||||
        qapi_free_ImageInfoSpecific(spec_info);
 | 
					        qapi_free_ImageInfoSpecific(spec_info);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user