Message ID | 1450349251-10326-1-git-send-email-dgilbert@redhat.com |
---|---|
State | New |
Headers | show |
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>
* 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
"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"); [...]
* 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 --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);