From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:58534) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1W6QwI-0002W5-4h for qemu-devel@nongnu.org; Thu, 23 Jan 2014 15:31:55 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1W6QwB-0004nT-3Y for qemu-devel@nongnu.org; Thu, 23 Jan 2014 15:31:50 -0500 Received: from paradis.irqsave.net ([62.212.105.220]:48171) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1W6QwA-0004my-1m for qemu-devel@nongnu.org; Thu, 23 Jan 2014 15:31:43 -0500 From: =?UTF-8?q?Beno=C3=AEt=20Canet?= Date: Thu, 23 Jan 2014 21:31:34 +0100 Message-Id: <1390509099-695-4-git-send-email-benoit.canet@irqsave.net> In-Reply-To: <1390509099-695-1-git-send-email-benoit.canet@irqsave.net> References: <1390509099-695-1-git-send-email-benoit.canet@irqsave.net> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable Subject: [Qemu-devel] [PATCH V6 3/8] qmp: Add QMP query-named-block-nodes to list the named BlockDriverState nodes. List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: kwolf@redhat.com, famz@redhat.com, =?UTF-8?q?Beno=C3=AEt=20Canet?= , armbru@redhat.com, mreitz@redhat.com, stefanha@redhat.com From: Beno=C3=AEt Canet Signed-off-by: Benoit Canet Reviewed-by: Fam Zheng --- 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 d9d02d2..9e45755 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" =20 @@ -3285,6 +3286,23 @@ BlockDriverState *bdrv_find_node(const char *node_= name) return NULL; } =20 +/* Put this QMP function here so it can access the static graph_bdrv_sta= tes. */ +BlockDeviceInfoList *bdrv_named_nodes_list(void) +{ + BlockDeviceInfoList *list, *entry; + BlockDriverState *bs; + + list =3D NULL; + QTAILQ_FOREACH(bs, &graph_bdrv_states, node_list) { + entry =3D g_malloc0(sizeof(*entry)); + entry->value =3D bdrv_block_device_info(bs); + entry->next =3D list; + list =3D 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" =20 +BlockDeviceInfo *bdrv_block_device_info(BlockDriverState *bs) +{ + BlockDeviceInfo *info =3D g_malloc0(sizeof(*info)); + + info->file =3D g_strdup(bs->filename); + info->ro =3D bs->read_only; + info->drv =3D g_strdup(bs->drv->format_name); + info->encrypted =3D bs->encrypted; + info->encryption_key_missing =3D bdrv_key_required(bs); + + if (bs->node_name[0]) { + info->has_node_name =3D true; + info->node_name =3D g_strdup(bs->node_name); + } + + if (bs->backing_file[0]) { + info->has_backing_file =3D true; + info->backing_file =3D g_strdup(bs->backing_file); + } + + info->backing_file_depth =3D bdrv_get_backing_file_depth(bs); + + if (bs->io_limits_enabled) { + ThrottleConfig cfg; + throttle_get_config(&bs->throttle_state, &cfg); + info->bps =3D cfg.buckets[THROTTLE_BPS_TOTAL].avg; + info->bps_rd =3D cfg.buckets[THROTTLE_BPS_READ].avg; + info->bps_wr =3D cfg.buckets[THROTTLE_BPS_WRITE].avg; + + info->iops =3D cfg.buckets[THROTTLE_OPS_TOTAL].avg; + info->iops_rd =3D cfg.buckets[THROTTLE_OPS_READ].avg; + info->iops_wr =3D cfg.buckets[THROTTLE_OPS_WRITE].avg; + + info->has_bps_max =3D cfg.buckets[THROTTLE_BPS_TOTAL].max; + info->bps_max =3D cfg.buckets[THROTTLE_BPS_TOTAL].max; + info->has_bps_rd_max =3D cfg.buckets[THROTTLE_BPS_READ].max; + info->bps_rd_max =3D cfg.buckets[THROTTLE_BPS_READ].max; + info->has_bps_wr_max =3D cfg.buckets[THROTTLE_BPS_WRITE].max; + info->bps_wr_max =3D cfg.buckets[THROTTLE_BPS_WRITE].max; + + info->has_iops_max =3D cfg.buckets[THROTTLE_OPS_TOTAL].max; + info->iops_max =3D cfg.buckets[THROTTLE_OPS_TOTAL].max; + info->has_iops_rd_max =3D cfg.buckets[THROTTLE_OPS_READ].max; + info->iops_rd_max =3D cfg.buckets[THROTTLE_OPS_READ].max; + info->has_iops_wr_max =3D cfg.buckets[THROTTLE_OPS_WRITE].max; + info->iops_wr_max =3D cfg.buckets[THROTTLE_OPS_WRITE].max; + + info->has_iops_size =3D cfg.op_size; + info->iops_size =3D 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, =20 if (bs->drv) { info->has_inserted =3D true; - info->inserted =3D g_malloc0(sizeof(*info->inserted)); - info->inserted->file =3D g_strdup(bs->filename); - info->inserted->ro =3D bs->read_only; - info->inserted->drv =3D g_strdup(bs->drv->format_name); - info->inserted->encrypted =3D bs->encrypted; - info->inserted->encryption_key_missing =3D bdrv_key_required(bs)= ; - - if (bs->backing_file[0]) { - info->inserted->has_backing_file =3D true; - info->inserted->backing_file =3D g_strdup(bs->backing_file); - } - - info->inserted->backing_file_depth =3D bdrv_get_backing_file_dep= th(bs); - - if (bs->io_limits_enabled) { - ThrottleConfig cfg; - throttle_get_config(&bs->throttle_state, &cfg); - info->inserted->bps =3D cfg.buckets[THROTTLE_BPS_TOTAL].= avg; - info->inserted->bps_rd =3D cfg.buckets[THROTTLE_BPS_READ].a= vg; - info->inserted->bps_wr =3D cfg.buckets[THROTTLE_BPS_WRITE].= avg; - - info->inserted->iops =3D cfg.buckets[THROTTLE_OPS_TOTAL].= avg; - info->inserted->iops_rd =3D cfg.buckets[THROTTLE_OPS_READ].a= vg; - info->inserted->iops_wr =3D cfg.buckets[THROTTLE_OPS_WRITE].= avg; - - info->inserted->has_bps_max =3D - cfg.buckets[THROTTLE_BPS_TOTAL].max; - info->inserted->bps_max =3D - cfg.buckets[THROTTLE_BPS_TOTAL].max; - info->inserted->has_bps_rd_max =3D - cfg.buckets[THROTTLE_BPS_READ].max; - info->inserted->bps_rd_max =3D - cfg.buckets[THROTTLE_BPS_READ].max; - info->inserted->has_bps_wr_max =3D - cfg.buckets[THROTTLE_BPS_WRITE].max; - info->inserted->bps_wr_max =3D - cfg.buckets[THROTTLE_BPS_WRITE].max; - - info->inserted->has_iops_max =3D - cfg.buckets[THROTTLE_OPS_TOTAL].max; - info->inserted->iops_max =3D - cfg.buckets[THROTTLE_OPS_TOTAL].max; - info->inserted->has_iops_rd_max =3D - cfg.buckets[THROTTLE_OPS_READ].max; - info->inserted->iops_rd_max =3D - cfg.buckets[THROTTLE_OPS_READ].max; - info->inserted->has_iops_wr_max =3D - cfg.buckets[THROTTLE_OPS_WRITE].max; - info->inserted->iops_wr_max =3D - cfg.buckets[THROTTLE_OPS_WRITE].max; - - info->inserted->has_iops_size =3D cfg.op_size; - info->inserted->iops_size =3D cfg.op_size; - } + info->inserted =3D bdrv_block_device_info(bs); =20 bs0 =3D bs; p_image_info =3D &info->inserted->image; diff --git a/blockdev.c b/blockdev.c index 921ca67..130fc14 100644 --- a/blockdev.c +++ b/blockdev.c @@ -1959,6 +1959,11 @@ void qmp_drive_backup(const char *device, const ch= ar *target, } } =20 +BlockDeviceInfoList *qmp_query_named_block_nodes(Error **errp) +{ + return bdrv_named_nodes_list(); +} + #define DEFAULT_MIRROR_BUF_SIZE (10 << 20) =20 void qmp_drive_mirror(const char *device, const char *target, diff --git a/include/block/block.h b/include/block/block.h index 501b555..13654ed 100644 --- a/include/block/block.h +++ b/include/block/block.h @@ -379,6 +379,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" =20 +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 04167da..978632a 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': 'st= r', '*backing_file': 'str', 'backing_file_depth': 'int', 'encrypted': 'bool', 'encryption_key_missing': 'bool', 'bps': 'int', 'bps_rd': 'int', 'bps_wr': 'int', @@ -2009,6 +2010,17 @@ { 'command': 'drive-backup', 'data': 'DriveBackup' } =20 ## +# @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 02cc815..11b44c5 100644 --- a/qmp-commands.hx +++ b/qmp-commands.hx @@ -3346,3 +3346,64 @@ Example (2): <- { "return": {} } =20 EQMP + + { + .name =3D "query-named-block-nodes", + .args_type =3D "", + .mhandler.cmd_new =3D qmp_marshal_input_query_named_block_nodes, + }, + +SQMP +@query-named-block-nodes +------------------------ + +Return a list of BlockDeviceInfo for all the named block driver nodes + +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 + } + } }=C2=A0] } + +EQMP --=20 1.8.3.2