Loading hmp-commands.hx +45 −0 Original line number Diff line number Diff line Loading @@ -1310,6 +1310,51 @@ Remove all matches from the access control list, and set the default policy back to @code{deny}. ETEXI { .name = "nbd_server_start", .args_type = "all:-a,writable:-w,uri:s", .params = "nbd_server_start [-a] [-w] host:port", .help = "serve block devices on the given host and port", .mhandler.cmd = hmp_nbd_server_start, }, STEXI @item nbd_server_start @var{host}:@var{port} @findex nbd_server_start Start an NBD server on the given host and/or port. If the @option{-a} option is included, all of the virtual machine's block devices that have an inserted media on them are automatically exported; in this case, the @option{-w} option makes the devices writable too. ETEXI { .name = "nbd_server_add", .args_type = "writable:-w,device:B", .params = "nbd_server_add [-w] device", .help = "export a block device via NBD", .mhandler.cmd = hmp_nbd_server_add, }, STEXI @item nbd_server_add @var{device} @findex nbd_server_add Export a block device through QEMU's NBD server, which must be started beforehand with @command{nbd_server_start}. The @option{-w} option makes the exported device writable too. ETEXI { .name = "nbd_server_stop", .args_type = "", .params = "nbd_server_stop", .help = "stop serving block devices using the NBD protocol", .mhandler.cmd = hmp_nbd_server_stop, }, STEXI @item nbd_server_stop @findex nbd_server_stop Stop the QEMU embedded NBD server. ETEXI #if defined(TARGET_I386) { Loading hmp.c +76 −0 Original line number Diff line number Diff line Loading @@ -18,6 +18,7 @@ #include "qemu-option.h" #include "qemu-timer.h" #include "qmp-commands.h" #include "qemu_socket.h" #include "monitor.h" #include "console.h" Loading Loading @@ -1259,3 +1260,78 @@ void hmp_screen_dump(Monitor *mon, const QDict *qdict) qmp_screendump(filename, &err); hmp_handle_error(mon, &err); } void hmp_nbd_server_start(Monitor *mon, const QDict *qdict) { const char *uri = qdict_get_str(qdict, "uri"); int writable = qdict_get_try_bool(qdict, "writable", 0); int all = qdict_get_try_bool(qdict, "all", 0); 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; } qmp_nbd_server_start(addr, &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, true, writable, &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"); int writable = qdict_get_try_bool(qdict, "writable", 0); Error *local_err = NULL; qmp_nbd_server_add(device, true, writable, &local_err); if (local_err != NULL) { hmp_handle_error(mon, &local_err); } } void hmp_nbd_server_stop(Monitor *mon, const QDict *qdict) { Error *errp = NULL; qmp_nbd_server_stop(&errp); hmp_handle_error(mon, &errp); } hmp.h +3 −0 Original line number Diff line number Diff line Loading @@ -77,5 +77,8 @@ void hmp_getfd(Monitor *mon, const QDict *qdict); void hmp_closefd(Monitor *mon, const QDict *qdict); void hmp_send_key(Monitor *mon, const QDict *qdict); void hmp_screen_dump(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_stop(Monitor *mon, const QDict *qdict); #endif Loading
hmp-commands.hx +45 −0 Original line number Diff line number Diff line Loading @@ -1310,6 +1310,51 @@ Remove all matches from the access control list, and set the default policy back to @code{deny}. ETEXI { .name = "nbd_server_start", .args_type = "all:-a,writable:-w,uri:s", .params = "nbd_server_start [-a] [-w] host:port", .help = "serve block devices on the given host and port", .mhandler.cmd = hmp_nbd_server_start, }, STEXI @item nbd_server_start @var{host}:@var{port} @findex nbd_server_start Start an NBD server on the given host and/or port. If the @option{-a} option is included, all of the virtual machine's block devices that have an inserted media on them are automatically exported; in this case, the @option{-w} option makes the devices writable too. ETEXI { .name = "nbd_server_add", .args_type = "writable:-w,device:B", .params = "nbd_server_add [-w] device", .help = "export a block device via NBD", .mhandler.cmd = hmp_nbd_server_add, }, STEXI @item nbd_server_add @var{device} @findex nbd_server_add Export a block device through QEMU's NBD server, which must be started beforehand with @command{nbd_server_start}. The @option{-w} option makes the exported device writable too. ETEXI { .name = "nbd_server_stop", .args_type = "", .params = "nbd_server_stop", .help = "stop serving block devices using the NBD protocol", .mhandler.cmd = hmp_nbd_server_stop, }, STEXI @item nbd_server_stop @findex nbd_server_stop Stop the QEMU embedded NBD server. ETEXI #if defined(TARGET_I386) { Loading
hmp.c +76 −0 Original line number Diff line number Diff line Loading @@ -18,6 +18,7 @@ #include "qemu-option.h" #include "qemu-timer.h" #include "qmp-commands.h" #include "qemu_socket.h" #include "monitor.h" #include "console.h" Loading Loading @@ -1259,3 +1260,78 @@ void hmp_screen_dump(Monitor *mon, const QDict *qdict) qmp_screendump(filename, &err); hmp_handle_error(mon, &err); } void hmp_nbd_server_start(Monitor *mon, const QDict *qdict) { const char *uri = qdict_get_str(qdict, "uri"); int writable = qdict_get_try_bool(qdict, "writable", 0); int all = qdict_get_try_bool(qdict, "all", 0); 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; } qmp_nbd_server_start(addr, &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, true, writable, &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"); int writable = qdict_get_try_bool(qdict, "writable", 0); Error *local_err = NULL; qmp_nbd_server_add(device, true, writable, &local_err); if (local_err != NULL) { hmp_handle_error(mon, &local_err); } } void hmp_nbd_server_stop(Monitor *mon, const QDict *qdict) { Error *errp = NULL; qmp_nbd_server_stop(&errp); hmp_handle_error(mon, &errp); }
hmp.h +3 −0 Original line number Diff line number Diff line Loading @@ -77,5 +77,8 @@ void hmp_getfd(Monitor *mon, const QDict *qdict); void hmp_closefd(Monitor *mon, const QDict *qdict); void hmp_send_key(Monitor *mon, const QDict *qdict); void hmp_screen_dump(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_stop(Monitor *mon, const QDict *qdict); #endif