block/export: Move writable to BlockExportOptions
The 'writable' option is a basic option that will probably be applicable to most if not all export types that we will implement. Move it from NBD to the generic BlockExport layer. Signed-off-by: Kevin Wolf <kwolf@redhat.com> Reviewed-by: Max Reitz <mreitz@redhat.com> Message-Id: <20200924152717.287415-26-kwolf@redhat.com> Acked-by: Stefan Hajnoczi <stefanha@redhat.com> Signed-off-by: Kevin Wolf <kwolf@redhat.com>
This commit is contained in:
parent
8cade320c8
commit
30dbc81d31
@ -62,6 +62,7 @@ BlockExport *blk_exp_add(BlockExportOptions *export, Error **errp)
|
|||||||
BlockDriverState *bs;
|
BlockDriverState *bs;
|
||||||
BlockBackend *blk;
|
BlockBackend *blk;
|
||||||
AioContext *ctx;
|
AioContext *ctx;
|
||||||
|
uint64_t perm;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
if (!id_wellformed(export->id)) {
|
if (!id_wellformed(export->id)) {
|
||||||
@ -84,6 +85,14 @@ BlockExport *blk_exp_add(BlockExportOptions *export, Error **errp)
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!export->has_writable) {
|
||||||
|
export->writable = false;
|
||||||
|
}
|
||||||
|
if (bdrv_is_read_only(bs) && export->writable) {
|
||||||
|
error_setg(errp, "Cannot export read-only node as writable");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
ctx = bdrv_get_aio_context(bs);
|
ctx = bdrv_get_aio_context(bs);
|
||||||
aio_context_acquire(ctx);
|
aio_context_acquire(ctx);
|
||||||
|
|
||||||
@ -95,7 +104,12 @@ BlockExport *blk_exp_add(BlockExportOptions *export, Error **errp)
|
|||||||
*/
|
*/
|
||||||
bdrv_invalidate_cache(bs, NULL);
|
bdrv_invalidate_cache(bs, NULL);
|
||||||
|
|
||||||
blk = blk_new(ctx, BLK_PERM_CONSISTENT_READ, BLK_PERM_ALL);
|
perm = BLK_PERM_CONSISTENT_READ;
|
||||||
|
if (export->writable) {
|
||||||
|
perm |= BLK_PERM_WRITE;
|
||||||
|
}
|
||||||
|
|
||||||
|
blk = blk_new(ctx, perm, BLK_PERM_ALL);
|
||||||
ret = blk_insert_bs(blk, bs, errp);
|
ret = blk_insert_bs(blk, bs, errp);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
goto fail;
|
goto fail;
|
||||||
|
@ -204,16 +204,8 @@ int nbd_export_create(BlockExport *exp, BlockExportOptions *exp_args,
|
|||||||
return -EEXIST;
|
return -EEXIST;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!arg->has_writable) {
|
|
||||||
arg->writable = false;
|
|
||||||
}
|
|
||||||
if (blk_is_read_only(exp->blk) && arg->writable) {
|
|
||||||
error_setg(errp, "Cannot export read-only node as writable");
|
|
||||||
return -EINVAL;
|
|
||||||
}
|
|
||||||
|
|
||||||
return nbd_export_new(exp, arg->name, arg->description, arg->bitmap,
|
return nbd_export_new(exp, arg->name, arg->description, arg->bitmap,
|
||||||
!arg->writable, !arg->writable, errp);
|
!exp_args->writable, !exp_args->writable, errp);
|
||||||
}
|
}
|
||||||
|
|
||||||
void qmp_nbd_server_add(NbdServerAddOptions *arg, Error **errp)
|
void qmp_nbd_server_add(NbdServerAddOptions *arg, Error **errp)
|
||||||
@ -241,13 +233,13 @@ void qmp_nbd_server_add(NbdServerAddOptions *arg, Error **errp)
|
|||||||
.type = BLOCK_EXPORT_TYPE_NBD,
|
.type = BLOCK_EXPORT_TYPE_NBD,
|
||||||
.id = g_strdup(arg->name),
|
.id = g_strdup(arg->name),
|
||||||
.node_name = g_strdup(bdrv_get_node_name(bs)),
|
.node_name = g_strdup(bdrv_get_node_name(bs)),
|
||||||
|
.has_writable = arg->has_writable,
|
||||||
|
.writable = arg->writable,
|
||||||
.u.nbd = {
|
.u.nbd = {
|
||||||
.has_name = true,
|
.has_name = true,
|
||||||
.name = g_strdup(arg->name),
|
.name = g_strdup(arg->name),
|
||||||
.has_description = arg->has_description,
|
.has_description = arg->has_description,
|
||||||
.description = g_strdup(arg->description),
|
.description = g_strdup(arg->description),
|
||||||
.has_writable = arg->has_writable,
|
|
||||||
.writable = arg->writable,
|
|
||||||
.has_bitmap = arg->has_bitmap,
|
.has_bitmap = arg->has_bitmap,
|
||||||
.bitmap = g_strdup(arg->bitmap),
|
.bitmap = g_strdup(arg->bitmap),
|
||||||
},
|
},
|
||||||
@ -259,8 +251,8 @@ void qmp_nbd_server_add(NbdServerAddOptions *arg, Error **errp)
|
|||||||
* block-export-add.
|
* block-export-add.
|
||||||
*/
|
*/
|
||||||
if (bdrv_is_read_only(bs)) {
|
if (bdrv_is_read_only(bs)) {
|
||||||
export_opts->u.nbd.has_writable = true;
|
export_opts->has_writable = true;
|
||||||
export_opts->u.nbd.writable = false;
|
export_opts->writable = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
export = blk_exp_add(export_opts, errp);
|
export = blk_exp_add(export_opts, errp);
|
||||||
|
@ -1530,11 +1530,6 @@ int nbd_export_new(BlockExport *blk_exp,
|
|||||||
/* Don't allow resize while the NBD server is running, otherwise we don't
|
/* Don't allow resize while the NBD server is running, otherwise we don't
|
||||||
* care what happens with the node. */
|
* care what happens with the node. */
|
||||||
blk_get_perm(blk, &perm, &shared_perm);
|
blk_get_perm(blk, &perm, &shared_perm);
|
||||||
|
|
||||||
if (!readonly) {
|
|
||||||
perm |= BLK_PERM_WRITE;
|
|
||||||
}
|
|
||||||
|
|
||||||
ret = blk_set_perm(blk, perm, shared_perm & ~BLK_PERM_RESIZE, errp);
|
ret = blk_set_perm(blk, perm, shared_perm & ~BLK_PERM_RESIZE, errp);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
return ret;
|
return ret;
|
||||||
|
@ -74,9 +74,6 @@
|
|||||||
# @description: Free-form description of the export, up to 4096 bytes.
|
# @description: Free-form description of the export, up to 4096 bytes.
|
||||||
# (Since 5.0)
|
# (Since 5.0)
|
||||||
#
|
#
|
||||||
# @writable: Whether clients should be able to write to the device via the
|
|
||||||
# NBD connection (default false).
|
|
||||||
#
|
|
||||||
# @bitmap: Also export the dirty bitmap reachable from @device, so the
|
# @bitmap: Also export the dirty bitmap reachable from @device, so the
|
||||||
# NBD client can use NBD_OPT_SET_META_CONTEXT with
|
# NBD client can use NBD_OPT_SET_META_CONTEXT with
|
||||||
# "qemu:dirty-bitmap:NAME" to inspect the bitmap. (since 4.0)
|
# "qemu:dirty-bitmap:NAME" to inspect the bitmap. (since 4.0)
|
||||||
@ -85,7 +82,7 @@
|
|||||||
##
|
##
|
||||||
{ 'struct': 'BlockExportOptionsNbd',
|
{ 'struct': 'BlockExportOptionsNbd',
|
||||||
'data': { '*name': 'str', '*description': 'str',
|
'data': { '*name': 'str', '*description': 'str',
|
||||||
'*writable': 'bool', '*bitmap': 'str' } }
|
'*bitmap': 'str' } }
|
||||||
|
|
||||||
##
|
##
|
||||||
# @NbdServerAddOptions:
|
# @NbdServerAddOptions:
|
||||||
@ -94,11 +91,15 @@
|
|||||||
#
|
#
|
||||||
# @device: The device name or node name of the node to be exported
|
# @device: The device name or node name of the node to be exported
|
||||||
#
|
#
|
||||||
|
# @writable: Whether clients should be able to write to the device via the
|
||||||
|
# NBD connection (default false).
|
||||||
|
#
|
||||||
# Since: 5.0
|
# Since: 5.0
|
||||||
##
|
##
|
||||||
{ 'struct': 'NbdServerAddOptions',
|
{ 'struct': 'NbdServerAddOptions',
|
||||||
'base': 'BlockExportOptionsNbd',
|
'base': 'BlockExportOptionsNbd',
|
||||||
'data': { 'device': 'str' } }
|
'data': { 'device': 'str',
|
||||||
|
'*writable': 'bool' } }
|
||||||
|
|
||||||
##
|
##
|
||||||
# @nbd-server-add:
|
# @nbd-server-add:
|
||||||
@ -188,6 +189,9 @@
|
|||||||
#
|
#
|
||||||
# @node-name: The node name of the block node to be exported (since: 5.2)
|
# @node-name: The node name of the block node to be exported (since: 5.2)
|
||||||
#
|
#
|
||||||
|
# @writable: True if clients should be able to write to the export
|
||||||
|
# (default false)
|
||||||
|
#
|
||||||
# @writethrough: If true, caches are flushed after every write request to the
|
# @writethrough: If true, caches are flushed after every write request to the
|
||||||
# export before completion is signalled. (since: 5.2;
|
# export before completion is signalled. (since: 5.2;
|
||||||
# default: false)
|
# default: false)
|
||||||
@ -198,6 +202,7 @@
|
|||||||
'base': { 'type': 'BlockExportType',
|
'base': { 'type': 'BlockExportType',
|
||||||
'id': 'str',
|
'id': 'str',
|
||||||
'node-name': 'str',
|
'node-name': 'str',
|
||||||
|
'*writable': 'bool',
|
||||||
'*writethrough': 'bool' },
|
'*writethrough': 'bool' },
|
||||||
'discriminator': 'type',
|
'discriminator': 'type',
|
||||||
'data': {
|
'data': {
|
||||||
|
@ -1068,13 +1068,13 @@ int main(int argc, char **argv)
|
|||||||
.node_name = g_strdup(bdrv_get_node_name(bs)),
|
.node_name = g_strdup(bdrv_get_node_name(bs)),
|
||||||
.has_writethrough = true,
|
.has_writethrough = true,
|
||||||
.writethrough = writethrough,
|
.writethrough = writethrough,
|
||||||
|
.has_writable = true,
|
||||||
|
.writable = !readonly,
|
||||||
.u.nbd = {
|
.u.nbd = {
|
||||||
.has_name = true,
|
.has_name = true,
|
||||||
.name = g_strdup(export_name),
|
.name = g_strdup(export_name),
|
||||||
.has_description = !!export_description,
|
.has_description = !!export_description,
|
||||||
.description = g_strdup(export_description),
|
.description = g_strdup(export_description),
|
||||||
.has_writable = true,
|
|
||||||
.writable = !readonly,
|
|
||||||
.has_bitmap = !!bitmap,
|
.has_bitmap = !!bitmap,
|
||||||
.bitmap = g_strdup(bitmap),
|
.bitmap = g_strdup(bitmap),
|
||||||
},
|
},
|
||||||
|
Loading…
Reference in New Issue
Block a user