diff mbox

[1/1] HMP: Add equivalent to x-blockdev-change

Message ID 1450349251-10326-1-git-send-email-dgilbert@redhat.com
State New
Headers show

Commit Message

Dr. David Alan Gilbert Dec. 17, 2015, 10:47 a.m. UTC
From: "Dr. David Alan Gilbert" <dgilbert@redhat.com>

x-blockdev-change has no HMP equivalent, so add x_block_change.

Example useages are:
x_block_change  foo -a bah
   to add the node bah to the parent foo

x_block_change  foo -d bah
   to delete the node bah from the parent foo

Signed-off-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
---
 hmp-commands.hx | 18 ++++++++++++++++++
 hmp.c           | 20 ++++++++++++++++++++
 hmp.h           |  1 +
 3 files changed, 39 insertions(+)

Comments

Eric Blake Dec. 17, 2015, 4:43 p.m. UTC | #1
On 12/17/2015 03:47 AM, Dr. David Alan Gilbert (git) wrote:
> From: "Dr. David Alan Gilbert" <dgilbert@redhat.com>
> 
> x-blockdev-change has no HMP equivalent, so add x_block_change.
> 
> Example useages are:

s/useages/usages/

> x_block_change  foo -a bah
>    to add the node bah to the parent foo
> 
> x_block_change  foo -d bah
>    to delete the node bah from the parent foo
> 
> Signed-off-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
> ---

> +void hmp_block_change(Monitor *mon, const QDict *qdict)
> +{
> +    const char *parent = qdict_get_str(qdict, "parent");
> +    const char *child = qdict_get_str(qdict, "child");
> +    bool add = qdict_get_try_bool(qdict, "add", false);
> +    bool del = qdict_get_try_bool(qdict, "del", false);
> +    Error *err = NULL;
> +
> +    if (add == del) {
> +        error_setg(&err, "One of -a or -d must be set");

Maybe s/One/Exactly one/ ?

Limited in that we may eventually want to allow both add and delete at
the same time; but HMP does not have hard-and-fast back-compat rules.
So I'm fine with fixing the minor issues mentioned above, and adding:

Reviewed-by: Eric Blake <eblake@redhat.com>
Dr. David Alan Gilbert Dec. 17, 2015, 4:48 p.m. UTC | #2
* Eric Blake (eblake@redhat.com) wrote:
> On 12/17/2015 03:47 AM, Dr. David Alan Gilbert (git) wrote:
> > From: "Dr. David Alan Gilbert" <dgilbert@redhat.com>
> > 
> > x-blockdev-change has no HMP equivalent, so add x_block_change.
> > 
> > Example useages are:
> 
> s/useages/usages/

Yep.

> > x_block_change  foo -a bah
> >    to add the node bah to the parent foo
> > 
> > x_block_change  foo -d bah
> >    to delete the node bah from the parent foo
> > 
> > Signed-off-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
> > ---
> 
> > +void hmp_block_change(Monitor *mon, const QDict *qdict)
> > +{
> > +    const char *parent = qdict_get_str(qdict, "parent");
> > +    const char *child = qdict_get_str(qdict, "child");
> > +    bool add = qdict_get_try_bool(qdict, "add", false);
> > +    bool del = qdict_get_try_bool(qdict, "del", false);
> > +    Error *err = NULL;
> > +
> > +    if (add == del) {
> > +        error_setg(&err, "One of -a or -d must be set");
> 
> Maybe s/One/Exactly one/ ?

Yep, can do.

> Limited in that we may eventually want to allow both add and delete at
> the same time; but HMP does not have hard-and-fast back-compat rules.

Oh I was assuming if we wanted to make a 'change' we'd add a -c.

> So I'm fine with fixing the minor issues mentioned above, and adding:
> 
> Reviewed-by: Eric Blake <eblake@redhat.com>

Thanks.

Dave

> 
> -- 
> Eric Blake   eblake redhat com    +1-919-301-3266
> Libvirt virtualization library http://libvirt.org
> 


--
Dr. David Alan Gilbert / dgilbert@redhat.com / Manchester, UK
Markus Armbruster Jan. 18, 2016, 1:06 p.m. UTC | #3
"Dr. David Alan Gilbert (git)" <dgilbert@redhat.com> writes:

> From: "Dr. David Alan Gilbert" <dgilbert@redhat.com>
>
> x-blockdev-change has no HMP equivalent, so add x_block_change.

Uh, I can find neither QMP command x-blockdev-change nor
qmp_x_blockdev_change() in master.

> Example useages are:
> x_block_change  foo -a bah
>    to add the node bah to the parent foo
>
> x_block_change  foo -d bah
>    to delete the node bah from the parent foo
[...]
> diff --git a/hmp.c b/hmp.c
> index dc6dc30..631dacb 100644
> --- a/hmp.c
> +++ b/hmp.c
> @@ -1042,6 +1042,26 @@ void hmp_balloon(Monitor *mon, const QDict *qdict)
>      }
>  }
>  
> +void hmp_block_change(Monitor *mon, const QDict *qdict)
> +{
> +    const char *parent = qdict_get_str(qdict, "parent");
> +    const char *child = qdict_get_str(qdict, "child");
> +    bool add = qdict_get_try_bool(qdict, "add", false);
> +    bool del = qdict_get_try_bool(qdict, "del", false);
> +    Error *err = NULL;
> +
> +    if (add == del) {
> +        error_setg(&err, "One of -a or -d must be set");
> +        hmp_handle_error(mon, &err);
> +        return;
> +    }
> +
> +    qmp_x_blockdev_change(parent,
> +                          del, child,
> +                          add, child, &err);
> +    hmp_handle_error(mon, &err);
> +}
> +
>  void hmp_block_resize(Monitor *mon, const QDict *qdict)
>  {
>      const char *device = qdict_get_str(qdict, "device");
[...]
Dr. David Alan Gilbert Jan. 18, 2016, 1:11 p.m. UTC | #4
* Markus Armbruster (armbru@redhat.com) wrote:
> "Dr. David Alan Gilbert (git)" <dgilbert@redhat.com> writes:
> 
> > From: "Dr. David Alan Gilbert" <dgilbert@redhat.com>
> >
> > x-blockdev-change has no HMP equivalent, so add x_block_change.
> 
> Uh, I can find neither QMP command x-blockdev-change nor
> qmp_x_blockdev_change() in master.

It's not in master yet; it's in Wen Congyang's 'child add/delete support'
series; which I've got running with COLO.

Dave

> 
> > Example useages are:
> > x_block_change  foo -a bah
> >    to add the node bah to the parent foo
> >
> > x_block_change  foo -d bah
> >    to delete the node bah from the parent foo
> [...]
> > diff --git a/hmp.c b/hmp.c
> > index dc6dc30..631dacb 100644
> > --- a/hmp.c
> > +++ b/hmp.c
> > @@ -1042,6 +1042,26 @@ void hmp_balloon(Monitor *mon, const QDict *qdict)
> >      }
> >  }
> >  
> > +void hmp_block_change(Monitor *mon, const QDict *qdict)
> > +{
> > +    const char *parent = qdict_get_str(qdict, "parent");
> > +    const char *child = qdict_get_str(qdict, "child");
> > +    bool add = qdict_get_try_bool(qdict, "add", false);
> > +    bool del = qdict_get_try_bool(qdict, "del", false);
> > +    Error *err = NULL;
> > +
> > +    if (add == del) {
> > +        error_setg(&err, "One of -a or -d must be set");
> > +        hmp_handle_error(mon, &err);
> > +        return;
> > +    }
> > +
> > +    qmp_x_blockdev_change(parent,
> > +                          del, child,
> > +                          add, child, &err);
> > +    hmp_handle_error(mon, &err);
> > +}
> > +
> >  void hmp_block_resize(Monitor *mon, const QDict *qdict)
> >  {
> >      const char *device = qdict_get_str(qdict, "device");
> [...]
--
Dr. David Alan Gilbert / dgilbert@redhat.com / Manchester, UK
diff mbox

Patch

diff --git a/hmp-commands.hx b/hmp-commands.hx
index a381b0b..cf2459b 100644
--- a/hmp-commands.hx
+++ b/hmp-commands.hx
@@ -57,6 +57,24 @@  Quit the emulator.
 ETEXI
 
     {
+        .name       = "x_block_change",
+        .args_type  = "parent:B,add:-a,del:-d,child:B",
+        .params     = "parent [-a] [-d] child",
+        .help       = "add or remove a child from a block driver",
+        .mhandler.cmd = hmp_block_change,
+    },
+
+STEXI
+@item x_block_change
+@findex x_block_change
+Dynamically reconfigure the block driver state graph. It can be used
+to add, remove, insert or replace a block driver state. Currently only
+the Quorum driver implements this feature to add or remove its child.
+This is useful to fix a broken quorum child.
+ETEXI
+
+
+    {
         .name       = "block_resize",
         .args_type  = "device:B,size:o",
         .params     = "device size",
diff --git a/hmp.c b/hmp.c
index dc6dc30..631dacb 100644
--- a/hmp.c
+++ b/hmp.c
@@ -1042,6 +1042,26 @@  void hmp_balloon(Monitor *mon, const QDict *qdict)
     }
 }
 
+void hmp_block_change(Monitor *mon, const QDict *qdict)
+{
+    const char *parent = qdict_get_str(qdict, "parent");
+    const char *child = qdict_get_str(qdict, "child");
+    bool add = qdict_get_try_bool(qdict, "add", false);
+    bool del = qdict_get_try_bool(qdict, "del", false);
+    Error *err = NULL;
+
+    if (add == del) {
+        error_setg(&err, "One of -a or -d must be set");
+        hmp_handle_error(mon, &err);
+        return;
+    }
+
+    qmp_x_blockdev_change(parent,
+                          del, child,
+                          add, child, &err);
+    hmp_handle_error(mon, &err);
+}
+
 void hmp_block_resize(Monitor *mon, const QDict *qdict)
 {
     const char *device = qdict_get_str(qdict, "device");
diff --git a/hmp.h b/hmp.h
index 864a300..1588850 100644
--- a/hmp.h
+++ b/hmp.h
@@ -53,6 +53,7 @@  void hmp_cont(Monitor *mon, const QDict *qdict);
 void hmp_system_wakeup(Monitor *mon, const QDict *qdict);
 void hmp_nmi(Monitor *mon, const QDict *qdict);
 void hmp_set_link(Monitor *mon, const QDict *qdict);
+void hmp_block_change(Monitor *mon, const QDict *qdict);
 void hmp_block_passwd(Monitor *mon, const QDict *qdict);
 void hmp_balloon(Monitor *mon, const QDict *qdict);
 void hmp_block_resize(Monitor *mon, const QDict *qdict);