Re: [PATCH v3 08/13] monitor/hmp: move hmp_nbd_server* to block-hmp-cmds.c
On 1/28/20 12:56 PM, Dr. David Alan Gilbert wrote: * Maxim Levitsky (mlevi...@redhat.com) wrote: Signed-off-by: Maxim Levitsky Yes, I think that's OK; I can imagine nbd might want to move on it's own somewhere since it's not really core block code; copying in Eric. I think that nbd-server-start and friends ARE related to core block code; they do not work without a BDS node. It's not the same as a block driver, though, in that it is exposing the BDS to the outside world, rather than connecting an outside resource for use internally by the guest. At any rate, block-hmp-cmds.c seems reasonable enough as a new location for these HMP commands. Reviewed-by: Dr. David Alan Gilbert --- block/monitor/block-hmp-cmds.c | 88 ++ include/block/block-hmp-commands.h | 5 ++ include/monitor/hmp.h | 4 -- monitor/hmp-cmds.c | 87 - 4 files changed, 93 insertions(+), 91 deletions(-) Reviewed-by: Eric Blake -- Eric Blake, Principal Software Engineer Red Hat, Inc. +1-919-301-3226 Virtualization: qemu.org | libvirt.org
Re: [PATCH v3 08/13] monitor/hmp: move hmp_nbd_server* to block-hmp-cmds.c
* Maxim Levitsky (mlevi...@redhat.com) wrote: > Signed-off-by: Maxim Levitsky Yes, I think that's OK; I can imagine nbd might want to move on it's own somewhere since it's not really core block code; copying in Eric. Reviewed-by: Dr. David Alan Gilbert > --- > block/monitor/block-hmp-cmds.c | 88 ++ > include/block/block-hmp-commands.h | 5 ++ > include/monitor/hmp.h | 4 -- > monitor/hmp-cmds.c | 87 - > 4 files changed, 93 insertions(+), 91 deletions(-) > > diff --git a/block/monitor/block-hmp-cmds.c b/block/monitor/block-hmp-cmds.c > index 9aa94ea6e0..df0178d0f9 100644 > --- a/block/monitor/block-hmp-cmds.c > +++ b/block/monitor/block-hmp-cmds.c > @@ -22,8 +22,10 @@ > #include "qapi/qmp/qerror.h" > #include "qemu/config-file.h" > #include "qemu/option.h" > +#include "qemu/sockets.h" > #include "sysemu/sysemu.h" > #include "monitor/monitor.h" > +#include "block/nbd.h" > #include "block/block_int.h" > #include "block/block-hmp-commands.h" > #include "monitor/hmp.h" > @@ -327,3 +329,89 @@ void hmp_snapshot_delete_blkdev_internal(Monitor *mon, > const QDict *qdict) > true, name, &err); > hmp_handle_error(mon, err); > } > + > +void hmp_nbd_server_start(Monitor *mon, const QDict *qdict) > +{ > +const char *uri = qdict_get_str(qdict, "uri"); > +bool writable = qdict_get_try_bool(qdict, "writable", false); > +bool all = qdict_get_try_bool(qdict, "all", false); > +Error *local_err = NULL; > +BlockInfoList *block_list, *info; > +SocketAddress *addr; > + > +if (writable && !all) { > +error_setg(&local_err, "-w only valid together with -a"); > +goto exit; > +} > + > +/* First check if the address is valid and start the server. */ > +addr = socket_parse(uri, &local_err); > +if (local_err != NULL) { > +goto exit; > +} > + > +nbd_server_start(addr, NULL, NULL, &local_err); > +qapi_free_SocketAddress(addr); > +if (local_err != NULL) { > +goto exit; > +} > + > +if (!all) { > +return; > +} > + > +/* Then try adding all block devices. If one fails, close all and > + * exit. > + */ > +block_list = qmp_query_block(NULL); > + > +for (info = block_list; info; info = info->next) { > +if (!info->value->has_inserted) { > +continue; > +} > + > +qmp_nbd_server_add(info->value->device, false, NULL, > + true, writable, false, NULL, &local_err); > + > +if (local_err != NULL) { > +qmp_nbd_server_stop(NULL); > +break; > +} > +} > + > +qapi_free_BlockInfoList(block_list); > + > +exit: > +hmp_handle_error(mon, local_err); > +} > + > +void hmp_nbd_server_add(Monitor *mon, const QDict *qdict) > +{ > +const char *device = qdict_get_str(qdict, "device"); > +const char *name = qdict_get_try_str(qdict, "name"); > +bool writable = qdict_get_try_bool(qdict, "writable", false); > +Error *local_err = NULL; > + > +qmp_nbd_server_add(device, !!name, name, true, writable, > + false, NULL, &local_err); > +hmp_handle_error(mon, local_err); > +} > + > +void hmp_nbd_server_remove(Monitor *mon, const QDict *qdict) > +{ > +const char *name = qdict_get_str(qdict, "name"); > +bool force = qdict_get_try_bool(qdict, "force", false); > +Error *err = NULL; > + > +/* Rely on NBD_SERVER_REMOVE_MODE_SAFE being the default */ > +qmp_nbd_server_remove(name, force, NBD_SERVER_REMOVE_MODE_HARD, &err); > +hmp_handle_error(mon, err); > +} > + > +void hmp_nbd_server_stop(Monitor *mon, const QDict *qdict) > +{ > +Error *err = NULL; > + > +qmp_nbd_server_stop(&err); > +hmp_handle_error(mon, err); > +} > diff --git a/include/block/block-hmp-commands.h > b/include/block/block-hmp-commands.h > index 3fc2daf3a9..721b9a1978 100644 > --- a/include/block/block-hmp-commands.h > +++ b/include/block/block-hmp-commands.h > @@ -21,4 +21,9 @@ void hmp_snapshot_blkdev(Monitor *mon, const QDict *qdict); > void hmp_snapshot_blkdev_internal(Monitor *mon, const QDict *qdict); > void hmp_snapshot_delete_blkdev_internal(Monitor *mon, const QDict *qdict); > > +void hmp_nbd_server_start(Monitor *mon, const QDict *qdict); > +void hmp_nbd_server_add(Monitor *mon, const QDict *qdict); > +void hmp_nbd_server_remove(Monitor *mon, const QDict *qdict); > +void hmp_nbd_server_stop(Monitor *mon, const QDict *qdict); > + > #endif > diff --git a/include/monitor/hmp.h b/include/monitor/hmp.h > index 6d34e29bb6..736a969131 100644 > --- a/include/monitor/hmp.h > +++ b/include/monitor/hmp.h > @@ -94,10 +94,6 @@ void hmp_getfd(Monitor *mon, const QDict *qdict); > void hmp_closefd(Monitor *mon, const QDict *qdict); > void hmp_sendkey(Monitor *mon, const QDict *qdict); > void hmp_screendump(Monitor *mon, const QDict *qdic
[PATCH v3 08/13] monitor/hmp: move hmp_nbd_server* to block-hmp-cmds.c
Signed-off-by: Maxim Levitsky --- block/monitor/block-hmp-cmds.c | 88 ++ include/block/block-hmp-commands.h | 5 ++ include/monitor/hmp.h | 4 -- monitor/hmp-cmds.c | 87 - 4 files changed, 93 insertions(+), 91 deletions(-) diff --git a/block/monitor/block-hmp-cmds.c b/block/monitor/block-hmp-cmds.c index 9aa94ea6e0..df0178d0f9 100644 --- a/block/monitor/block-hmp-cmds.c +++ b/block/monitor/block-hmp-cmds.c @@ -22,8 +22,10 @@ #include "qapi/qmp/qerror.h" #include "qemu/config-file.h" #include "qemu/option.h" +#include "qemu/sockets.h" #include "sysemu/sysemu.h" #include "monitor/monitor.h" +#include "block/nbd.h" #include "block/block_int.h" #include "block/block-hmp-commands.h" #include "monitor/hmp.h" @@ -327,3 +329,89 @@ void hmp_snapshot_delete_blkdev_internal(Monitor *mon, const QDict *qdict) true, name, &err); hmp_handle_error(mon, err); } + +void hmp_nbd_server_start(Monitor *mon, const QDict *qdict) +{ +const char *uri = qdict_get_str(qdict, "uri"); +bool writable = qdict_get_try_bool(qdict, "writable", false); +bool all = qdict_get_try_bool(qdict, "all", false); +Error *local_err = NULL; +BlockInfoList *block_list, *info; +SocketAddress *addr; + +if (writable && !all) { +error_setg(&local_err, "-w only valid together with -a"); +goto exit; +} + +/* First check if the address is valid and start the server. */ +addr = socket_parse(uri, &local_err); +if (local_err != NULL) { +goto exit; +} + +nbd_server_start(addr, NULL, NULL, &local_err); +qapi_free_SocketAddress(addr); +if (local_err != NULL) { +goto exit; +} + +if (!all) { +return; +} + +/* Then try adding all block devices. If one fails, close all and + * exit. + */ +block_list = qmp_query_block(NULL); + +for (info = block_list; info; info = info->next) { +if (!info->value->has_inserted) { +continue; +} + +qmp_nbd_server_add(info->value->device, false, NULL, + true, writable, false, NULL, &local_err); + +if (local_err != NULL) { +qmp_nbd_server_stop(NULL); +break; +} +} + +qapi_free_BlockInfoList(block_list); + +exit: +hmp_handle_error(mon, local_err); +} + +void hmp_nbd_server_add(Monitor *mon, const QDict *qdict) +{ +const char *device = qdict_get_str(qdict, "device"); +const char *name = qdict_get_try_str(qdict, "name"); +bool writable = qdict_get_try_bool(qdict, "writable", false); +Error *local_err = NULL; + +qmp_nbd_server_add(device, !!name, name, true, writable, + false, NULL, &local_err); +hmp_handle_error(mon, local_err); +} + +void hmp_nbd_server_remove(Monitor *mon, const QDict *qdict) +{ +const char *name = qdict_get_str(qdict, "name"); +bool force = qdict_get_try_bool(qdict, "force", false); +Error *err = NULL; + +/* Rely on NBD_SERVER_REMOVE_MODE_SAFE being the default */ +qmp_nbd_server_remove(name, force, NBD_SERVER_REMOVE_MODE_HARD, &err); +hmp_handle_error(mon, err); +} + +void hmp_nbd_server_stop(Monitor *mon, const QDict *qdict) +{ +Error *err = NULL; + +qmp_nbd_server_stop(&err); +hmp_handle_error(mon, err); +} diff --git a/include/block/block-hmp-commands.h b/include/block/block-hmp-commands.h index 3fc2daf3a9..721b9a1978 100644 --- a/include/block/block-hmp-commands.h +++ b/include/block/block-hmp-commands.h @@ -21,4 +21,9 @@ void hmp_snapshot_blkdev(Monitor *mon, const QDict *qdict); void hmp_snapshot_blkdev_internal(Monitor *mon, const QDict *qdict); void hmp_snapshot_delete_blkdev_internal(Monitor *mon, const QDict *qdict); +void hmp_nbd_server_start(Monitor *mon, const QDict *qdict); +void hmp_nbd_server_add(Monitor *mon, const QDict *qdict); +void hmp_nbd_server_remove(Monitor *mon, const QDict *qdict); +void hmp_nbd_server_stop(Monitor *mon, const QDict *qdict); + #endif diff --git a/include/monitor/hmp.h b/include/monitor/hmp.h index 6d34e29bb6..736a969131 100644 --- a/include/monitor/hmp.h +++ b/include/monitor/hmp.h @@ -94,10 +94,6 @@ void hmp_getfd(Monitor *mon, const QDict *qdict); void hmp_closefd(Monitor *mon, const QDict *qdict); void hmp_sendkey(Monitor *mon, const QDict *qdict); void hmp_screendump(Monitor *mon, const QDict *qdict); -void hmp_nbd_server_start(Monitor *mon, const QDict *qdict); -void hmp_nbd_server_add(Monitor *mon, const QDict *qdict); -void hmp_nbd_server_remove(Monitor *mon, const QDict *qdict); -void hmp_nbd_server_stop(Monitor *mon, const QDict *qdict); void hmp_chardev_add(Monitor *mon, const QDict *qdict); void hmp_chardev_change(Monitor *mon, const QDict *qdict); void hmp_chardev_remove(Monitor *mon, const QDict *qdict); diff --git a/monitor/hmp-cmds.c b/monitor/hmp-cmds.c index 46b46b6dd7..67