[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-block] [PATCH v5 10/16] qemu-io: Put flag changes in the options Q
From: |
Alberto Garcia |
Subject: |
[Qemu-block] [PATCH v5 10/16] qemu-io: Put flag changes in the options QDict in reopen_f() |
Date: |
Mon, 12 Nov 2018 16:00:42 +0200 |
When reopen_f() puts a block device in the reopen queue, some of the
new options are passed using a QDict, but others ("read-only" and the
cache options) are passed as flags.
This patch puts those flags in the QDict. This way the flags parameter
becomes redundant and we'll be able to get rid of it in a subsequent
patch.
Signed-off-by: Alberto Garcia <address@hidden>
Reviewed-by: Max Reitz <address@hidden>
---
qemu-io-cmds.c | 27 ++++++++++++++++++++++++++-
tests/qemu-iotests/133 | 9 +++++++++
tests/qemu-iotests/133.out | 8 ++++++++
3 files changed, 43 insertions(+), 1 deletion(-)
diff --git a/qemu-io-cmds.c b/qemu-io-cmds.c
index 5363482213..c9ae09d574 100644
--- a/qemu-io-cmds.c
+++ b/qemu-io-cmds.c
@@ -10,6 +10,7 @@
#include "qemu/osdep.h"
#include "qapi/error.h"
+#include "qapi/qmp/qdict.h"
#include "qemu-io.h"
#include "sysemu/block-backend.h"
#include "block/block.h"
@@ -1978,6 +1979,7 @@ static int reopen_f(BlockBackend *blk, int argc, char
**argv)
int flags = bs->open_flags;
bool writethrough = !blk_enable_write_cache(blk);
bool has_rw_option = false;
+ bool has_cache_option = false;
BlockReopenQueue *brq;
Error *local_err = NULL;
@@ -1989,6 +1991,7 @@ static int reopen_f(BlockBackend *blk, int argc, char
**argv)
error_report("Invalid cache option: %s", optarg);
return -EINVAL;
}
+ has_cache_option = true;
break;
case 'o':
if (!qemu_opts_parse_noisily(&reopen_opts, optarg, 0)) {
@@ -2046,9 +2049,31 @@ static int reopen_f(BlockBackend *blk, int argc, char
**argv)
}
qopts = qemu_opts_find(&reopen_opts, NULL);
- opts = qopts ? qemu_opts_to_qdict(qopts, NULL) : NULL;
+ opts = qopts ? qemu_opts_to_qdict(qopts, NULL) : qdict_new();
qemu_opts_reset(&reopen_opts);
+ if (qdict_haskey(opts, BDRV_OPT_READ_ONLY)) {
+ if (has_rw_option) {
+ error_report("Cannot set both -r/-w and '" BDRV_OPT_READ_ONLY "'");
+ qobject_unref(opts);
+ return -EINVAL;
+ }
+ } else {
+ qdict_put_bool(opts, BDRV_OPT_READ_ONLY, !(flags & BDRV_O_RDWR));
+ }
+
+ if (qdict_haskey(opts, BDRV_OPT_CACHE_DIRECT) ||
+ qdict_haskey(opts, BDRV_OPT_CACHE_NO_FLUSH)) {
+ if (has_cache_option) {
+ error_report("Cannot set both -c and the cache options");
+ qobject_unref(opts);
+ return -EINVAL;
+ }
+ } else {
+ qdict_put_bool(opts, BDRV_OPT_CACHE_DIRECT, flags & BDRV_O_NOCACHE);
+ qdict_put_bool(opts, BDRV_OPT_CACHE_NO_FLUSH, flags & BDRV_O_NO_FLUSH);
+ }
+
bdrv_subtree_drained_begin(bs);
brq = bdrv_reopen_queue(NULL, bs, opts, flags);
bdrv_reopen_multiple(bdrv_get_aio_context(bs), brq, &local_err);
diff --git a/tests/qemu-iotests/133 b/tests/qemu-iotests/133
index af6b3e1dd4..14e6b3b972 100755
--- a/tests/qemu-iotests/133
+++ b/tests/qemu-iotests/133
@@ -92,6 +92,15 @@ echo
IMGOPTSSYNTAX=false $QEMU_IO -f null-co -c 'reopen' -c 'info' \
"json:{'driver': 'null-co', 'size': 65536}"
+echo
+echo "=== Check that mixing -c/-r/-w and their corresponding options is
forbidden ==="
+echo
+
+$QEMU_IO -c 'reopen -r -o read-only=on' $TEST_IMG
+$QEMU_IO -c 'reopen -w -o read-only=on' $TEST_IMG
+$QEMU_IO -c 'reopen -c none -o cache.direct=on' $TEST_IMG
+$QEMU_IO -c 'reopen -c writeback -o cache.direct=on' $TEST_IMG
+$QEMU_IO -c 'reopen -c directsync -o cache.no-flush=on' $TEST_IMG
# success, all done
echo "*** done"
rm -f $seq.full
diff --git a/tests/qemu-iotests/133.out b/tests/qemu-iotests/133.out
index f4a85aeb63..48a9d087f0 100644
--- a/tests/qemu-iotests/133.out
+++ b/tests/qemu-iotests/133.out
@@ -24,4 +24,12 @@ Cannot change the option 'driver'
format name: null-co
format name: null-co
+
+=== Check that mixing -c/-r/-w and their corresponding options is forbidden ===
+
+Cannot set both -r/-w and 'read-only'
+Cannot set both -r/-w and 'read-only'
+Cannot set both -c and the cache options
+Cannot set both -c and the cache options
+Cannot set both -c and the cache options
*** done
--
2.11.0
- [Qemu-block] [PATCH v5 15/16] block: Assert that flags are up-to-date in bdrv_reopen_prepare(), (continued)
- [Qemu-block] [PATCH v5 15/16] block: Assert that flags are up-to-date in bdrv_reopen_prepare(), Alberto Garcia, 2018/11/12
- [Qemu-block] [PATCH v5 06/16] block: Use bdrv_reopen_set_read_only() in qmp_change_backing_file(), Alberto Garcia, 2018/11/12
- [Qemu-block] [PATCH v5 11/16] block: Clean up reopen_backing_file() in block/replication.c, Alberto Garcia, 2018/11/12
- [Qemu-block] [PATCH v5 16/16] block: Fix update of BDRV_O_AUTO_RDONLY in update_flags_from_options(), Alberto Garcia, 2018/11/12
- [Qemu-block] [PATCH v5 02/16] block: Use bdrv_reopen_set_read_only() in bdrv_backing_update_filename(), Alberto Garcia, 2018/11/12
- [Qemu-block] [PATCH v5 03/16] block: Use bdrv_reopen_set_read_only() in commit_start/complete(), Alberto Garcia, 2018/11/12
- [Qemu-block] [PATCH v5 13/16] block: Stop passing flags to bdrv_reopen_queue_child(), Alberto Garcia, 2018/11/12
- [Qemu-block] [PATCH v5 12/16] block: Remove flags parameter from bdrv_reopen_queue(), Alberto Garcia, 2018/11/12
- [Qemu-block] [PATCH v5 09/16] block: Drop bdrv_reopen(), Alberto Garcia, 2018/11/12
- [Qemu-block] [PATCH v5 14/16] block: Remove assertions from update_flags_from_options(), Alberto Garcia, 2018/11/12
- [Qemu-block] [PATCH v5 10/16] qemu-io: Put flag changes in the options QDict in reopen_f(),
Alberto Garcia <=
- [Qemu-block] [PATCH v5 07/16] block: Use bdrv_reopen_set_read_only() in external_snapshot_commit(), Alberto Garcia, 2018/11/12
- [Qemu-block] [PATCH v5 04/16] block: Use bdrv_reopen_set_read_only() in bdrv_commit(), Alberto Garcia, 2018/11/12
- [Qemu-block] [PATCH v5 01/16] block: Add bdrv_reopen_set_read_only(), Alberto Garcia, 2018/11/12
- Re: [Qemu-block] [PATCH v5 00/16] Don't pass flags to bdrv_reopen_queue(), Kevin Wolf, 2018/11/20
- Re: [Qemu-block] [PATCH v5 00/16] Don't pass flags to bdrv_reopen_queue(), Kevin Wolf, 2018/11/21