qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PATCH V5 3/7] qmp: Add a command to list the named Blo


From: Fam Zheng
Subject: Re: [Qemu-devel] [PATCH V5 3/7] qmp: Add a command to list the named BlockDriverState nodes.
Date: Tue, 21 Jan 2014 11:23:34 +0800
User-agent: Mutt/1.5.22 (2013-10-16)

I think it's worth to at least mention the name of the command in the commit
message.

On Thu, 12/12 16:33, Benoît Canet wrote:
> Signed-off-by: Benoit Canet <address@hidden>
> ---
>  block.c               |  18 +++++++++
>  block/qapi.c          | 109 
> +++++++++++++++++++++++++-------------------------
>  blockdev.c            |   5 +++
>  include/block/block.h |   1 +
>  include/block/qapi.h  |   1 +
>  qapi-schema.json      |  16 +++++++-
>  qmp-commands.hx       |  61 ++++++++++++++++++++++++++++
>  7 files changed, 155 insertions(+), 56 deletions(-)
> 
> diff --git a/block.c b/block.c
> index 1c57f0d..78d13e5 100644
> --- a/block.c
> +++ b/block.c
> @@ -32,6 +32,7 @@
>  #include "sysemu/sysemu.h"
>  #include "qemu/notify.h"
>  #include "block/coroutine.h"
> +#include "block/qapi.h"
>  #include "qmp-commands.h"
>  #include "qemu/timer.h"
>  
> @@ -3189,6 +3190,23 @@ BlockDriverState *bdrv_find_node(const char *node_name)
>      return NULL;
>  }
>  
> +/* Put this QMP function here so it can access the static graph_bdrv_states. 
> */
> +BlockDeviceInfoList *bdrv_named_nodes_list(void)
> +{
> +    BlockDeviceInfoList *list, *entry;
> +    BlockDriverState *bs;
> +
> +    list = NULL;
> +    QTAILQ_FOREACH(bs, &graph_bdrv_states, node_list) {
> +        entry = g_malloc0(sizeof(*entry));
> +        entry->value = bdrv_block_device_info(bs);
> +        entry->next = list;
> +        list = entry;
> +    }
> +
> +    return list;
> +}
> +
>  BlockDriverState *bdrv_next(BlockDriverState *bs)
>  {
>      if (!bs) {
> diff --git a/block/qapi.c b/block/qapi.c
> index a32cb79..556f7fb 100644
> --- a/block/qapi.c
> +++ b/block/qapi.c
> @@ -29,6 +29,60 @@
>  #include "qapi/qmp-output-visitor.h"
>  #include "qapi/qmp/types.h"
>  
> +BlockDeviceInfo *bdrv_block_device_info(BlockDriverState *bs)
> +{
> +    BlockDeviceInfo *info = g_malloc0(sizeof(*info));
> +
> +    info->file                   = g_strdup(bs->filename);
> +    info->ro                     = bs->read_only;
> +    info->drv                    = g_strdup(bs->drv->format_name);
> +    info->encrypted              = bs->encrypted;
> +    info->encryption_key_missing = bdrv_key_required(bs);
> +
> +    if (bs->node_name[0]) {
> +        info->has_node_name = true;
> +        info->node_name = g_strdup(bs->node_name);
> +    }
> +
> +    if (bs->backing_file[0]) {
> +        info->has_backing_file = true;
> +        info->backing_file = g_strdup(bs->backing_file);
> +    }
> +
> +    info->backing_file_depth = bdrv_get_backing_file_depth(bs);
> +
> +    if (bs->io_limits_enabled) {
> +        ThrottleConfig cfg;
> +        throttle_get_config(&bs->throttle_state, &cfg);
> +        info->bps     = cfg.buckets[THROTTLE_BPS_TOTAL].avg;
> +        info->bps_rd  = cfg.buckets[THROTTLE_BPS_READ].avg;
> +        info->bps_wr  = cfg.buckets[THROTTLE_BPS_WRITE].avg;
> +
> +        info->iops    = cfg.buckets[THROTTLE_OPS_TOTAL].avg;
> +        info->iops_rd = cfg.buckets[THROTTLE_OPS_READ].avg;
> +        info->iops_wr = cfg.buckets[THROTTLE_OPS_WRITE].avg;
> +
> +        info->has_bps_max     = cfg.buckets[THROTTLE_BPS_TOTAL].max;
> +        info->bps_max         = cfg.buckets[THROTTLE_BPS_TOTAL].max;
> +        info->has_bps_rd_max  = cfg.buckets[THROTTLE_BPS_READ].max;
> +        info->bps_rd_max      = cfg.buckets[THROTTLE_BPS_READ].max;
> +        info->has_bps_wr_max  = cfg.buckets[THROTTLE_BPS_WRITE].max;
> +        info->bps_wr_max      = cfg.buckets[THROTTLE_BPS_WRITE].max;
> +
> +        info->has_iops_max    = cfg.buckets[THROTTLE_OPS_TOTAL].max;
> +        info->iops_max        = cfg.buckets[THROTTLE_OPS_TOTAL].max;
> +        info->has_iops_rd_max = cfg.buckets[THROTTLE_OPS_READ].max;
> +        info->iops_rd_max     = cfg.buckets[THROTTLE_OPS_READ].max;
> +        info->has_iops_wr_max = cfg.buckets[THROTTLE_OPS_WRITE].max;
> +        info->iops_wr_max     = cfg.buckets[THROTTLE_OPS_WRITE].max;
> +
> +        info->has_iops_size = cfg.op_size;
> +        info->iops_size = cfg.op_size;
> +    }
> +
> +    return info;
> +}
> +
>  /*
>   * Returns 0 on success, with *p_list either set to describe snapshot
>   * information, or NULL because there are no snapshots.  Returns -errno on
> @@ -211,60 +265,7 @@ void bdrv_query_info(BlockDriverState *bs,
>  
>      if (bs->drv) {
>          info->has_inserted = true;
> -        info->inserted = g_malloc0(sizeof(*info->inserted));
> -        info->inserted->file = g_strdup(bs->filename);
> -        info->inserted->ro = bs->read_only;
> -        info->inserted->drv = g_strdup(bs->drv->format_name);
> -        info->inserted->encrypted = bs->encrypted;
> -        info->inserted->encryption_key_missing = bdrv_key_required(bs);
> -
> -        if (bs->backing_file[0]) {
> -            info->inserted->has_backing_file = true;
> -            info->inserted->backing_file = g_strdup(bs->backing_file);
> -        }
> -
> -        info->inserted->backing_file_depth = bdrv_get_backing_file_depth(bs);
> -
> -        if (bs->io_limits_enabled) {
> -            ThrottleConfig cfg;
> -            throttle_get_config(&bs->throttle_state, &cfg);
> -            info->inserted->bps     = cfg.buckets[THROTTLE_BPS_TOTAL].avg;
> -            info->inserted->bps_rd  = cfg.buckets[THROTTLE_BPS_READ].avg;
> -            info->inserted->bps_wr  = cfg.buckets[THROTTLE_BPS_WRITE].avg;
> -
> -            info->inserted->iops    = cfg.buckets[THROTTLE_OPS_TOTAL].avg;
> -            info->inserted->iops_rd = cfg.buckets[THROTTLE_OPS_READ].avg;
> -            info->inserted->iops_wr = cfg.buckets[THROTTLE_OPS_WRITE].avg;
> -
> -            info->inserted->has_bps_max     =
> -                cfg.buckets[THROTTLE_BPS_TOTAL].max;
> -            info->inserted->bps_max         =
> -                cfg.buckets[THROTTLE_BPS_TOTAL].max;
> -            info->inserted->has_bps_rd_max  =
> -                cfg.buckets[THROTTLE_BPS_READ].max;
> -            info->inserted->bps_rd_max      =
> -                cfg.buckets[THROTTLE_BPS_READ].max;
> -            info->inserted->has_bps_wr_max  =
> -                cfg.buckets[THROTTLE_BPS_WRITE].max;
> -            info->inserted->bps_wr_max      =
> -                cfg.buckets[THROTTLE_BPS_WRITE].max;
> -
> -            info->inserted->has_iops_max    =
> -                cfg.buckets[THROTTLE_OPS_TOTAL].max;
> -            info->inserted->iops_max        =
> -                cfg.buckets[THROTTLE_OPS_TOTAL].max;
> -            info->inserted->has_iops_rd_max =
> -                cfg.buckets[THROTTLE_OPS_READ].max;
> -            info->inserted->iops_rd_max     =
> -                cfg.buckets[THROTTLE_OPS_READ].max;
> -            info->inserted->has_iops_wr_max =
> -                cfg.buckets[THROTTLE_OPS_WRITE].max;
> -            info->inserted->iops_wr_max     =
> -                cfg.buckets[THROTTLE_OPS_WRITE].max;
> -
> -            info->inserted->has_iops_size = cfg.op_size;
> -            info->inserted->iops_size = cfg.op_size;
> -        }
> +        info->inserted = bdrv_block_device_info(bs);
>  
>          bs0 = bs;
>          p_image_info = &info->inserted->image;
> diff --git a/blockdev.c b/blockdev.c
> index 44755e1..204ab40 100644
> --- a/blockdev.c
> +++ b/blockdev.c
> @@ -1940,6 +1940,11 @@ void qmp_drive_backup(const char *device, const char 
> *target,
>      }
>  }
>  
> +BlockDeviceInfoList *qmp_query_named_block_nodes(Error **errp)
> +{
> +    return bdrv_named_nodes_list();
> +}
> +
>  #define DEFAULT_MIRROR_BUF_SIZE   (10 << 20)
>  
>  void qmp_drive_mirror(const char *device, const char *target,
> diff --git a/include/block/block.h b/include/block/block.h
> index 834abf9..8c10123 100644
> --- a/include/block/block.h
> +++ b/include/block/block.h
> @@ -375,6 +375,7 @@ void bdrv_eject(BlockDriverState *bs, bool eject_flag);
>  const char *bdrv_get_format_name(BlockDriverState *bs);
>  BlockDriverState *bdrv_find(const char *name);
>  BlockDriverState *bdrv_find_node(const char *node_name);
> +BlockDeviceInfoList *bdrv_named_nodes_list(void);
>  BlockDriverState *bdrv_next(BlockDriverState *bs);
>  void bdrv_iterate(void (*it)(void *opaque, BlockDriverState *bs),
>                    void *opaque);
> diff --git a/include/block/qapi.h b/include/block/qapi.h
> index 9518ee4..e92c00d 100644
> --- a/include/block/qapi.h
> +++ b/include/block/qapi.h
> @@ -29,6 +29,7 @@
>  #include "block/block.h"
>  #include "block/snapshot.h"
>  
> +BlockDeviceInfo *bdrv_block_device_info(BlockDriverState *bs);
>  int bdrv_query_snapshot_info_list(BlockDriverState *bs,
>                                    SnapshotInfoList **p_list,
>                                    Error **errp);
> diff --git a/qapi-schema.json b/qapi-schema.json
> index c3c939c..0dadd5d 100644
> --- a/qapi-schema.json
> +++ b/qapi-schema.json
> @@ -810,6 +810,8 @@
>  #
>  # @file: the filename of the backing device
>  #
> +# @node-name: #optional the name of the block driver node (Since 2.0)
> +#
>  # @ro: true if the backing device was open read-only
>  #
>  # @drv: the name of the block format used to open the backing device. As of
> @@ -857,10 +859,9 @@
>  #
>  # Since: 0.14.0
>  #
> -# Notes: This interface is only found in @BlockInfo.
>  ##
>  { 'type': 'BlockDeviceInfo',
> -  'data': { 'file': 'str', 'ro': 'bool', 'drv': 'str',
> +  'data': { 'file': 'str', '*node-name': 'str', 'ro': 'bool', 'drv': 'str',
>              '*backing_file': 'str', 'backing_file_depth': 'int',
>              'encrypted': 'bool', 'encryption_key_missing': 'bool',
>              'bps': 'int', 'bps_rd': 'int', 'bps_wr': 'int',
> @@ -2008,6 +2009,17 @@
>  { 'command': 'drive-backup', 'data': 'DriveBackup' }
>  
>  ##
> +# @query-named-block-nodes
> +#
> +# Get the named block driver list
> +#
> +# Returns: the list of BlockDeviceInfo
> +#
> +# Since 2.0
> +##
> +{ 'command': 'query-named-block-nodes', 'returns': [ 'BlockDeviceInfo' ] }
> +
> +##
>  # @drive-mirror
>  #
>  # Start mirroring a block device's writes to a new destination.
> diff --git a/qmp-commands.hx b/qmp-commands.hx
> index fba15cd..d644fe9 100644
> --- a/qmp-commands.hx
> +++ b/qmp-commands.hx
> @@ -3295,3 +3295,64 @@ Example (2):
>  <- { "return": {} }
>  
>  EQMP
> +
> +    {
> +        .name       = "query-named-block-nodes",
> +        .args_type  = "",
> +        .mhandler.cmd_new = qmp_marshal_input_query_named_block_nodes,
> +    },
> +
> +SQMP
> address@hidden
> +------------------------
> +
> +Return a list of BlockDeviceInfo for each named block driver node

How about "Return a list of BlockDeviceInfo for all the named block driver 
nodes"

But nothing to stop adding

Reviewed-by: Fam Zheng <address@hidden>

> +
> +Example:
> +
> +-> { "execute": "query-named-block-nodes" }
> +<- { "return": [ { "ro":false,
> +                   "drv":"qcow2",
> +                   "encrypted":false,
> +                   "file":"disks/test.qcow2",
> +                   "node-name": "my-node",
> +                   "backing_file_depth":1,
> +                   "bps":1000000,
> +                   "bps_rd":0,
> +                   "bps_wr":0,
> +                   "iops":1000000,
> +                   "iops_rd":0,
> +                   "iops_wr":0,
> +                   "bps_max": 8000000,
> +                   "bps_rd_max": 0,
> +                   "bps_wr_max": 0,
> +                   "iops_max": 0,
> +                   "iops_rd_max": 0,
> +                   "iops_wr_max": 0,
> +                   "iops_size": 0,
> +                   "image":{
> +                      "filename":"disks/test.qcow2",
> +                      "format":"qcow2",
> +                      "virtual-size":2048000,
> +                      "backing_file":"base.qcow2",
> +                      "full-backing-filename":"disks/base.qcow2",
> +                      "backing-filename-format:"qcow2",
> +                      "snapshots":[
> +                         {
> +                            "id": "1",
> +                            "name": "snapshot1",
> +                            "vm-state-size": 0,
> +                            "date-sec": 10000200,
> +                            "date-nsec": 12,
> +                            "vm-clock-sec": 206,
> +                            "vm-clock-nsec": 30
> +                         }
> +                      ],
> +                      "backing-image":{
> +                          "filename":"disks/base.qcow2",
> +                          "format":"qcow2",
> +                          "virtual-size":2048000
> +                      }
> +                   } } ] }
> +
> +EQMP
> -- 
> 1.8.3.2
> 
> 



reply via email to

[Prev in Thread] Current Thread [Next in Thread]