qemu-storage-daemon: Add --export option

Add a --export option to qemu-storage-daemon to export a block node. For
now, only NBD exports are implemented. Apart from the 'type' option
(which is the implied key), it maps the arguments for nbd-server-add to
the command line. Example:

    --export nbd,device=disk,name=test-export,writable=on

Signed-off-by: Kevin Wolf <kwolf@redhat.com>
Message-Id: <20200224143008.13362-12-kwolf@redhat.com>
Acked-by: Stefan Hajnoczi <stefanha@redhat.com>
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
This commit is contained in:
Kevin Wolf 2020-02-24 15:29:59 +01:00
parent c62d24e906
commit 39411120b7
2 changed files with 58 additions and 0 deletions

View File

@ -5201,6 +5201,33 @@
##
{ 'command': 'nbd-server-stop' }
##
# @BlockExportType:
#
# An enumeration of block export types
#
# @nbd: NBD export
#
# Since: 4.2
##
{ 'enum': 'BlockExportType',
'data': [ 'nbd' ] }
##
# @BlockExport:
#
# Describes a block export, i.e. how single node should be exported on an
# external interface.
#
# Since: 4.2
##
{ 'union': 'BlockExport',
'base': { 'type': 'BlockExportType' },
'discriminator': 'type',
'data': {
'nbd': 'BlockExportNbd'
} }
##
# @QuorumOpType:
#

View File

@ -70,6 +70,11 @@ static void help(void)
" [,driver specific parameters...]\n"
" configure a block backend\n"
"\n"
" --export [type=]nbd,device=<node-name>[,name=<export-name>]\n"
" [,writable=on|off][,bitmap=<name>]\n"
" export the specified block node over NBD\n"
" (requires --nbd-server)\n"
"\n"
" --nbd-server addr.type=inet,addr.host=<host>,addr.port=<port>\n"
" [,tls-creds=<id>][,tls-authz=<id>]\n"
" --nbd-server addr.type=unix,addr.path=<path>\n"
@ -91,6 +96,7 @@ QEMU_HELP_BOTTOM "\n",
enum {
OPTION_BLOCKDEV = 256,
OPTION_EXPORT,
OPTION_NBD_SERVER,
OPTION_OBJECT,
};
@ -104,12 +110,24 @@ static QemuOptsList qemu_object_opts = {
},
};
static void init_export(BlockExport *export, Error **errp)
{
switch (export->type) {
case BLOCK_EXPORT_TYPE_NBD:
qmp_nbd_server_add(&export->u.nbd, errp);
break;
default:
g_assert_not_reached();
}
}
static void process_options(int argc, char *argv[])
{
int c;
static const struct option long_options[] = {
{"blockdev", required_argument, NULL, OPTION_BLOCKDEV},
{"export", required_argument, NULL, OPTION_EXPORT},
{"help", no_argument, NULL, 'h'},
{"nbd-server", required_argument, NULL, OPTION_NBD_SERVER},
{"object", required_argument, NULL, OPTION_OBJECT},
@ -156,6 +174,19 @@ static void process_options(int argc, char *argv[])
qapi_free_BlockdevOptions(options);
break;
}
case OPTION_EXPORT:
{
Visitor *v;
BlockExport *export;
v = qobject_input_visitor_new_str(optarg, "type", &error_fatal);
visit_type_BlockExport(v, NULL, &export, &error_fatal);
visit_free(v);
init_export(export, &error_fatal);
qapi_free_BlockExport(export);
break;
}
case OPTION_NBD_SERVER:
{
Visitor *v;