diff options
author | Kevin Wolf | 2020-09-24 17:27:11 +0200 |
---|---|---|
committer | Kevin Wolf | 2020-10-02 15:46:40 +0200 |
commit | 30dbc81d310cc5c78589ab689083371c4bfced1f (patch) | |
tree | 7e34f866a97b898cc010c72031b2ad99f945319c /block | |
parent | block/export: Add query-block-exports (diff) | |
download | qemu-30dbc81d310cc5c78589ab689083371c4bfced1f.tar.gz qemu-30dbc81d310cc5c78589ab689083371c4bfced1f.tar.xz qemu-30dbc81d310cc5c78589ab689083371c4bfced1f.zip |
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>
Diffstat (limited to 'block')
-rw-r--r-- | block/export/export.c | 16 |
1 files changed, 15 insertions, 1 deletions
diff --git a/block/export/export.c b/block/export/export.c index 657bb58b51..f2c00d13bf 100644 --- a/block/export/export.c +++ b/block/export/export.c @@ -62,6 +62,7 @@ BlockExport *blk_exp_add(BlockExportOptions *export, Error **errp) BlockDriverState *bs; BlockBackend *blk; AioContext *ctx; + uint64_t perm; int ret; if (!id_wellformed(export->id)) { @@ -84,6 +85,14 @@ BlockExport *blk_exp_add(BlockExportOptions *export, Error **errp) 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); aio_context_acquire(ctx); @@ -95,7 +104,12 @@ BlockExport *blk_exp_add(BlockExportOptions *export, Error **errp) */ 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); if (ret < 0) { goto fail; |