summaryrefslogtreecommitdiffstats
path: root/block
diff options
context:
space:
mode:
authorKevin Wolf2020-09-24 17:27:11 +0200
committerKevin Wolf2020-10-02 15:46:40 +0200
commit30dbc81d310cc5c78589ab689083371c4bfced1f (patch)
tree7e34f866a97b898cc010c72031b2ad99f945319c /block
parentblock/export: Add query-block-exports (diff)
downloadqemu-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.c16
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;