qmp: Add optional switch "query-nodes" in query-blockstats
This bool option will allow query all the node names. It iterates all the BDSes that are assigned a name, also in this case don't query up the backing chain. Signed-off-by: Fam Zheng <famz@redhat.com> Reviewed-by: Max Reitz <mreitz@redhat.com> Signed-off-by: Max Reitz <mreitz@redhat.com> Signed-off-by: Kevin Wolf <kwolf@redhat.com>
This commit is contained in:
		
							parent
							
								
									4875a77950
								
							
						
					
					
						commit
						f71eaa74c0
					
				
							
								
								
									
										20
									
								
								block/qapi.c
									
									
									
									
									
								
							
							
						
						
									
										20
									
								
								block/qapi.c
									
									
									
									
									
								
							| @ -300,7 +300,8 @@ static void bdrv_query_info(BlockBackend *blk, BlockInfo **p_info, | ||||
|     qapi_free_BlockInfo(info); | ||||
| } | ||||
| 
 | ||||
| static BlockStats *bdrv_query_stats(const BlockDriverState *bs) | ||||
| static BlockStats *bdrv_query_stats(const BlockDriverState *bs, | ||||
|                                     bool query_backing) | ||||
| { | ||||
|     BlockStats *s; | ||||
| 
 | ||||
| @ -330,12 +331,12 @@ static BlockStats *bdrv_query_stats(const BlockDriverState *bs) | ||||
| 
 | ||||
|     if (bs->file) { | ||||
|         s->has_parent = true; | ||||
|         s->parent = bdrv_query_stats(bs->file); | ||||
|         s->parent = bdrv_query_stats(bs->file, query_backing); | ||||
|     } | ||||
| 
 | ||||
|     if (bs->backing_hd) { | ||||
|     if (query_backing && bs->backing_hd) { | ||||
|         s->has_backing = true; | ||||
|         s->backing = bdrv_query_stats(bs->backing_hd); | ||||
|         s->backing = bdrv_query_stats(bs->backing_hd, query_backing); | ||||
|     } | ||||
| 
 | ||||
|     return s; | ||||
| @ -366,17 +367,22 @@ BlockInfoList *qmp_query_block(Error **errp) | ||||
|     return NULL; | ||||
| } | ||||
| 
 | ||||
| BlockStatsList *qmp_query_blockstats(Error **errp) | ||||
| BlockStatsList *qmp_query_blockstats(bool has_query_nodes, | ||||
|                                      bool query_nodes, | ||||
|                                      Error **errp) | ||||
| { | ||||
|     BlockStatsList *head = NULL, **p_next = &head; | ||||
|     BlockDriverState *bs = NULL; | ||||
| 
 | ||||
|      while ((bs = bdrv_next(bs))) { | ||||
|     /* Just to be safe if query_nodes is not always initialized */ | ||||
|     query_nodes = has_query_nodes && query_nodes; | ||||
| 
 | ||||
|     while ((bs = query_nodes ? bdrv_next_node(bs) : bdrv_next(bs))) { | ||||
|         BlockStatsList *info = g_malloc0(sizeof(*info)); | ||||
|         AioContext *ctx = bdrv_get_aio_context(bs); | ||||
| 
 | ||||
|         aio_context_acquire(ctx); | ||||
|         info->value = bdrv_query_stats(bs); | ||||
|         info->value = bdrv_query_stats(bs, !query_nodes); | ||||
|         aio_context_release(ctx); | ||||
| 
 | ||||
|         *p_next = info; | ||||
|  | ||||
							
								
								
									
										2
									
								
								hmp.c
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								hmp.c
									
									
									
									
									
								
							| @ -403,7 +403,7 @@ void hmp_info_blockstats(Monitor *mon, const QDict *qdict) | ||||
| { | ||||
|     BlockStatsList *stats_list, *stats; | ||||
| 
 | ||||
|     stats_list = qmp_query_blockstats(NULL); | ||||
|     stats_list = qmp_query_blockstats(false, false, NULL); | ||||
| 
 | ||||
|     for (stats = stats_list; stats; stats = stats->next) { | ||||
|         if (!stats->value->has_device) { | ||||
|  | ||||
| @ -427,11 +427,20 @@ | ||||
| # | ||||
| # Query the @BlockStats for all virtual block devices. | ||||
| # | ||||
| # @query-nodes: #optional If true, the command will query all the block nodes | ||||
| #               that have a node name, in a list which will include "parent" | ||||
| #               information, but not "backing". | ||||
| #               If false or omitted, the behavior is as before - query all the | ||||
| #               device backends, recursively including their "parent" and | ||||
| #               "backing". (Since 2.3) | ||||
| # | ||||
| # Returns: A list of @BlockStats for each virtual block devices. | ||||
| # | ||||
| # Since: 0.14.0 | ||||
| ## | ||||
| { 'command': 'query-blockstats', 'returns': ['BlockStats'] } | ||||
| { 'command': 'query-blockstats', | ||||
|   'data': { '*query-nodes': 'bool' }, | ||||
|   'returns': ['BlockStats'] } | ||||
| 
 | ||||
| ## | ||||
| # @BlockdevOnError: | ||||
|  | ||||
| @ -2347,7 +2347,7 @@ EQMP | ||||
| 
 | ||||
|     { | ||||
|         .name       = "query-blockstats", | ||||
|         .args_type  = "", | ||||
|         .args_type  = "query-nodes:b?", | ||||
|         .mhandler.cmd_new = qmp_marshal_input_query_blockstats, | ||||
|     }, | ||||
| 
 | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Fam Zheng
						Fam Zheng