diff mbox

[V4,3/7] qmp: Add a command to list the named BlockDriverState nodes.

Message ID 1386263703-19292-4-git-send-email-benoit@irqsave.net
State New
Headers show

Commit Message

Benoît Canet Dec. 5, 2013, 5:14 p.m. UTC
Signed-off-by: Benoit Canet <benoit@irqsave.net>
---
 block.c               | 16 ++++++++++++++++
 blockdev.c            |  5 +++++
 include/block/block.h |  1 +
 qapi-schema.json      | 11 +++++++++++
 qmp-commands.hx       | 19 +++++++++++++++++++
 5 files changed, 52 insertions(+)

Comments

Eric Blake Dec. 6, 2013, 3:59 p.m. UTC | #1
On 12/05/2013 10:14 AM, Benoît Canet wrote:
> Signed-off-by: Benoit Canet <benoit@irqsave.net>
> ---
>  block.c               | 16 ++++++++++++++++
>  blockdev.c            |  5 +++++
>  include/block/block.h |  1 +
>  qapi-schema.json      | 11 +++++++++++
>  qmp-commands.hx       | 19 +++++++++++++++++++
>  5 files changed, 52 insertions(+)

>  ##
> +# @query-named-block-nodes
> +#
> +# Get the named block driver list
> +#
> +# Returns: the list of named nodes names

Sounds funny.  Maybe better with just:

Returns: the list of names

> +#
> +# Since 2.0
> +##
> +{ 'command': 'query-named-block-nodes', 'returns': [ 'str' ] }

Also, is list of names sufficient, or are we better off returning a list
of structs with the details already included?  With list of names, the
management app has to follow up with another QMP command per name if it
wants to know details about each node, instead of getting it all in one
command.

> +SQMP
> +@query-named-block-nodes
> +------------------------
> +
> +Return a list of string containing the name of the named block driver states

Return a list of strings containing the name of each named block driver node
Benoît Canet Dec. 9, 2013, 3:46 p.m. UTC | #2
Le Friday 06 Dec 2013 à 08:59:38 (-0700), Eric Blake a écrit :
> On 12/05/2013 10:14 AM, Benoît Canet wrote:
> > Signed-off-by: Benoit Canet <benoit@irqsave.net>
> > ---
> >  block.c               | 16 ++++++++++++++++
> >  blockdev.c            |  5 +++++
> >  include/block/block.h |  1 +
> >  qapi-schema.json      | 11 +++++++++++
> >  qmp-commands.hx       | 19 +++++++++++++++++++
> >  5 files changed, 52 insertions(+)
> 
> >  ##
> > +# @query-named-block-nodes
> > +#
> > +# Get the named block driver list
> > +#
> > +# Returns: the list of named nodes names
> 
> Sounds funny.  Maybe better with just:
> 
> Returns: the list of names
> 
> > +#
> > +# Since 2.0
> > +##
> > +{ 'command': 'query-named-block-nodes', 'returns': [ 'str' ] }
> 
> Also, is list of names sufficient, or are we better off returning a list
> of structs with the details already included?  With list of names, the
> management app has to follow up with another QMP command per name if it
> wants to know details about each node, instead of getting it all in one
> command.

Would a list of BlockDeviceInfo be fine ?

Best regards

Benoît

> 
> > +SQMP
> > +@query-named-block-nodes
> > +------------------------
> > +
> > +Return a list of string containing the name of the named block driver states
> 
> Return a list of strings containing the name of each named block driver node
> 
> -- 
> Eric Blake   eblake redhat com    +1-919-301-3266
> Libvirt virtualization library http://libvirt.org
>
Eric Blake Dec. 10, 2013, 3:22 p.m. UTC | #3
On 12/09/2013 08:46 AM, Benoît Canet wrote:
>>> +{ 'command': 'query-named-block-nodes', 'returns': [ 'str' ] }
>>
>> Also, is list of names sufficient, or are we better off returning a list
>> of structs with the details already included?  With list of names, the
>> management app has to follow up with another QMP command per name if it
>> wants to know details about each node, instead of getting it all in one
>> command.
> 
> Would a list of BlockDeviceInfo be fine ?

Yes, I think that would be just fine.
diff mbox

Patch

diff --git a/block.c b/block.c
index 61f5ba0..372aa3b 100644
--- a/block.c
+++ b/block.c
@@ -3178,6 +3178,22 @@  BlockDriverState *bdrv_find_node(const char *node_name)
     return NULL;
 }
 
+strList *bdrv_named_nodes_list(void)
+{
+    strList *str_list, *entry;
+    BlockDriverState *bs;
+
+    str_list = NULL;
+    QTAILQ_FOREACH(bs, &graph_bdrv_states, node_list) {
+        entry = g_malloc0(sizeof(*entry));
+        entry->value = g_strdup(bs->node_name);
+        entry->next = str_list;
+        str_list = entry;
+    }
+
+    return str_list;
+}
+
 BlockDriverState *bdrv_next(BlockDriverState *bs)
 {
     if (!bs) {
diff --git a/blockdev.c b/blockdev.c
index a474bb5..1eb4639 100644
--- a/blockdev.c
+++ b/blockdev.c
@@ -1940,6 +1940,11 @@  void qmp_drive_backup(const char *device, const char *target,
     }
 }
 
+strList *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 6426ca6..fe642d9 100644
--- a/include/block/block.h
+++ b/include/block/block.h
@@ -371,6 +371,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);
+strList *bdrv_named_nodes_list(void);
 BlockDriverState *bdrv_next(BlockDriverState *bs);
 void bdrv_iterate(void (*it)(void *opaque, BlockDriverState *bs),
                   void *opaque);
diff --git a/qapi-schema.json b/qapi-schema.json
index 8630eb5..3a4a4c8 100644
--- a/qapi-schema.json
+++ b/qapi-schema.json
@@ -2008,6 +2008,17 @@ 
 { 'command': 'drive-backup', 'data': 'DriveBackup' }
 
 ##
+# @query-named-block-nodes
+#
+# Get the named block driver list
+#
+# Returns: the list of named nodes names
+#
+# Since 2.0
+##
+{ 'command': 'query-named-block-nodes', 'returns': [ 'str' ] }
+
+##
 # @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..107795b 100644
--- a/qmp-commands.hx
+++ b/qmp-commands.hx
@@ -3295,3 +3295,22 @@  Example (2):
 <- { "return": {} }
 
 EQMP
+
+    {
+        .name       = "query-named-block-nodes",
+        .args_type  = "",
+        .mhandler.cmd_new = qmp_marshal_input_query_named_block_nodes,
+    },
+
+SQMP
+@query-named-block-nodes
+------------------------
+
+Return a list of string containing the name of the named block driver states
+
+Example:
+
+-> { "execute": "query-named-block-nodes" }
+<- { "return": [ "quorum1.qcow2", "quorum2.qcow2", "quorum3.qcow2" ] }
+
+EQMP