mirror of https://github.com/xemu-project/xemu.git
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:
parent
c62d24e906
commit
39411120b7
|
@ -5201,6 +5201,33 @@
|
||||||
##
|
##
|
||||||
{ 'command': 'nbd-server-stop' }
|
{ '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:
|
# @QuorumOpType:
|
||||||
#
|
#
|
||||||
|
|
|
@ -70,6 +70,11 @@ static void help(void)
|
||||||
" [,driver specific parameters...]\n"
|
" [,driver specific parameters...]\n"
|
||||||
" configure a block backend\n"
|
" configure a block backend\n"
|
||||||
"\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"
|
" --nbd-server addr.type=inet,addr.host=<host>,addr.port=<port>\n"
|
||||||
" [,tls-creds=<id>][,tls-authz=<id>]\n"
|
" [,tls-creds=<id>][,tls-authz=<id>]\n"
|
||||||
" --nbd-server addr.type=unix,addr.path=<path>\n"
|
" --nbd-server addr.type=unix,addr.path=<path>\n"
|
||||||
|
@ -91,6 +96,7 @@ QEMU_HELP_BOTTOM "\n",
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
OPTION_BLOCKDEV = 256,
|
OPTION_BLOCKDEV = 256,
|
||||||
|
OPTION_EXPORT,
|
||||||
OPTION_NBD_SERVER,
|
OPTION_NBD_SERVER,
|
||||||
OPTION_OBJECT,
|
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[])
|
static void process_options(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
int c;
|
int c;
|
||||||
|
|
||||||
static const struct option long_options[] = {
|
static const struct option long_options[] = {
|
||||||
{"blockdev", required_argument, NULL, OPTION_BLOCKDEV},
|
{"blockdev", required_argument, NULL, OPTION_BLOCKDEV},
|
||||||
|
{"export", required_argument, NULL, OPTION_EXPORT},
|
||||||
{"help", no_argument, NULL, 'h'},
|
{"help", no_argument, NULL, 'h'},
|
||||||
{"nbd-server", required_argument, NULL, OPTION_NBD_SERVER},
|
{"nbd-server", required_argument, NULL, OPTION_NBD_SERVER},
|
||||||
{"object", required_argument, NULL, OPTION_OBJECT},
|
{"object", required_argument, NULL, OPTION_OBJECT},
|
||||||
|
@ -156,6 +174,19 @@ static void process_options(int argc, char *argv[])
|
||||||
qapi_free_BlockdevOptions(options);
|
qapi_free_BlockdevOptions(options);
|
||||||
break;
|
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:
|
case OPTION_NBD_SERVER:
|
||||||
{
|
{
|
||||||
Visitor *v;
|
Visitor *v;
|
||||||
|
|
Loading…
Reference in New Issue