1
The following changes since commit b2f7a038bb4c4fc5ce6b8486e8513dfd97665e2a:
1
The following changes since commit 0274f45bdef73283f2c213610f11d4e5dcba43b6:
2
2
3
Merge remote-tracking branch 'remotes/rth/tags/pull-softfloat-20181104' into staging (2018-11-05 10:32:49 +0000)
3
Merge remote-tracking branch 'remotes/vivier2/tags/linux-user-for-4.1-pull-request' into staging (2019-07-19 09:44:43 +0100)
4
4
5
are available in the Git repository at:
5
are available in the Git repository at:
6
6
7
git://repo.or.cz/qemu/kevin.git tags/for-upstream
7
git://repo.or.cz/qemu/kevin.git tags/for-upstream
8
8
9
for you to fetch changes up to 1240ac558d348f6c7a5752b1a57c1da58e4efe3e:
9
for you to fetch changes up to 49278ec065da3fbf90f7effcde3b39ac606b2e9e:
10
10
11
include: Add a comment to explain the origin of sizes' lookup table (2018-11-05 15:29:59 +0100)
11
iotests: Test quitting with job on throttled node (2019-07-19 15:17:55 +0200)
12
12
13
----------------------------------------------------------------
13
----------------------------------------------------------------
14
Block layer patches:
14
Block layer patches:
15
15
16
- auto-read-only option to fix commit job when used with -blockdev
16
- block: Fix forbidden use of polling in drained_end
17
- Fix help text related qemu-iotests failure (by improving the help text
17
- block: Don't wait for I/O throttling while exiting QEMU
18
and updating the reference output)
18
- iotests: Use read-zeroes for the null driver to be Valgrind-friendly
19
- quorum: Add missing checks when adding/removing child nodes
20
- Don't take address of fields in packed structs
21
- vvfat: Fix crash when reporting error about too many files in directory
22
19
23
----------------------------------------------------------------
20
----------------------------------------------------------------
24
Alberto Garcia (7):
21
Andrey Shinkevich (1):
25
block: replace "discard" literal with BDRV_OPT_DISCARD macro
22
iotests: Set read-zeroes on in null block driver for Valgrind
26
qcow2: Get the request alignment for encrypted images from QCryptoBlock
27
quorum: Remove quorum_err()
28
quorum: Return an error if the blkverify mode has invalid settings
29
iotest: Test the blkverify mode of the Quorum driver
30
quorum: Forbid adding children in blkverify mode
31
iotest: Test x-blockdev-change on a Quorum
32
23
33
Cleber Rosa (1):
24
Max Reitz (12):
34
iotests: make 083 specific to raw
25
block: Introduce BdrvChild.parent_quiesce_counter
26
tests: Add job commit by drained_end test
27
block: Add @drained_end_counter
28
block: Make bdrv_parent_drained_[^_]*() static
29
tests: Lock AioContexts in test-block-iothread
30
block: Do not poll in bdrv_do_drained_end()
31
tests: Extend commit by drained_end test
32
block: Loop unsafely in bdrv*drained_end()
33
iotests: Add @has_quit to vm.shutdown()
34
iotests: Test commit with a filter on the chain
35
vl: Drain before (block) job cancel when quitting
36
iotests: Test quitting with job on throttled node
35
37
36
Daniel P. Berrangé (1):
38
include/block/block.h | 42 ++++++++----
37
crypto: initialize sector size even when opening with no IO flag
39
include/block/block_int.h | 15 ++++-
40
block.c | 52 ++++++++++-----
41
block/block-backend.c | 6 +-
42
block/io.c | 134 +++++++++++++++++++++++++++----------
43
blockjob.c | 2 +-
44
tests/test-bdrv-drain.c | 147 ++++++++++++++++++++++++++++++++++++++++
45
tests/test-block-iothread.c | 40 +++++++----
46
vl.c | 11 +++
47
python/qemu/machine.py | 5 +-
48
tests/qemu-iotests/040 | 40 ++++++++++-
49
tests/qemu-iotests/040.out | 4 +-
50
tests/qemu-iotests/051 | 10 +--
51
tests/qemu-iotests/051.pc.out | 10 +--
52
tests/qemu-iotests/093 | 9 +--
53
tests/qemu-iotests/136 | 1 +
54
tests/qemu-iotests/186 | 20 +++---
55
tests/qemu-iotests/186.out | 152 +++++++++++++++++++++---------------------
56
tests/qemu-iotests/218 | 55 ++++++++++++++-
57
tests/qemu-iotests/218.out | 4 ++
58
tests/qemu-iotests/227 | 4 +-
59
tests/qemu-iotests/227.out | 4 +-
60
tests/qemu-iotests/238 | 2 +-
61
tests/qemu-iotests/240 | 8 +--
62
tests/qemu-iotests/255 | 2 +-
63
25 files changed, 576 insertions(+), 203 deletions(-)
38
64
39
Kevin Wolf (12):
40
vpc: Don't leak opts in vpc_open()
41
block: Update flags in bdrv_set_read_only()
42
block: Add auto-read-only option
43
rbd: Close image in qemu_rbd_open() error path
44
block: Require auto-read-only for existing fallbacks
45
nbd: Support auto-read-only option
46
file-posix: Support auto-read-only option
47
curl: Support auto-read-only option
48
gluster: Support auto-read-only option
49
iscsi: Support auto-read-only option
50
block: Make auto-read-only=on default for -drive
51
qemu-iotests: Test auto-read-only with -drive and -blockdev
52
53
Leonid Bloch (2):
54
vdi: Use a literal number of bytes for DEFAULT_CLUSTER_SIZE
55
include: Add a comment to explain the origin of sizes' lookup table
56
57
Li Qiang (1):
58
block: change some function return type to bool
59
60
Max Reitz (5):
61
option: Make option help nicer to read
62
chardev: Indent list of chardevs
63
qdev-monitor: Make device options help nicer
64
object: Make option help nicer to read
65
fw_cfg: Drop newline in @file description
66
67
Peter Maydell (5):
68
block/qcow2: Don't take address of fields in packed structs
69
block/qcow: Don't take address of fields in packed structs
70
block/qcow2-bitmap: Don't take address of fields in packed structs
71
block/vhdx: Don't take address of fields in packed structs
72
block/vdi: Don't take address of fields in packed structs
73
74
Stefan Weil (1):
75
qemu-io-cmds: Fix two format strings
76
77
Thomas Huth (1):
78
block/vvfat: Fix crash when reporting error about too many files in directory
79
80
qapi/block-core.json | 7 +
81
block/vhdx.h | 12 +-
82
include/block/block.h | 5 +-
83
include/qemu/option.h | 2 +-
84
include/qemu/units.h | 18 +
85
include/sysemu/block-backend.h | 6 +-
86
block.c | 60 ++-
87
block/block-backend.c | 8 +-
88
block/bochs.c | 17 +-
89
block/cloop.c | 16 +-
90
block/curl.c | 8 +-
91
block/dmg.c | 16 +-
92
block/file-posix.c | 19 +-
93
block/gluster.c | 12 +-
94
block/iscsi.c | 8 +-
95
block/nbd-client.c | 10 +-
96
block/qcow.c | 18 +-
97
block/qcow2-bitmap.c | 24 +-
98
block/qcow2.c | 66 +--
99
block/quorum.c | 45 +-
100
block/rbd.c | 14 +-
101
block/vdi.c | 68 +--
102
block/vhdx-endian.c | 118 ++---
103
block/vhdx-log.c | 4 +-
104
block/vhdx.c | 18 +-
105
block/vpc.c | 2 +
106
block/vvfat.c | 15 +-
107
blockdev.c | 3 +-
108
chardev/char.c | 2 +-
109
crypto/block-qcow.c | 2 +
110
qdev-monitor.c | 13 +-
111
qemu-img.c | 4 +-
112
qemu-io-cmds.c | 4 +-
113
util/qemu-option.c | 32 +-
114
vl.c | 15 +-
115
tests/qemu-iotests/081 | 116 +++++
116
tests/qemu-iotests/081.out | 70 +++
117
tests/qemu-iotests/082.out | 956 ++++++++++++++++++++---------------------
118
tests/qemu-iotests/083 | 2 +-
119
tests/qemu-iotests/232 | 147 +++++++
120
tests/qemu-iotests/232.out | 59 +++
121
tests/qemu-iotests/group | 1 +
122
42 files changed, 1266 insertions(+), 776 deletions(-)
123
create mode 100755 tests/qemu-iotests/232
124
create mode 100644 tests/qemu-iotests/232.out
125
diff view generated by jsdifflib
Deleted patch
1
From: Thomas Huth <thuth@redhat.com>
2
1
3
When using the vvfat driver with a directory that contains too many files,
4
QEMU currently crashes. This can be triggered like this for example:
5
6
mkdir /tmp/vvfattest
7
cd /tmp/vvfattest
8
for ((x=0;x<=513;x++)); do mkdir $x; done
9
qemu-system-x86_64 -drive \
10
file.driver=vvfat,file.dir=.,read-only=on,media=cdrom
11
12
Seems like read_directory() is changing the mapping->path variable. Make
13
sure we use the right pointer instead.
14
15
Signed-off-by: Thomas Huth <thuth@redhat.com>
16
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
17
---
18
block/vvfat.c | 4 ++--
19
1 file changed, 2 insertions(+), 2 deletions(-)
20
21
diff --git a/block/vvfat.c b/block/vvfat.c
22
index XXXXXXX..XXXXXXX 100644
23
--- a/block/vvfat.c
24
+++ b/block/vvfat.c
25
@@ -XXX,XX +XXX,XX @@ static int init_directories(BDRVVVFATState* s,
26
mapping = array_get(&(s->mapping), i);
27
28
if (mapping->mode & MODE_DIRECTORY) {
29
+ char *path = mapping->path;
30
mapping->begin = cluster;
31
if(read_directory(s, i)) {
32
- error_setg(errp, "Could not read directory %s",
33
- mapping->path);
34
+ error_setg(errp, "Could not read directory %s", path);
35
return -1;
36
}
37
mapping = array_get(&(s->mapping), i);
38
--
39
2.19.1
40
41
diff view generated by jsdifflib
Deleted patch
1
From: Alberto Garcia <berto@igalia.com>
2
1
3
Signed-off-by: Alberto Garcia <berto@igalia.com>
4
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
5
---
6
block.c | 6 +++---
7
1 file changed, 3 insertions(+), 3 deletions(-)
8
9
diff --git a/block.c b/block.c
10
index XXXXXXX..XXXXXXX 100644
11
--- a/block.c
12
+++ b/block.c
13
@@ -XXX,XX +XXX,XX @@ QemuOptsList bdrv_runtime_opts = {
14
.help = "try to optimize zero writes (off, on, unmap)",
15
},
16
{
17
- .name = "discard",
18
+ .name = BDRV_OPT_DISCARD,
19
.type = QEMU_OPT_STRING,
20
.help = "discard operation (ignore/off, unmap/on)",
21
},
22
@@ -XXX,XX +XXX,XX @@ static int bdrv_open_common(BlockDriverState *bs, BlockBackend *file,
23
}
24
}
25
26
- discard = qemu_opt_get(opts, "discard");
27
+ discard = qemu_opt_get(opts, BDRV_OPT_DISCARD);
28
if (discard != NULL) {
29
if (bdrv_parse_discard_flags(discard, &bs->open_flags) != 0) {
30
error_setg(errp, "Invalid discard option");
31
@@ -XXX,XX +XXX,XX @@ int bdrv_reopen_prepare(BDRVReopenState *reopen_state, BlockReopenQueue *queue,
32
33
update_flags_from_options(&reopen_state->flags, opts);
34
35
- discard = qemu_opt_get_del(opts, "discard");
36
+ discard = qemu_opt_get_del(opts, BDRV_OPT_DISCARD);
37
if (discard != NULL) {
38
if (bdrv_parse_discard_flags(discard, &reopen_state->flags) != 0) {
39
error_setg(errp, "Invalid discard option");
40
--
41
2.19.1
42
43
diff view generated by jsdifflib
Deleted patch
1
From: Stefan Weil <sw@weilnetz.de>
2
1
3
Use %zu instead of %zd for unsigned numbers.
4
5
This fixes two error messages from the LSTM static code analyzer:
6
7
This argument should be of type 'ssize_t' but is of type 'unsigned long'
8
9
Signed-off-by: Stefan Weil <sw@weilnetz.de>
10
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
11
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
12
---
13
qemu-io-cmds.c | 4 ++--
14
1 file changed, 2 insertions(+), 2 deletions(-)
15
16
diff --git a/qemu-io-cmds.c b/qemu-io-cmds.c
17
index XXXXXXX..XXXXXXX 100644
18
--- a/qemu-io-cmds.c
19
+++ b/qemu-io-cmds.c
20
@@ -XXX,XX +XXX,XX @@ static int readv_f(BlockBackend *blk, int argc, char **argv)
21
memset(cmp_buf, pattern, qiov.size);
22
if (memcmp(buf, cmp_buf, qiov.size)) {
23
printf("Pattern verification failed at offset %"
24
- PRId64 ", %zd bytes\n", offset, qiov.size);
25
+ PRId64 ", %zu bytes\n", offset, qiov.size);
26
ret = -EINVAL;
27
}
28
g_free(cmp_buf);
29
@@ -XXX,XX +XXX,XX @@ static void aio_read_done(void *opaque, int ret)
30
memset(cmp_buf, ctx->pattern, ctx->qiov.size);
31
if (memcmp(ctx->buf, cmp_buf, ctx->qiov.size)) {
32
printf("Pattern verification failed at offset %"
33
- PRId64 ", %zd bytes\n", ctx->offset, ctx->qiov.size);
34
+ PRId64 ", %zu bytes\n", ctx->offset, ctx->qiov.size);
35
}
36
g_free(cmp_buf);
37
}
38
--
39
2.19.1
40
41
diff view generated by jsdifflib
Deleted patch
1
From: Peter Maydell <peter.maydell@linaro.org>
2
1
3
Taking the address of a field in a packed struct is a bad idea, because
4
it might not be actually aligned enough for that pointer type (and
5
thus cause a crash on dereference on some host architectures). Newer
6
versions of clang warn about this. Avoid the bug by not using the
7
"modify in place" byte swapping functions.
8
9
There are a few places where the in-place swap function is
10
used on something other than a packed struct field; we convert
11
those anyway, for consistency.
12
13
This patch was produced with the following spatch script
14
(and hand-editing to fold a few resulting overlength lines):
15
16
@@
17
expression E;
18
@@
19
-be16_to_cpus(&E);
20
+E = be16_to_cpu(E);
21
@@
22
expression E;
23
@@
24
-be32_to_cpus(&E);
25
+E = be32_to_cpu(E);
26
@@
27
expression E;
28
@@
29
-be64_to_cpus(&E);
30
+E = be64_to_cpu(E);
31
@@
32
expression E;
33
@@
34
-cpu_to_be16s(&E);
35
+E = cpu_to_be16(E);
36
@@
37
expression E;
38
@@
39
-cpu_to_be32s(&E);
40
+E = cpu_to_be32(E);
41
@@
42
expression E;
43
@@
44
-cpu_to_be64s(&E);
45
+E = cpu_to_be64(E);
46
47
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
48
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
49
Tested-by: John Snow <jsnow@redhat.com>
50
Reviewed-by: John Snow <jsnow@redhat.com>
51
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
52
---
53
block/qcow2.c | 64 +++++++++++++++++++++++++++------------------------
54
1 file changed, 34 insertions(+), 30 deletions(-)
55
56
diff --git a/block/qcow2.c b/block/qcow2.c
57
index XXXXXXX..XXXXXXX 100644
58
--- a/block/qcow2.c
59
+++ b/block/qcow2.c
60
@@ -XXX,XX +XXX,XX @@ static int qcow2_read_extensions(BlockDriverState *bs, uint64_t start_offset,
61
"pread fail from offset %" PRIu64, offset);
62
return 1;
63
}
64
- be32_to_cpus(&ext.magic);
65
- be32_to_cpus(&ext.len);
66
+ ext.magic = be32_to_cpu(ext.magic);
67
+ ext.len = be32_to_cpu(ext.len);
68
offset += sizeof(ext);
69
#ifdef DEBUG_EXT
70
printf("ext.magic = 0x%x\n", ext.magic);
71
@@ -XXX,XX +XXX,XX @@ static int qcow2_read_extensions(BlockDriverState *bs, uint64_t start_offset,
72
"Unable to read CRYPTO header extension");
73
return ret;
74
}
75
- be64_to_cpus(&s->crypto_header.offset);
76
- be64_to_cpus(&s->crypto_header.length);
77
+ s->crypto_header.offset = be64_to_cpu(s->crypto_header.offset);
78
+ s->crypto_header.length = be64_to_cpu(s->crypto_header.length);
79
80
if ((s->crypto_header.offset % s->cluster_size) != 0) {
81
error_setg(errp, "Encryption header offset '%" PRIu64 "' is "
82
@@ -XXX,XX +XXX,XX @@ static int qcow2_read_extensions(BlockDriverState *bs, uint64_t start_offset,
83
return -EINVAL;
84
}
85
86
- be32_to_cpus(&bitmaps_ext.nb_bitmaps);
87
- be64_to_cpus(&bitmaps_ext.bitmap_directory_size);
88
- be64_to_cpus(&bitmaps_ext.bitmap_directory_offset);
89
+ bitmaps_ext.nb_bitmaps = be32_to_cpu(bitmaps_ext.nb_bitmaps);
90
+ bitmaps_ext.bitmap_directory_size =
91
+ be64_to_cpu(bitmaps_ext.bitmap_directory_size);
92
+ bitmaps_ext.bitmap_directory_offset =
93
+ be64_to_cpu(bitmaps_ext.bitmap_directory_offset);
94
95
if (bitmaps_ext.nb_bitmaps > QCOW2_MAX_BITMAPS) {
96
error_setg(errp,
97
@@ -XXX,XX +XXX,XX @@ static int coroutine_fn qcow2_do_open(BlockDriverState *bs, QDict *options,
98
error_setg_errno(errp, -ret, "Could not read qcow2 header");
99
goto fail;
100
}
101
- be32_to_cpus(&header.magic);
102
- be32_to_cpus(&header.version);
103
- be64_to_cpus(&header.backing_file_offset);
104
- be32_to_cpus(&header.backing_file_size);
105
- be64_to_cpus(&header.size);
106
- be32_to_cpus(&header.cluster_bits);
107
- be32_to_cpus(&header.crypt_method);
108
- be64_to_cpus(&header.l1_table_offset);
109
- be32_to_cpus(&header.l1_size);
110
- be64_to_cpus(&header.refcount_table_offset);
111
- be32_to_cpus(&header.refcount_table_clusters);
112
- be64_to_cpus(&header.snapshots_offset);
113
- be32_to_cpus(&header.nb_snapshots);
114
+ header.magic = be32_to_cpu(header.magic);
115
+ header.version = be32_to_cpu(header.version);
116
+ header.backing_file_offset = be64_to_cpu(header.backing_file_offset);
117
+ header.backing_file_size = be32_to_cpu(header.backing_file_size);
118
+ header.size = be64_to_cpu(header.size);
119
+ header.cluster_bits = be32_to_cpu(header.cluster_bits);
120
+ header.crypt_method = be32_to_cpu(header.crypt_method);
121
+ header.l1_table_offset = be64_to_cpu(header.l1_table_offset);
122
+ header.l1_size = be32_to_cpu(header.l1_size);
123
+ header.refcount_table_offset = be64_to_cpu(header.refcount_table_offset);
124
+ header.refcount_table_clusters =
125
+ be32_to_cpu(header.refcount_table_clusters);
126
+ header.snapshots_offset = be64_to_cpu(header.snapshots_offset);
127
+ header.nb_snapshots = be32_to_cpu(header.nb_snapshots);
128
129
if (header.magic != QCOW_MAGIC) {
130
error_setg(errp, "Image is not in qcow2 format");
131
@@ -XXX,XX +XXX,XX @@ static int coroutine_fn qcow2_do_open(BlockDriverState *bs, QDict *options,
132
header.refcount_order = 4;
133
header.header_length = 72;
134
} else {
135
- be64_to_cpus(&header.incompatible_features);
136
- be64_to_cpus(&header.compatible_features);
137
- be64_to_cpus(&header.autoclear_features);
138
- be32_to_cpus(&header.refcount_order);
139
- be32_to_cpus(&header.header_length);
140
+ header.incompatible_features =
141
+ be64_to_cpu(header.incompatible_features);
142
+ header.compatible_features = be64_to_cpu(header.compatible_features);
143
+ header.autoclear_features = be64_to_cpu(header.autoclear_features);
144
+ header.refcount_order = be32_to_cpu(header.refcount_order);
145
+ header.header_length = be32_to_cpu(header.header_length);
146
147
if (header.header_length < 104) {
148
error_setg(errp, "qcow2 header too short");
149
@@ -XXX,XX +XXX,XX @@ static int coroutine_fn qcow2_do_open(BlockDriverState *bs, QDict *options,
150
goto fail;
151
}
152
for(i = 0;i < s->l1_size; i++) {
153
- be64_to_cpus(&s->l1_table[i]);
154
+ s->l1_table[i] = be64_to_cpu(s->l1_table[i]);
155
}
156
}
157
158
@@ -XXX,XX +XXX,XX @@ int qcow2_update_header(BlockDriverState *bs)
159
160
/* Full disk encryption header pointer extension */
161
if (s->crypto_header.offset != 0) {
162
- cpu_to_be64s(&s->crypto_header.offset);
163
- cpu_to_be64s(&s->crypto_header.length);
164
+ s->crypto_header.offset = cpu_to_be64(s->crypto_header.offset);
165
+ s->crypto_header.length = cpu_to_be64(s->crypto_header.length);
166
ret = header_ext_add(buf, QCOW2_EXT_MAGIC_CRYPTO_HEADER,
167
&s->crypto_header, sizeof(s->crypto_header),
168
buflen);
169
- be64_to_cpus(&s->crypto_header.offset);
170
- be64_to_cpus(&s->crypto_header.length);
171
+ s->crypto_header.offset = be64_to_cpu(s->crypto_header.offset);
172
+ s->crypto_header.length = be64_to_cpu(s->crypto_header.length);
173
if (ret < 0) {
174
goto fail;
175
}
176
--
177
2.19.1
178
179
diff view generated by jsdifflib
Deleted patch
1
From: Peter Maydell <peter.maydell@linaro.org>
2
1
3
Taking the address of a field in a packed struct is a bad idea, because
4
it might not be actually aligned enough for that pointer type (and
5
thus cause a crash on dereference on some host architectures). Newer
6
versions of clang warn about this. Avoid the bug by not using the
7
"modify in place" byte swapping functions.
8
9
There are a few places where the in-place swap function is
10
used on something other than a packed struct field; we convert
11
those anyway, for consistency.
12
13
This patch was produced with the following spatch script:
14
15
@@
16
expression E;
17
@@
18
-be16_to_cpus(&E);
19
+E = be16_to_cpu(E);
20
@@
21
expression E;
22
@@
23
-be32_to_cpus(&E);
24
+E = be32_to_cpu(E);
25
@@
26
expression E;
27
@@
28
-be64_to_cpus(&E);
29
+E = be64_to_cpu(E);
30
@@
31
expression E;
32
@@
33
-cpu_to_be16s(&E);
34
+E = cpu_to_be16(E);
35
@@
36
expression E;
37
@@
38
-cpu_to_be32s(&E);
39
+E = cpu_to_be32(E);
40
@@
41
expression E;
42
@@
43
-cpu_to_be64s(&E);
44
+E = cpu_to_be64(E);
45
46
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
47
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
48
Tested-by: John Snow <jsnow@redhat.com>
49
Reviewed-by: John Snow <jsnow@redhat.com>
50
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
51
---
52
block/qcow.c | 18 +++++++++---------
53
1 file changed, 9 insertions(+), 9 deletions(-)
54
55
diff --git a/block/qcow.c b/block/qcow.c
56
index XXXXXXX..XXXXXXX 100644
57
--- a/block/qcow.c
58
+++ b/block/qcow.c
59
@@ -XXX,XX +XXX,XX @@ static int qcow_open(BlockDriverState *bs, QDict *options, int flags,
60
if (ret < 0) {
61
goto fail;
62
}
63
- be32_to_cpus(&header.magic);
64
- be32_to_cpus(&header.version);
65
- be64_to_cpus(&header.backing_file_offset);
66
- be32_to_cpus(&header.backing_file_size);
67
- be32_to_cpus(&header.mtime);
68
- be64_to_cpus(&header.size);
69
- be32_to_cpus(&header.crypt_method);
70
- be64_to_cpus(&header.l1_table_offset);
71
+ header.magic = be32_to_cpu(header.magic);
72
+ header.version = be32_to_cpu(header.version);
73
+ header.backing_file_offset = be64_to_cpu(header.backing_file_offset);
74
+ header.backing_file_size = be32_to_cpu(header.backing_file_size);
75
+ header.mtime = be32_to_cpu(header.mtime);
76
+ header.size = be64_to_cpu(header.size);
77
+ header.crypt_method = be32_to_cpu(header.crypt_method);
78
+ header.l1_table_offset = be64_to_cpu(header.l1_table_offset);
79
80
if (header.magic != QCOW_MAGIC) {
81
error_setg(errp, "Image not in qcow format");
82
@@ -XXX,XX +XXX,XX @@ static int qcow_open(BlockDriverState *bs, QDict *options, int flags,
83
}
84
85
for(i = 0;i < s->l1_size; i++) {
86
- be64_to_cpus(&s->l1_table[i]);
87
+ s->l1_table[i] = be64_to_cpu(s->l1_table[i]);
88
}
89
90
/* alloc L2 cache (max. 64k * 16 * 8 = 8 MB) */
91
--
92
2.19.1
93
94
diff view generated by jsdifflib
1
From: Alberto Garcia <berto@igalia.com>
1
From: Andrey Shinkevich <andrey.shinkevich@virtuozzo.com>
2
2
3
Signed-off-by: Alberto Garcia <berto@igalia.com>
3
The Valgrind tool reports about the uninitialised buffer 'buf'
4
instantiated on the stack of the function guess_disk_lchs().
5
Pass 'read-zeroes=on' to the null block driver to make it deterministic.
6
The output of the tests 051, 186 and 227 now includes the parameter
7
'read-zeroes'. So, the benchmark output files are being changed too.
8
9
Suggested-by: Kevin Wolf <kwolf@redhat.com>
10
Signed-off-by: Andrey Shinkevich <andrey.shinkevich@virtuozzo.com>
4
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
11
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
5
---
12
---
6
tests/qemu-iotests/081 | 30 ++++++++++++++++++++++++++++++
13
tests/qemu-iotests/051 | 10 +--
7
tests/qemu-iotests/081.out | 16 ++++++++++++++++
14
tests/qemu-iotests/051.pc.out | 10 +--
8
2 files changed, 46 insertions(+)
15
tests/qemu-iotests/093 | 9 +-
16
tests/qemu-iotests/136 | 1 +
17
tests/qemu-iotests/186 | 20 ++---
18
tests/qemu-iotests/186.out | 152 +++++++++++++++++-----------------
19
tests/qemu-iotests/227 | 4 +-
20
tests/qemu-iotests/227.out | 4 +-
21
tests/qemu-iotests/238 | 2 +-
22
tests/qemu-iotests/240 | 8 +-
23
10 files changed, 111 insertions(+), 109 deletions(-)
9
24
10
diff --git a/tests/qemu-iotests/081 b/tests/qemu-iotests/081
25
diff --git a/tests/qemu-iotests/051 b/tests/qemu-iotests/051
11
index XXXXXXX..XXXXXXX 100755
26
index XXXXXXX..XXXXXXX 100755
12
--- a/tests/qemu-iotests/081
27
--- a/tests/qemu-iotests/051
13
+++ b/tests/qemu-iotests/081
28
+++ b/tests/qemu-iotests/051
14
@@ -XXX,XX +XXX,XX @@ echo "== checking that quorum is broken =="
29
@@ -XXX,XX +XXX,XX @@ echo
15
30
# Cannot use the test image because cache=none might not work on the host FS
16
$QEMU_IO -c "open -o $quorum" -c "read -P 0x32 0 $size" | _filter_qemu_io
31
# Use cdrom so that we won't get errors about missing media
17
32
18
+echo
33
-run_qemu -drive driver=null-co,cache=none
19
+echo "== checking the blkverify mode with broken content =="
34
-run_qemu -drive driver=null-co,cache=directsync
20
+
35
-run_qemu -drive driver=null-co,cache=writeback
21
+quorum="driver=raw,file.driver=quorum,file.vote-threshold=2,file.blkverify=on"
36
-run_qemu -drive driver=null-co,cache=writethrough
22
+quorum="$quorum,file.children.0.file.filename=$TEST_DIR/1.raw"
37
-run_qemu -drive driver=null-co,cache=unsafe
23
+quorum="$quorum,file.children.1.file.filename=$TEST_DIR/2.raw"
38
+run_qemu -drive driver=null-co,read-zeroes=on,cache=none
24
+quorum="$quorum,file.children.0.driver=raw"
39
+run_qemu -drive driver=null-co,read-zeroes=on,cache=directsync
25
+quorum="$quorum,file.children.1.driver=raw"
40
+run_qemu -drive driver=null-co,read-zeroes=on,cache=writeback
26
+
41
+run_qemu -drive driver=null-co,read-zeroes=on,cache=writethrough
27
+$QEMU_IO -c "open -o $quorum" -c "read -P 0x32 0 $size" | _filter_qemu_io
42
+run_qemu -drive driver=null-co,read-zeroes=on,cache=unsafe
28
+
43
run_qemu -drive driver=null-co,cache=invalid_value
29
+echo
44
30
+echo "== writing the same data to both files =="
45
# Can't test direct=on here because O_DIRECT might not be supported on this FS
31
+
46
diff --git a/tests/qemu-iotests/051.pc.out b/tests/qemu-iotests/051.pc.out
32
+$QEMU_IO -c "write -P 0x32 0 $size" "$TEST_DIR/1.raw" | _filter_qemu_io
47
index XXXXXXX..XXXXXXX 100644
33
+$QEMU_IO -c "write -P 0x32 0 $size" "$TEST_DIR/2.raw" | _filter_qemu_io
48
--- a/tests/qemu-iotests/051.pc.out
34
+
49
+++ b/tests/qemu-iotests/051.pc.out
35
+echo
50
@@ -XXX,XX +XXX,XX @@ QEMU X.Y.Z monitor - type 'help' for more information
36
+echo "== checking the blkverify mode with valid content =="
51
37
+
52
=== Cache modes ===
38
+$QEMU_IO -c "open -o $quorum" -c "read -P 0x32 0 $size" | _filter_qemu_io
53
39
+
54
-Testing: -drive driver=null-co,cache=none
40
+echo
55
+Testing: -drive driver=null-co,read-zeroes=on,cache=none
41
+echo "== checking the blkverify mode with invalid settings =="
56
QEMU X.Y.Z monitor - type 'help' for more information
42
+
57
(qemu) quit
43
+quorum="$quorum,file.children.2.file.filename=$TEST_DIR/3.raw"
58
44
+quorum="$quorum,file.children.2.driver=raw"
59
-Testing: -drive driver=null-co,cache=directsync
45
+
60
+Testing: -drive driver=null-co,read-zeroes=on,cache=directsync
46
+$QEMU_IO -c "open -o $quorum" | _filter_qemu_io
61
QEMU X.Y.Z monitor - type 'help' for more information
47
+
62
(qemu) quit
63
64
-Testing: -drive driver=null-co,cache=writeback
65
+Testing: -drive driver=null-co,read-zeroes=on,cache=writeback
66
QEMU X.Y.Z monitor - type 'help' for more information
67
(qemu) quit
68
69
-Testing: -drive driver=null-co,cache=writethrough
70
+Testing: -drive driver=null-co,read-zeroes=on,cache=writethrough
71
QEMU X.Y.Z monitor - type 'help' for more information
72
(qemu) quit
73
74
-Testing: -drive driver=null-co,cache=unsafe
75
+Testing: -drive driver=null-co,read-zeroes=on,cache=unsafe
76
QEMU X.Y.Z monitor - type 'help' for more information
77
(qemu) quit
78
79
diff --git a/tests/qemu-iotests/093 b/tests/qemu-iotests/093
80
index XXXXXXX..XXXXXXX 100755
81
--- a/tests/qemu-iotests/093
82
+++ b/tests/qemu-iotests/093
83
@@ -XXX,XX +XXX,XX @@ class ThrottleTestCase(iotests.QMPTestCase):
84
def setUp(self):
85
self.vm = iotests.VM()
86
for i in range(0, self.max_drives):
87
- self.vm.add_drive(self.test_img)
88
+ self.vm.add_drive(self.test_img, "file.read-zeroes=on")
89
self.vm.launch()
90
91
def tearDown(self):
92
@@ -XXX,XX +XXX,XX @@ class ThrottleTestGroupNames(iotests.QMPTestCase):
93
def setUp(self):
94
self.vm = iotests.VM()
95
for i in range(0, self.max_drives):
96
- self.vm.add_drive(self.test_img, "throttling.iops-total=100")
97
+ self.vm.add_drive(self.test_img,
98
+ "throttling.iops-total=100,file.read-zeroes=on")
99
self.vm.launch()
100
101
def tearDown(self):
102
@@ -XXX,XX +XXX,XX @@ class ThrottleTestRemovableMedia(iotests.QMPTestCase):
103
def test_removable_media(self):
104
# Add a couple of dummy nodes named cd0 and cd1
105
result = self.vm.qmp("blockdev-add", driver="null-aio",
106
- node_name="cd0")
107
+ read_zeroes=True, node_name="cd0")
108
self.assert_qmp(result, 'return', {})
109
result = self.vm.qmp("blockdev-add", driver="null-aio",
110
- node_name="cd1")
111
+ read_zeroes=True, node_name="cd1")
112
self.assert_qmp(result, 'return', {})
113
114
# Attach a CD drive with cd0 inserted
115
diff --git a/tests/qemu-iotests/136 b/tests/qemu-iotests/136
116
index XXXXXXX..XXXXXXX 100755
117
--- a/tests/qemu-iotests/136
118
+++ b/tests/qemu-iotests/136
119
@@ -XXX,XX +XXX,XX @@ sector = "%d"
120
(self.account_invalid and "on" or "off"))
121
drive_args.append("stats-account-failed=%s" %
122
(self.account_failed and "on" or "off"))
123
+ drive_args.append("file.image.read-zeroes=on")
124
self.create_blkdebug_file()
125
self.vm = iotests.VM().add_drive('blkdebug:%s:%s' %
126
(blkdebug_file, self.test_img),
127
diff --git a/tests/qemu-iotests/186 b/tests/qemu-iotests/186
128
index XXXXXXX..XXXXXXX 100755
129
--- a/tests/qemu-iotests/186
130
+++ b/tests/qemu-iotests/186
131
@@ -XXX,XX +XXX,XX @@ echo "=== -blockdev/-device=<node-name> ==="
132
echo
133
134
for dev in $fixed $removable; do
135
- check_info_block -blockdev driver=null-co,node-name=null -device $dev,drive=null
136
- check_info_block -blockdev driver=null-co,node-name=null -device $dev,drive=null,id=qdev_id
137
+ check_info_block -blockdev driver=null-co,read-zeroes=on,node-name=null -device $dev,drive=null
138
+ check_info_block -blockdev driver=null-co,read-zeroes=on,node-name=null -device $dev,drive=null,id=qdev_id
139
done
140
141
echo
142
@@ -XXX,XX +XXX,XX @@ echo
143
# This creates two BlockBackends that will show up in 'info block'!
144
# A monitor-owned one from -drive, and anonymous one from -device
145
for dev in $fixed $removable; do
146
- check_info_block -drive if=none,driver=null-co,node-name=null -device $dev,drive=null,id=qdev_id
147
+ check_info_block -drive if=none,driver=null-co,read-zeroes=on,node-name=null -device $dev,drive=null,id=qdev_id
148
done
149
150
echo
151
@@ -XXX,XX +XXX,XX @@ echo "=== -drive if=none/-device=<bb-name> (with medium) ==="
152
echo
153
154
for dev in $fixed $removable; do
155
- check_info_block -drive if=none,driver=null-co,node-name=null -device $dev,drive=none0
156
- check_info_block -drive if=none,driver=null-co,node-name=null -device $dev,drive=none0,id=qdev_id
157
+ check_info_block -drive if=none,driver=null-co,read-zeroes=on,node-name=null -device $dev,drive=none0
158
+ check_info_block -drive if=none,driver=null-co,read-zeroes=on,node-name=null -device $dev,drive=none0,id=qdev_id
159
done
160
161
echo
162
@@ -XXX,XX +XXX,XX @@ echo "=== -drive if=... ==="
163
echo
164
165
check_info_block -drive if=floppy
166
-check_info_block -drive if=floppy,driver=null-co
167
+check_info_block -drive if=floppy,driver=null-co,read-zeroes=on
168
169
-check_info_block -drive if=ide,driver=null-co
170
+check_info_block -drive if=ide,driver=null-co,read-zeroes=on
171
check_info_block -drive if=ide,media=cdrom
172
-check_info_block -drive if=ide,driver=null-co,media=cdrom
173
+check_info_block -drive if=ide,driver=null-co,read-zeroes=on,media=cdrom
174
175
-check_info_block -drive if=virtio,driver=null-co
176
+check_info_block -drive if=virtio,driver=null-co,read-zeroes=on
177
178
-check_info_block -drive if=pflash,driver=null-co,size=1M
179
+check_info_block -drive if=pflash,driver=null-co,read-zeroes=on,size=1M
180
48
# success, all done
181
# success, all done
49
echo "*** done"
182
echo "*** done"
50
rm -f $seq.full
183
diff --git a/tests/qemu-iotests/186.out b/tests/qemu-iotests/186.out
51
diff --git a/tests/qemu-iotests/081.out b/tests/qemu-iotests/081.out
52
index XXXXXXX..XXXXXXX 100644
184
index XXXXXXX..XXXXXXX 100644
53
--- a/tests/qemu-iotests/081.out
185
--- a/tests/qemu-iotests/186.out
54
+++ b/tests/qemu-iotests/081.out
186
+++ b/tests/qemu-iotests/186.out
55
@@ -XXX,XX +XXX,XX @@ wrote 10485760/10485760 bytes at offset 0
187
@@ -XXX,XX +XXX,XX @@ qdev_id: [not inserted]
56
188
57
== checking that quorum is broken ==
189
=== -blockdev/-device=<node-name> ===
58
read failed: Input/output error
190
59
+
191
-Testing: -blockdev driver=null-co,node-name=null -device ide-hd,drive=null
60
+== checking the blkverify mode with broken content ==
192
+Testing: -blockdev driver=null-co,read-zeroes=on,node-name=null -device ide-hd,drive=null
61
+quorum: offset=0 bytes=10485760 contents mismatch at offset 0
193
QEMU X.Y.Z monitor - type 'help' for more information
62
+
194
(qemu) info block
63
+== writing the same data to both files ==
195
-null: null-co:// (null-co)
64
+wrote 10485760/10485760 bytes at offset 0
196
+null: json:{"read-zeroes": true, "driver": "null-co"} (null-co)
65
+10 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
197
Attached to: PATH
66
+wrote 10485760/10485760 bytes at offset 0
198
Cache mode: writeback
67
+10 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
199
(qemu) quit
68
+
200
69
+== checking the blkverify mode with valid content ==
201
-Testing: -blockdev driver=null-co,node-name=null -device ide-hd,drive=null,id=qdev_id
70
+read 10485760/10485760 bytes at offset 0
202
+Testing: -blockdev driver=null-co,read-zeroes=on,node-name=null -device ide-hd,drive=null,id=qdev_id
71
+10 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
203
QEMU X.Y.Z monitor - type 'help' for more information
72
+
204
(qemu) info block
73
+== checking the blkverify mode with invalid settings ==
205
-null: null-co:// (null-co)
74
+can't open: blkverify=on can only be set if there are exactly two files and vote-threshold is 2
206
+null: json:{"read-zeroes": true, "driver": "null-co"} (null-co)
75
*** done
207
Attached to: qdev_id
208
Cache mode: writeback
209
(qemu) quit
210
211
-Testing: -blockdev driver=null-co,node-name=null -device scsi-hd,drive=null
212
+Testing: -blockdev driver=null-co,read-zeroes=on,node-name=null -device scsi-hd,drive=null
213
QEMU X.Y.Z monitor - type 'help' for more information
214
(qemu) info block
215
-null: null-co:// (null-co)
216
+null: json:{"read-zeroes": true, "driver": "null-co"} (null-co)
217
Attached to: PATH
218
Cache mode: writeback
219
(qemu) quit
220
221
-Testing: -blockdev driver=null-co,node-name=null -device scsi-hd,drive=null,id=qdev_id
222
+Testing: -blockdev driver=null-co,read-zeroes=on,node-name=null -device scsi-hd,drive=null,id=qdev_id
223
QEMU X.Y.Z monitor - type 'help' for more information
224
(qemu) info block
225
-null: null-co:// (null-co)
226
+null: json:{"read-zeroes": true, "driver": "null-co"} (null-co)
227
Attached to: qdev_id
228
Cache mode: writeback
229
(qemu) quit
230
231
-Testing: -blockdev driver=null-co,node-name=null -device virtio-blk-pci,drive=null
232
+Testing: -blockdev driver=null-co,read-zeroes=on,node-name=null -device virtio-blk-pci,drive=null
233
QEMU X.Y.Z monitor - type 'help' for more information
234
(qemu) info block
235
-null: null-co:// (null-co)
236
+null: json:{"read-zeroes": true, "driver": "null-co"} (null-co)
237
Attached to: PATH
238
Cache mode: writeback
239
(qemu) quit
240
241
-Testing: -blockdev driver=null-co,node-name=null -device virtio-blk-pci,drive=null,id=qdev_id
242
+Testing: -blockdev driver=null-co,read-zeroes=on,node-name=null -device virtio-blk-pci,drive=null,id=qdev_id
243
QEMU X.Y.Z monitor - type 'help' for more information
244
(qemu) info block
245
-null: null-co:// (null-co)
246
+null: json:{"read-zeroes": true, "driver": "null-co"} (null-co)
247
Attached to: PATH
248
Cache mode: writeback
249
(qemu) quit
250
251
-Testing: -blockdev driver=null-co,node-name=null -device floppy,drive=null
252
+Testing: -blockdev driver=null-co,read-zeroes=on,node-name=null -device floppy,drive=null
253
QEMU X.Y.Z monitor - type 'help' for more information
254
(qemu) info block
255
-null: null-co:// (null-co)
256
+null: json:{"read-zeroes": true, "driver": "null-co"} (null-co)
257
Attached to: PATH
258
Removable device: not locked, tray closed
259
Cache mode: writeback
260
(qemu) quit
261
262
-Testing: -blockdev driver=null-co,node-name=null -device floppy,drive=null,id=qdev_id
263
+Testing: -blockdev driver=null-co,read-zeroes=on,node-name=null -device floppy,drive=null,id=qdev_id
264
QEMU X.Y.Z monitor - type 'help' for more information
265
(qemu) info block
266
-null: null-co:// (null-co)
267
+null: json:{"read-zeroes": true, "driver": "null-co"} (null-co)
268
Attached to: qdev_id
269
Removable device: not locked, tray closed
270
Cache mode: writeback
271
(qemu) quit
272
273
-Testing: -blockdev driver=null-co,node-name=null -device ide-cd,drive=null
274
+Testing: -blockdev driver=null-co,read-zeroes=on,node-name=null -device ide-cd,drive=null
275
QEMU X.Y.Z monitor - type 'help' for more information
276
(qemu) info block
277
-null: null-co:// (null-co)
278
+null: json:{"read-zeroes": true, "driver": "null-co"} (null-co)
279
Attached to: PATH
280
Removable device: not locked, tray closed
281
Cache mode: writeback
282
(qemu) quit
283
284
-Testing: -blockdev driver=null-co,node-name=null -device ide-cd,drive=null,id=qdev_id
285
+Testing: -blockdev driver=null-co,read-zeroes=on,node-name=null -device ide-cd,drive=null,id=qdev_id
286
QEMU X.Y.Z monitor - type 'help' for more information
287
(qemu) info block
288
-null: null-co:// (null-co)
289
+null: json:{"read-zeroes": true, "driver": "null-co"} (null-co)
290
Attached to: qdev_id
291
Removable device: not locked, tray closed
292
Cache mode: writeback
293
(qemu) quit
294
295
-Testing: -blockdev driver=null-co,node-name=null -device scsi-cd,drive=null
296
+Testing: -blockdev driver=null-co,read-zeroes=on,node-name=null -device scsi-cd,drive=null
297
QEMU X.Y.Z monitor - type 'help' for more information
298
(qemu) info block
299
-null: null-co:// (null-co)
300
+null: json:{"read-zeroes": true, "driver": "null-co"} (null-co)
301
Attached to: PATH
302
Removable device: not locked, tray closed
303
Cache mode: writeback
304
(qemu) quit
305
306
-Testing: -blockdev driver=null-co,node-name=null -device scsi-cd,drive=null,id=qdev_id
307
+Testing: -blockdev driver=null-co,read-zeroes=on,node-name=null -device scsi-cd,drive=null,id=qdev_id
308
QEMU X.Y.Z monitor - type 'help' for more information
309
(qemu) info block
310
-null: null-co:// (null-co)
311
+null: json:{"read-zeroes": true, "driver": "null-co"} (null-co)
312
Attached to: qdev_id
313
Removable device: not locked, tray closed
314
Cache mode: writeback
315
@@ -XXX,XX +XXX,XX @@ null: null-co:// (null-co)
316
317
=== -drive if=none/-device=<node-name> ===
318
319
-Testing: -drive if=none,driver=null-co,node-name=null -device ide-hd,drive=null,id=qdev_id
320
+Testing: -drive if=none,driver=null-co,read-zeroes=on,node-name=null -device ide-hd,drive=null,id=qdev_id
321
QEMU X.Y.Z monitor - type 'help' for more information
322
(qemu) info block
323
-none0 (null): null-co:// (null-co)
324
+none0 (null): json:{"read-zeroes": "on", "driver": "null-co"} (null-co)
325
Removable device: not locked, tray closed
326
Cache mode: writeback
327
328
-null: null-co:// (null-co)
329
+null: json:{"read-zeroes": "on", "driver": "null-co"} (null-co)
330
Attached to: qdev_id
331
Cache mode: writeback
332
(qemu) quit
333
334
-Testing: -drive if=none,driver=null-co,node-name=null -device scsi-hd,drive=null,id=qdev_id
335
+Testing: -drive if=none,driver=null-co,read-zeroes=on,node-name=null -device scsi-hd,drive=null,id=qdev_id
336
QEMU X.Y.Z monitor - type 'help' for more information
337
(qemu) info block
338
-none0 (null): null-co:// (null-co)
339
+none0 (null): json:{"read-zeroes": "on", "driver": "null-co"} (null-co)
340
Removable device: not locked, tray closed
341
Cache mode: writeback
342
343
-null: null-co:// (null-co)
344
+null: json:{"read-zeroes": "on", "driver": "null-co"} (null-co)
345
Attached to: qdev_id
346
Cache mode: writeback
347
(qemu) quit
348
349
-Testing: -drive if=none,driver=null-co,node-name=null -device virtio-blk-pci,drive=null,id=qdev_id
350
+Testing: -drive if=none,driver=null-co,read-zeroes=on,node-name=null -device virtio-blk-pci,drive=null,id=qdev_id
351
QEMU X.Y.Z monitor - type 'help' for more information
352
(qemu) info block
353
-none0 (null): null-co:// (null-co)
354
+none0 (null): json:{"read-zeroes": "on", "driver": "null-co"} (null-co)
355
Removable device: not locked, tray closed
356
Cache mode: writeback
357
358
-null: null-co:// (null-co)
359
+null: json:{"read-zeroes": "on", "driver": "null-co"} (null-co)
360
Attached to: PATH
361
Cache mode: writeback
362
(qemu) quit
363
364
-Testing: -drive if=none,driver=null-co,node-name=null -device floppy,drive=null,id=qdev_id
365
+Testing: -drive if=none,driver=null-co,read-zeroes=on,node-name=null -device floppy,drive=null,id=qdev_id
366
QEMU X.Y.Z monitor - type 'help' for more information
367
(qemu) info block
368
-none0 (null): null-co:// (null-co)
369
+none0 (null): json:{"read-zeroes": "on", "driver": "null-co"} (null-co)
370
Removable device: not locked, tray closed
371
Cache mode: writeback
372
373
-null: null-co:// (null-co)
374
+null: json:{"read-zeroes": "on", "driver": "null-co"} (null-co)
375
Attached to: qdev_id
376
Removable device: not locked, tray closed
377
Cache mode: writeback
378
(qemu) quit
379
380
-Testing: -drive if=none,driver=null-co,node-name=null -device ide-cd,drive=null,id=qdev_id
381
+Testing: -drive if=none,driver=null-co,read-zeroes=on,node-name=null -device ide-cd,drive=null,id=qdev_id
382
QEMU X.Y.Z monitor - type 'help' for more information
383
(qemu) info block
384
-none0 (null): null-co:// (null-co)
385
+none0 (null): json:{"read-zeroes": "on", "driver": "null-co"} (null-co)
386
Removable device: not locked, tray closed
387
Cache mode: writeback
388
389
-null: null-co:// (null-co)
390
+null: json:{"read-zeroes": "on", "driver": "null-co"} (null-co)
391
Attached to: qdev_id
392
Removable device: not locked, tray closed
393
Cache mode: writeback
394
(qemu) quit
395
396
-Testing: -drive if=none,driver=null-co,node-name=null -device scsi-cd,drive=null,id=qdev_id
397
+Testing: -drive if=none,driver=null-co,read-zeroes=on,node-name=null -device scsi-cd,drive=null,id=qdev_id
398
QEMU X.Y.Z monitor - type 'help' for more information
399
(qemu) info block
400
-none0 (null): null-co:// (null-co)
401
+none0 (null): json:{"read-zeroes": "on", "driver": "null-co"} (null-co)
402
Removable device: not locked, tray closed
403
Cache mode: writeback
404
405
-null: null-co:// (null-co)
406
+null: json:{"read-zeroes": "on", "driver": "null-co"} (null-co)
407
Attached to: qdev_id
408
Removable device: not locked, tray closed
409
Cache mode: writeback
410
@@ -XXX,XX +XXX,XX @@ null: null-co:// (null-co)
411
412
=== -drive if=none/-device=<bb-name> (with medium) ===
413
414
-Testing: -drive if=none,driver=null-co,node-name=null -device ide-hd,drive=none0
415
+Testing: -drive if=none,driver=null-co,read-zeroes=on,node-name=null -device ide-hd,drive=none0
416
QEMU X.Y.Z monitor - type 'help' for more information
417
(qemu) info block
418
-none0 (null): null-co:// (null-co)
419
+none0 (null): json:{"read-zeroes": "on", "driver": "null-co"} (null-co)
420
Attached to: PATH
421
Cache mode: writeback
422
(qemu) quit
423
424
-Testing: -drive if=none,driver=null-co,node-name=null -device ide-hd,drive=none0,id=qdev_id
425
+Testing: -drive if=none,driver=null-co,read-zeroes=on,node-name=null -device ide-hd,drive=none0,id=qdev_id
426
QEMU X.Y.Z monitor - type 'help' for more information
427
(qemu) info block
428
-none0 (null): null-co:// (null-co)
429
+none0 (null): json:{"read-zeroes": "on", "driver": "null-co"} (null-co)
430
Attached to: qdev_id
431
Cache mode: writeback
432
(qemu) quit
433
434
-Testing: -drive if=none,driver=null-co,node-name=null -device scsi-hd,drive=none0
435
+Testing: -drive if=none,driver=null-co,read-zeroes=on,node-name=null -device scsi-hd,drive=none0
436
QEMU X.Y.Z monitor - type 'help' for more information
437
(qemu) info block
438
-none0 (null): null-co:// (null-co)
439
+none0 (null): json:{"read-zeroes": "on", "driver": "null-co"} (null-co)
440
Attached to: PATH
441
Cache mode: writeback
442
(qemu) quit
443
444
-Testing: -drive if=none,driver=null-co,node-name=null -device scsi-hd,drive=none0,id=qdev_id
445
+Testing: -drive if=none,driver=null-co,read-zeroes=on,node-name=null -device scsi-hd,drive=none0,id=qdev_id
446
QEMU X.Y.Z monitor - type 'help' for more information
447
(qemu) info block
448
-none0 (null): null-co:// (null-co)
449
+none0 (null): json:{"read-zeroes": "on", "driver": "null-co"} (null-co)
450
Attached to: qdev_id
451
Cache mode: writeback
452
(qemu) quit
453
454
-Testing: -drive if=none,driver=null-co,node-name=null -device virtio-blk-pci,drive=none0
455
+Testing: -drive if=none,driver=null-co,read-zeroes=on,node-name=null -device virtio-blk-pci,drive=none0
456
QEMU X.Y.Z monitor - type 'help' for more information
457
(qemu) info block
458
-none0 (null): null-co:// (null-co)
459
+none0 (null): json:{"read-zeroes": "on", "driver": "null-co"} (null-co)
460
Attached to: PATH
461
Cache mode: writeback
462
(qemu) quit
463
464
-Testing: -drive if=none,driver=null-co,node-name=null -device virtio-blk-pci,drive=none0,id=qdev_id
465
+Testing: -drive if=none,driver=null-co,read-zeroes=on,node-name=null -device virtio-blk-pci,drive=none0,id=qdev_id
466
QEMU X.Y.Z monitor - type 'help' for more information
467
(qemu) info block
468
-none0 (null): null-co:// (null-co)
469
+none0 (null): json:{"read-zeroes": "on", "driver": "null-co"} (null-co)
470
Attached to: PATH
471
Cache mode: writeback
472
(qemu) quit
473
474
-Testing: -drive if=none,driver=null-co,node-name=null -device floppy,drive=none0
475
+Testing: -drive if=none,driver=null-co,read-zeroes=on,node-name=null -device floppy,drive=none0
476
QEMU X.Y.Z monitor - type 'help' for more information
477
(qemu) info block
478
-none0 (null): null-co:// (null-co)
479
+none0 (null): json:{"read-zeroes": "on", "driver": "null-co"} (null-co)
480
Attached to: PATH
481
Removable device: not locked, tray closed
482
Cache mode: writeback
483
(qemu) quit
484
485
-Testing: -drive if=none,driver=null-co,node-name=null -device floppy,drive=none0,id=qdev_id
486
+Testing: -drive if=none,driver=null-co,read-zeroes=on,node-name=null -device floppy,drive=none0,id=qdev_id
487
QEMU X.Y.Z monitor - type 'help' for more information
488
(qemu) info block
489
-none0 (null): null-co:// (null-co)
490
+none0 (null): json:{"read-zeroes": "on", "driver": "null-co"} (null-co)
491
Attached to: qdev_id
492
Removable device: not locked, tray closed
493
Cache mode: writeback
494
(qemu) quit
495
496
-Testing: -drive if=none,driver=null-co,node-name=null -device ide-cd,drive=none0
497
+Testing: -drive if=none,driver=null-co,read-zeroes=on,node-name=null -device ide-cd,drive=none0
498
QEMU X.Y.Z monitor - type 'help' for more information
499
(qemu) info block
500
-none0 (null): null-co:// (null-co)
501
+none0 (null): json:{"read-zeroes": "on", "driver": "null-co"} (null-co)
502
Attached to: PATH
503
Removable device: not locked, tray closed
504
Cache mode: writeback
505
(qemu) quit
506
507
-Testing: -drive if=none,driver=null-co,node-name=null -device ide-cd,drive=none0,id=qdev_id
508
+Testing: -drive if=none,driver=null-co,read-zeroes=on,node-name=null -device ide-cd,drive=none0,id=qdev_id
509
QEMU X.Y.Z monitor - type 'help' for more information
510
(qemu) info block
511
-none0 (null): null-co:// (null-co)
512
+none0 (null): json:{"read-zeroes": "on", "driver": "null-co"} (null-co)
513
Attached to: qdev_id
514
Removable device: not locked, tray closed
515
Cache mode: writeback
516
(qemu) quit
517
518
-Testing: -drive if=none,driver=null-co,node-name=null -device scsi-cd,drive=none0
519
+Testing: -drive if=none,driver=null-co,read-zeroes=on,node-name=null -device scsi-cd,drive=none0
520
QEMU X.Y.Z monitor - type 'help' for more information
521
(qemu) info block
522
-none0 (null): null-co:// (null-co)
523
+none0 (null): json:{"read-zeroes": "on", "driver": "null-co"} (null-co)
524
Attached to: PATH
525
Removable device: not locked, tray closed
526
Cache mode: writeback
527
(qemu) quit
528
529
-Testing: -drive if=none,driver=null-co,node-name=null -device scsi-cd,drive=none0,id=qdev_id
530
+Testing: -drive if=none,driver=null-co,read-zeroes=on,node-name=null -device scsi-cd,drive=none0,id=qdev_id
531
QEMU X.Y.Z monitor - type 'help' for more information
532
(qemu) info block
533
-none0 (null): null-co:// (null-co)
534
+none0 (null): json:{"read-zeroes": "on", "driver": "null-co"} (null-co)
535
Attached to: qdev_id
536
Removable device: not locked, tray closed
537
Cache mode: writeback
538
@@ -XXX,XX +XXX,XX @@ floppy0: [not inserted]
539
Removable device: not locked, tray closed
540
(qemu) quit
541
542
-Testing: -drive if=floppy,driver=null-co
543
+Testing: -drive if=floppy,driver=null-co,read-zeroes=on
544
QEMU X.Y.Z monitor - type 'help' for more information
545
(qemu) info block
546
-floppy0 (NODE_NAME): null-co:// (null-co)
547
+floppy0 (NODE_NAME): json:{"read-zeroes": "on", "driver": "null-co"} (null-co)
548
Attached to: PATH
549
Removable device: not locked, tray closed
550
Cache mode: writeback
551
(qemu) quit
552
553
-Testing: -drive if=ide,driver=null-co
554
+Testing: -drive if=ide,driver=null-co,read-zeroes=on
555
QEMU X.Y.Z monitor - type 'help' for more information
556
(qemu) info block
557
-ide0-hd0 (NODE_NAME): null-co:// (null-co)
558
+ide0-hd0 (NODE_NAME): json:{"read-zeroes": "on", "driver": "null-co"} (null-co)
559
Attached to: PATH
560
Cache mode: writeback
561
(qemu) quit
562
@@ -XXX,XX +XXX,XX @@ ide0-cd0: [not inserted]
563
Removable device: not locked, tray closed
564
(qemu) quit
565
566
-Testing: -drive if=ide,driver=null-co,media=cdrom
567
+Testing: -drive if=ide,driver=null-co,read-zeroes=on,media=cdrom
568
QEMU X.Y.Z monitor - type 'help' for more information
569
(qemu) info block
570
-ide0-cd0 (NODE_NAME): null-co:// (null-co, read-only)
571
+ide0-cd0 (NODE_NAME): json:{"read-zeroes": "on", "driver": "null-co"} (null-co, read-only)
572
Attached to: PATH
573
Removable device: not locked, tray closed
574
Cache mode: writeback
575
(qemu) quit
576
577
-Testing: -drive if=virtio,driver=null-co
578
+Testing: -drive if=virtio,driver=null-co,read-zeroes=on
579
QEMU X.Y.Z monitor - type 'help' for more information
580
(qemu) info block
581
-virtio0 (NODE_NAME): null-co:// (null-co)
582
+virtio0 (NODE_NAME): json:{"read-zeroes": "on", "driver": "null-co"} (null-co)
583
Attached to: PATH
584
Cache mode: writeback
585
(qemu) quit
586
587
-Testing: -drive if=pflash,driver=null-co,size=1M
588
+Testing: -drive if=pflash,driver=null-co,read-zeroes=on,size=1M
589
QEMU X.Y.Z monitor - type 'help' for more information
590
(qemu) info block
591
-pflash0 (NODE_NAME): json:{"driver": "null-co", "size": "1M"} (null-co)
592
+pflash0 (NODE_NAME): json:{"read-zeroes": "on", "driver": "null-co", "size": "1M"} (null-co)
593
Attached to: PATH
594
Cache mode: writeback
595
(qemu) quit
596
diff --git a/tests/qemu-iotests/227 b/tests/qemu-iotests/227
597
index XXXXXXX..XXXXXXX 100755
598
--- a/tests/qemu-iotests/227
599
+++ b/tests/qemu-iotests/227
600
@@ -XXX,XX +XXX,XX @@ echo
601
echo '=== blockstats with -drive if=virtio ==='
602
echo
603
604
-run_qemu -drive driver=null-co,if=virtio <<EOF
605
+run_qemu -drive driver=null-co,read-zeroes=on,if=virtio <<EOF
606
{ "execute": "qmp_capabilities" }
607
{ "execute": "query-blockstats"}
608
{ "execute": "quit" }
609
@@ -XXX,XX +XXX,XX @@ echo
610
echo '=== blockstats with -blockdev and -device ==='
611
echo
612
613
-run_qemu -blockdev driver=null-co,node-name=null -device virtio-blk,drive=null,id=virtio0 <<EOF
614
+run_qemu -blockdev driver=null-co,read-zeroes=on,node-name=null -device virtio-blk,drive=null,id=virtio0 <<EOF
615
{ "execute": "qmp_capabilities" }
616
{ "execute": "query-blockstats"}
617
{ "execute": "quit" }
618
diff --git a/tests/qemu-iotests/227.out b/tests/qemu-iotests/227.out
619
index XXXXXXX..XXXXXXX 100644
620
--- a/tests/qemu-iotests/227.out
621
+++ b/tests/qemu-iotests/227.out
622
@@ -XXX,XX +XXX,XX @@ QA output created by 227
623
624
=== blockstats with -drive if=virtio ===
625
626
-Testing: -drive driver=null-co,if=virtio
627
+Testing: -drive driver=null-co,read-zeroes=on,if=virtio
628
{
629
QMP_VERSION
630
}
631
@@ -XXX,XX +XXX,XX @@ Testing: -blockdev driver=null-co,node-name=null
632
633
=== blockstats with -blockdev and -device ===
634
635
-Testing: -blockdev driver=null-co,node-name=null -device virtio-blk,drive=null,id=virtio0
636
+Testing: -blockdev driver=null-co,read-zeroes=on,node-name=null -device virtio-blk,drive=null,id=virtio0
637
{
638
QMP_VERSION
639
}
640
diff --git a/tests/qemu-iotests/238 b/tests/qemu-iotests/238
641
index XXXXXXX..XXXXXXX 100755
642
--- a/tests/qemu-iotests/238
643
+++ b/tests/qemu-iotests/238
644
@@ -XXX,XX +XXX,XX @@ else:
645
vm = iotests.VM()
646
vm.launch()
647
648
-log(vm.qmp('blockdev-add', node_name='hd0', driver='null-co'))
649
+log(vm.qmp('blockdev-add', node_name='hd0', driver='null-co', read_zeroes=True))
650
log(vm.qmp('object-add', qom_type='iothread', id='iothread0'))
651
log(vm.qmp('device_add', id='scsi0', driver=virtio_scsi_device, iothread='iothread0'))
652
log(vm.qmp('device_add', id='scsi-hd0', driver='scsi-hd', drive='hd0'))
653
diff --git a/tests/qemu-iotests/240 b/tests/qemu-iotests/240
654
index XXXXXXX..XXXXXXX 100755
655
--- a/tests/qemu-iotests/240
656
+++ b/tests/qemu-iotests/240
657
@@ -XXX,XX +XXX,XX @@ echo
658
659
run_qemu <<EOF
660
{ "execute": "qmp_capabilities" }
661
-{ "execute": "blockdev-add", "arguments": {"driver": "null-co", "node-name": "hd0"}}
662
+{ "execute": "blockdev-add", "arguments": {"driver": "null-co", "read-zeroes": true, "node-name": "hd0"}}
663
{ "execute": "object-add", "arguments": {"qom-type": "iothread", "id": "iothread0"}}
664
{ "execute": "device_add", "arguments": {"id": "scsi0", "driver": "${virtio_scsi}", "iothread": "iothread0"}}
665
{ "execute": "device_add", "arguments": {"id": "scsi-hd0", "driver": "scsi-hd", "drive": "hd0"}}
666
@@ -XXX,XX +XXX,XX @@ echo
667
668
run_qemu <<EOF
669
{ "execute": "qmp_capabilities" }
670
-{ "execute": "blockdev-add", "arguments": {"driver": "null-co", "node-name": "hd0", "read-only": true}}
671
+{ "execute": "blockdev-add", "arguments": {"driver": "null-co", "read-zeroes": true, "node-name": "hd0", "read-only": true}}
672
{ "execute": "object-add", "arguments": {"qom-type": "iothread", "id": "iothread0"}}
673
{ "execute": "device_add", "arguments": {"id": "scsi0", "driver": "${virtio_scsi}", "iothread": "iothread0"}}
674
{ "execute": "device_add", "arguments": {"id": "scsi-hd0", "driver": "scsi-hd", "drive": "hd0"}}
675
@@ -XXX,XX +XXX,XX @@ echo
676
677
run_qemu <<EOF
678
{ "execute": "qmp_capabilities" }
679
-{ "execute": "blockdev-add", "arguments": {"driver": "null-co", "node-name": "hd0", "read-only": true}}
680
+{ "execute": "blockdev-add", "arguments": {"driver": "null-co", "read-zeroes": true, "node-name": "hd0", "read-only": true}}
681
{ "execute": "object-add", "arguments": {"qom-type": "iothread", "id": "iothread0"}}
682
{ "execute": "object-add", "arguments": {"qom-type": "iothread", "id": "iothread1"}}
683
{ "execute": "device_add", "arguments": {"id": "scsi0", "driver": "${virtio_scsi}", "iothread": "iothread0"}}
684
@@ -XXX,XX +XXX,XX @@ echo
685
686
run_qemu <<EOF
687
{ "execute": "qmp_capabilities" }
688
-{ "execute": "blockdev-add", "arguments": {"driver": "null-co", "node-name": "hd0", "read-only": true}}
689
+{ "execute": "blockdev-add", "arguments": {"driver": "null-co", "read-zeroes": true, "node-name": "hd0", "read-only": true}}
690
{ "execute": "nbd-server-start", "arguments": {"addr":{"type":"unix","data":{"path":"$TEST_DIR/nbd"}}}}
691
{ "execute": "nbd-server-add", "arguments": {"device":"hd0"}}
692
{ "execute": "object-add", "arguments": {"qom-type": "iothread", "id": "iothread0"}}
76
--
693
--
77
2.19.1
694
2.20.1
78
695
79
696
diff view generated by jsdifflib
1
Some block drivers have traditionally changed their node to read-only
1
From: Max Reitz <mreitz@redhat.com>
2
mode without asking the user. This behaviour has been marked deprecated
3
since 2.11, expecting users to provide an explicit read-only=on option.
4
2
5
Now that we have auto-read-only=on, enable these drivers to make use of
3
Commit 5cb2737e925042e6c7cd3fb0b01313950b03cddf laid out why
6
the option.
4
bdrv_do_drained_end() must decrement the quiesce_counter after
5
bdrv_drain_invoke(). It did not give a very good reason why it has to
6
happen after bdrv_parent_drained_end(), instead only claiming symmetry
7
to bdrv_do_drained_begin().
7
8
8
This is the only use of bdrv_set_read_only(), so we can make it a bit
9
It turns out that delaying it for so long is wrong.
9
more specific and turn it into a bdrv_apply_auto_read_only() that is
10
more convenient for drivers to use.
11
10
11
Situation: We have an active commit job (i.e. a mirror job) from top to
12
base for the following graph:
13
14
filter
15
|
16
[file]
17
|
18
v
19
top --[backing]--> base
20
21
Now the VM is closed, which results in the job being cancelled and a
22
bdrv_drain_all() happening pretty much simultaneously.
23
24
Beginning the drain means the job is paused once whenever one of its
25
nodes is quiesced. This is reversed when the drain ends.
26
27
With how the code currently is, after base's drain ends (which means
28
that it will have unpaused the job once), its quiesce_counter remains at
29
1 while it goes to undrain its parents (bdrv_parent_drained_end()). For
30
some reason or another, undraining filter causes the job to be kicked
31
and enter mirror_exit_common(), where it proceeds to invoke
32
block_job_remove_all_bdrv().
33
34
Now base will be detached from the job. Because its quiesce_counter is
35
still 1, it will unpause the job once more. So in total, undraining
36
base will unpause the job twice. Eventually, this will lead to the
37
job's pause_count going negative -- well, it would, were there not an
38
assertion against this, which crashes qemu.
39
40
The general problem is that if in bdrv_parent_drained_end() we undrain
41
parent A, and then undrain parent B, which then leads to A detaching the
42
child, bdrv_replace_child_noperm() will undrain A as if we had not done
43
so yet; that is, one time too many.
44
45
It follows that we cannot decrement the quiesce_counter after invoking
46
bdrv_parent_drained_end().
47
48
Unfortunately, decrementing it before bdrv_parent_drained_end() would be
49
wrong, too. Imagine the above situation in reverse: Undraining A leads
50
to B detaching the child. If we had already decremented the
51
quiesce_counter by that point, bdrv_replace_child_noperm() would undrain
52
B one time too little; because it expects bdrv_parent_drained_end() to
53
issue this undrain. But bdrv_parent_drained_end() won't do that,
54
because B is no longer a parent.
55
56
Therefore, we have to do something else. This patch opts for
57
introducing a second quiesce_counter that counts how many times a
58
child's parent has been quiesced (though c->role->drained_*). With
59
that, bdrv_replace_child_noperm() just has to undrain the parent exactly
60
that many times when removing a child, and it will always be right.
61
62
Signed-off-by: Max Reitz <mreitz@redhat.com>
12
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
63
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
13
Reviewed-by: Eric Blake <eblake@redhat.com>
14
---
64
---
15
include/block/block.h | 3 ++-
65
include/block/block.h | 7 +++++++
16
block.c | 42 +++++++++++++++++++++++++++---------------
66
include/block/block_int.h | 9 +++++++++
17
block/bochs.c | 17 ++++++-----------
67
block.c | 15 +++++----------
18
block/cloop.c | 16 +++++-----------
68
block/io.c | 14 +++++++++++---
19
block/dmg.c | 16 +++++-----------
69
4 files changed, 32 insertions(+), 13 deletions(-)
20
block/rbd.c | 15 ++++-----------
21
block/vvfat.c | 10 ++--------
22
7 files changed, 51 insertions(+), 68 deletions(-)
23
70
24
diff --git a/include/block/block.h b/include/block/block.h
71
diff --git a/include/block/block.h b/include/block/block.h
25
index XXXXXXX..XXXXXXX 100644
72
index XXXXXXX..XXXXXXX 100644
26
--- a/include/block/block.h
73
--- a/include/block/block.h
27
+++ b/include/block/block.h
74
+++ b/include/block/block.h
28
@@ -XXX,XX +XXX,XX @@ int bdrv_is_allocated_above(BlockDriverState *top, BlockDriverState *base,
75
@@ -XXX,XX +XXX,XX @@ void bdrv_parent_drained_begin(BlockDriverState *bs, BdrvChild *ignore,
29
bool bdrv_is_read_only(BlockDriverState *bs);
76
*/
30
int bdrv_can_set_read_only(BlockDriverState *bs, bool read_only,
77
void bdrv_parent_drained_begin_single(BdrvChild *c, bool poll);
31
bool ignore_allow_rdw, Error **errp);
78
32
-int bdrv_set_read_only(BlockDriverState *bs, bool read_only, Error **errp);
79
+/**
33
+int bdrv_apply_auto_read_only(BlockDriverState *bs, const char *errmsg,
80
+ * bdrv_parent_drained_end_single:
34
+ Error **errp);
81
+ *
35
bool bdrv_is_writable(BlockDriverState *bs);
82
+ * End a quiesced section for the parent of @c.
36
bool bdrv_is_sg(BlockDriverState *bs);
83
+ */
37
bool bdrv_is_inserted(BlockDriverState *bs);
84
+void bdrv_parent_drained_end_single(BdrvChild *c);
85
+
86
/**
87
* bdrv_parent_drained_end:
88
*
89
diff --git a/include/block/block_int.h b/include/block/block_int.h
90
index XXXXXXX..XXXXXXX 100644
91
--- a/include/block/block_int.h
92
+++ b/include/block/block_int.h
93
@@ -XXX,XX +XXX,XX @@ struct BdrvChild {
94
*/
95
bool frozen;
96
97
+ /*
98
+ * How many times the parent of this child has been drained
99
+ * (through role->drained_*).
100
+ * Usually, this is equal to bs->quiesce_counter (potentially
101
+ * reduced by bdrv_drain_all_count). It may differ while the
102
+ * child is entering or leaving a drained section.
103
+ */
104
+ int parent_quiesce_counter;
105
+
106
QLIST_ENTRY(BdrvChild) next;
107
QLIST_ENTRY(BdrvChild) next_parent;
108
};
38
diff --git a/block.c b/block.c
109
diff --git a/block.c b/block.c
39
index XXXXXXX..XXXXXXX 100644
110
index XXXXXXX..XXXXXXX 100644
40
--- a/block.c
111
--- a/block.c
41
+++ b/block.c
112
+++ b/block.c
42
@@ -XXX,XX +XXX,XX @@ int bdrv_can_set_read_only(BlockDriverState *bs, bool read_only,
113
@@ -XXX,XX +XXX,XX @@ static void bdrv_replace_child_noperm(BdrvChild *child,
43
return 0;
114
if (child->role->detach) {
115
child->role->detach(child);
116
}
117
- if (old_bs->quiesce_counter && child->role->drained_end) {
118
- int num = old_bs->quiesce_counter;
119
- if (child->role->parent_is_bds) {
120
- num -= bdrv_drain_all_count;
121
- }
122
- assert(num >= 0);
123
- for (i = 0; i < num; i++) {
124
- child->role->drained_end(child);
125
- }
126
+ while (child->parent_quiesce_counter) {
127
+ bdrv_parent_drained_end_single(child);
128
}
129
QLIST_REMOVE(child, next_parent);
130
+ } else {
131
+ assert(child->parent_quiesce_counter == 0);
132
}
133
134
child->bs = new_bs;
135
136
if (new_bs) {
137
QLIST_INSERT_HEAD(&new_bs->parents, child, next_parent);
138
- if (new_bs->quiesce_counter && child->role->drained_begin) {
139
+ if (new_bs->quiesce_counter) {
140
int num = new_bs->quiesce_counter;
141
if (child->role->parent_is_bds) {
142
num -= bdrv_drain_all_count;
143
diff --git a/block/io.c b/block/io.c
144
index XXXXXXX..XXXXXXX 100644
145
--- a/block/io.c
146
+++ b/block/io.c
147
@@ -XXX,XX +XXX,XX @@ void bdrv_parent_drained_begin(BlockDriverState *bs, BdrvChild *ignore,
148
}
44
}
149
}
45
150
46
-/* TODO Remove (deprecated since 2.11)
151
+void bdrv_parent_drained_end_single(BdrvChild *c)
47
- * Block drivers are not supposed to automatically change bs->read_only.
152
+{
48
- * Instead, they should just check whether they can provide what the user
153
+ assert(c->parent_quiesce_counter > 0);
49
- * explicitly requested and error out if read-write is requested, but they can
154
+ c->parent_quiesce_counter--;
50
- * only provide read-only access. */
155
+ if (c->role->drained_end) {
51
-int bdrv_set_read_only(BlockDriverState *bs, bool read_only, Error **errp)
156
+ c->role->drained_end(c);
52
+/*
157
+ }
53
+ * Called by a driver that can only provide a read-only image.
158
+}
54
+ *
159
+
55
+ * Returns 0 if the node is already read-only or it could switch the node to
160
void bdrv_parent_drained_end(BlockDriverState *bs, BdrvChild *ignore,
56
+ * read-only because BDRV_O_AUTO_RDONLY is set.
161
bool ignore_bds_parents)
57
+ *
58
+ * Returns -EACCES if the node is read-write and BDRV_O_AUTO_RDONLY is not set
59
+ * or bdrv_can_set_read_only() forbids making the node read-only. If @errmsg
60
+ * is not NULL, it is used as the error message for the Error object.
61
+ */
62
+int bdrv_apply_auto_read_only(BlockDriverState *bs, const char *errmsg,
63
+ Error **errp)
64
{
162
{
65
int ret = 0;
163
@@ -XXX,XX +XXX,XX @@ void bdrv_parent_drained_end(BlockDriverState *bs, BdrvChild *ignore,
66
164
if (c == ignore || (ignore_bds_parents && c->role->parent_is_bds)) {
67
- ret = bdrv_can_set_read_only(bs, read_only, false, errp);
165
continue;
68
- if (ret < 0) {
166
}
69
- return ret;
167
- if (c->role->drained_end) {
70
+ if (!(bs->open_flags & BDRV_O_RDWR)) {
168
- c->role->drained_end(c);
71
+ return 0;
169
- }
72
+ }
170
+ bdrv_parent_drained_end_single(c);
73
+ if (!(bs->open_flags & BDRV_O_AUTO_RDONLY)) {
74
+ goto fail;
75
}
171
}
76
77
- bs->read_only = read_only;
78
-
79
- if (read_only) {
80
- bs->open_flags &= ~BDRV_O_RDWR;
81
- } else {
82
- bs->open_flags |= BDRV_O_RDWR;
83
+ ret = bdrv_can_set_read_only(bs, true, false, NULL);
84
+ if (ret < 0) {
85
+ goto fail;
86
}
87
88
+ bs->read_only = true;
89
+ bs->open_flags &= ~BDRV_O_RDWR;
90
+
91
return 0;
92
+
93
+fail:
94
+ error_setg(errp, "%s", errmsg ?: "Image is read-only");
95
+ return -EACCES;
96
}
172
}
97
173
98
void bdrv_get_full_backing_filename_from_filename(const char *backed,
174
@@ -XXX,XX +XXX,XX @@ static bool bdrv_parent_drained_poll(BlockDriverState *bs, BdrvChild *ignore,
99
diff --git a/block/bochs.c b/block/bochs.c
175
100
index XXXXXXX..XXXXXXX 100644
176
void bdrv_parent_drained_begin_single(BdrvChild *c, bool poll)
101
--- a/block/bochs.c
177
{
102
+++ b/block/bochs.c
178
+ c->parent_quiesce_counter++;
103
@@ -XXX,XX +XXX,XX @@ static int bochs_open(BlockDriverState *bs, QDict *options, int flags,
179
if (c->role->drained_begin) {
104
struct bochs_header bochs;
180
c->role->drained_begin(c);
105
int ret;
106
107
+ /* No write support yet */
108
+ ret = bdrv_apply_auto_read_only(bs, NULL, errp);
109
+ if (ret < 0) {
110
+ return ret;
111
+ }
112
+
113
bs->file = bdrv_open_child(NULL, options, "file", bs, &child_file,
114
false, errp);
115
if (!bs->file) {
116
return -EINVAL;
117
}
118
119
- if (!bdrv_is_read_only(bs)) {
120
- error_report("Opening bochs images without an explicit read-only=on "
121
- "option is deprecated. Future versions will refuse to "
122
- "open the image instead of automatically marking the "
123
- "image read-only.");
124
- ret = bdrv_set_read_only(bs, true, errp); /* no write support yet */
125
- if (ret < 0) {
126
- return ret;
127
- }
128
- }
129
-
130
ret = bdrv_pread(bs->file, 0, &bochs, sizeof(bochs));
131
if (ret < 0) {
132
return ret;
133
diff --git a/block/cloop.c b/block/cloop.c
134
index XXXXXXX..XXXXXXX 100644
135
--- a/block/cloop.c
136
+++ b/block/cloop.c
137
@@ -XXX,XX +XXX,XX @@ static int cloop_open(BlockDriverState *bs, QDict *options, int flags,
138
uint32_t offsets_size, max_compressed_block_size = 1, i;
139
int ret;
140
141
+ ret = bdrv_apply_auto_read_only(bs, NULL, errp);
142
+ if (ret < 0) {
143
+ return ret;
144
+ }
145
+
146
bs->file = bdrv_open_child(NULL, options, "file", bs, &child_file,
147
false, errp);
148
if (!bs->file) {
149
return -EINVAL;
150
}
151
152
- if (!bdrv_is_read_only(bs)) {
153
- error_report("Opening cloop images without an explicit read-only=on "
154
- "option is deprecated. Future versions will refuse to "
155
- "open the image instead of automatically marking the "
156
- "image read-only.");
157
- ret = bdrv_set_read_only(bs, true, errp);
158
- if (ret < 0) {
159
- return ret;
160
- }
161
- }
162
-
163
/* read header */
164
ret = bdrv_pread(bs->file, 128, &s->block_size, 4);
165
if (ret < 0) {
166
diff --git a/block/dmg.c b/block/dmg.c
167
index XXXXXXX..XXXXXXX 100644
168
--- a/block/dmg.c
169
+++ b/block/dmg.c
170
@@ -XXX,XX +XXX,XX @@ static int dmg_open(BlockDriverState *bs, QDict *options, int flags,
171
int64_t offset;
172
int ret;
173
174
+ ret = bdrv_apply_auto_read_only(bs, NULL, errp);
175
+ if (ret < 0) {
176
+ return ret;
177
+ }
178
+
179
bs->file = bdrv_open_child(NULL, options, "file", bs, &child_file,
180
false, errp);
181
if (!bs->file) {
182
return -EINVAL;
183
}
184
185
- if (!bdrv_is_read_only(bs)) {
186
- error_report("Opening dmg images without an explicit read-only=on "
187
- "option is deprecated. Future versions will refuse to "
188
- "open the image instead of automatically marking the "
189
- "image read-only.");
190
- ret = bdrv_set_read_only(bs, true, errp);
191
- if (ret < 0) {
192
- return ret;
193
- }
194
- }
195
-
196
block_module_load_one("dmg-bz2");
197
198
s->n_chunks = 0;
199
diff --git a/block/rbd.c b/block/rbd.c
200
index XXXXXXX..XXXXXXX 100644
201
--- a/block/rbd.c
202
+++ b/block/rbd.c
203
@@ -XXX,XX +XXX,XX @@ static int qemu_rbd_open(BlockDriverState *bs, QDict *options, int flags,
204
/* If we are using an rbd snapshot, we must be r/o, otherwise
205
* leave as-is */
206
if (s->snap != NULL) {
207
- if (!bdrv_is_read_only(bs)) {
208
- error_report("Opening rbd snapshots without an explicit "
209
- "read-only=on option is deprecated. Future versions "
210
- "will refuse to open the image instead of "
211
- "automatically marking the image read-only.");
212
- r = bdrv_set_read_only(bs, true, &local_err);
213
- if (r < 0) {
214
- rbd_close(s->image);
215
- error_propagate(errp, local_err);
216
- goto failed_open;
217
- }
218
+ r = bdrv_apply_auto_read_only(bs, "rbd snapshots are read-only", errp);
219
+ if (r < 0) {
220
+ rbd_close(s->image);
221
+ goto failed_open;
222
}
223
}
224
225
diff --git a/block/vvfat.c b/block/vvfat.c
226
index XXXXXXX..XXXXXXX 100644
227
--- a/block/vvfat.c
228
+++ b/block/vvfat.c
229
@@ -XXX,XX +XXX,XX @@ static int vvfat_open(BlockDriverState *bs, QDict *options, int flags,
230
"Unable to set VVFAT to 'rw' when drive is read-only");
231
goto fail;
232
}
233
- } else if (!bdrv_is_read_only(bs)) {
234
- error_report("Opening non-rw vvfat images without an explicit "
235
- "read-only=on option is deprecated. Future versions "
236
- "will refuse to open the image instead of "
237
- "automatically marking the image read-only.");
238
- /* read only is the default for safety */
239
- ret = bdrv_set_read_only(bs, true, &local_err);
240
+ } else {
241
+ ret = bdrv_apply_auto_read_only(bs, NULL, errp);
242
if (ret < 0) {
243
- error_propagate(errp, local_err);
244
goto fail;
245
}
246
}
181
}
247
--
182
--
248
2.19.1
183
2.20.1
249
184
250
185
diff view generated by jsdifflib
1
From: Max Reitz <mreitz@redhat.com>
2
3
Signed-off-by: Max Reitz <mreitz@redhat.com>
1
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
4
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
2
Reviewed-by: Eric Blake <eblake@redhat.com>
3
---
5
---
4
tests/qemu-iotests/232 | 147 +++++++++++++++++++++++++++++++++++++
6
tests/test-bdrv-drain.c | 119 ++++++++++++++++++++++++++++++++++++++++
5
tests/qemu-iotests/232.out | 59 +++++++++++++++
7
1 file changed, 119 insertions(+)
6
tests/qemu-iotests/group | 1 +
7
3 files changed, 207 insertions(+)
8
create mode 100755 tests/qemu-iotests/232
9
create mode 100644 tests/qemu-iotests/232.out
10
8
11
diff --git a/tests/qemu-iotests/232 b/tests/qemu-iotests/232
9
diff --git a/tests/test-bdrv-drain.c b/tests/test-bdrv-drain.c
12
new file mode 100755
10
index XXXXXXX..XXXXXXX 100644
13
index XXXXXXX..XXXXXXX
11
--- a/tests/test-bdrv-drain.c
14
--- /dev/null
12
+++ b/tests/test-bdrv-drain.c
15
+++ b/tests/qemu-iotests/232
13
@@ -XXX,XX +XXX,XX @@ static void test_set_aio_context(void)
16
@@ -XXX,XX +XXX,XX @@
14
iothread_join(b);
17
+#!/bin/bash
15
}
18
+#
16
19
+# Test for auto-read-only
20
+#
21
+# Copyright (C) 2018 Red Hat, Inc.
22
+#
23
+# This program is free software; you can redistribute it and/or modify
24
+# it under the terms of the GNU General Public License as published by
25
+# the Free Software Foundation; either version 2 of the License, or
26
+# (at your option) any later version.
27
+#
28
+# This program is distributed in the hope that it will be useful,
29
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
30
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
31
+# GNU General Public License for more details.
32
+#
33
+# You should have received a copy of the GNU General Public License
34
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
35
+#
36
+
17
+
37
+# creator
18
+typedef struct TestDropBackingBlockJob {
38
+owner=kwolf@redhat.com
19
+ BlockJob common;
20
+ bool should_complete;
21
+ bool *did_complete;
22
+} TestDropBackingBlockJob;
39
+
23
+
40
+seq=`basename $0`
24
+static int coroutine_fn test_drop_backing_job_run(Job *job, Error **errp)
41
+echo "QA output created by $seq"
25
+{
26
+ TestDropBackingBlockJob *s =
27
+ container_of(job, TestDropBackingBlockJob, common.job);
42
+
28
+
43
+here=`pwd`
29
+ while (!s->should_complete) {
44
+status=1    # failure is the default!
30
+ job_sleep_ns(job, 0);
31
+ }
45
+
32
+
46
+_cleanup()
33
+ return 0;
47
+{
48
+ _cleanup_test_img
49
+ rm -f $TEST_IMG.snap
50
+}
51
+trap "_cleanup; exit \$status" 0 1 2 3 15
52
+
53
+# get standard environment, filters and checks
54
+. ./common.rc
55
+. ./common.filter
56
+
57
+_supported_fmt generic
58
+_supported_proto file
59
+_supported_os Linux
60
+
61
+function do_run_qemu()
62
+{
63
+ echo Testing: "$@"
64
+ (
65
+ if ! test -t 0; then
66
+ while read cmd; do
67
+ echo $cmd
68
+ done
69
+ fi
70
+ echo quit
71
+ ) | $QEMU -nographic -monitor stdio -nodefaults "$@"
72
+ echo
73
+}
34
+}
74
+
35
+
75
+function run_qemu()
36
+static void test_drop_backing_job_commit(Job *job)
76
+{
37
+{
77
+ do_run_qemu "$@" 2>&1 | _filter_testdir | _filter_qemu | _filter_hmp |
38
+ TestDropBackingBlockJob *s =
78
+ _filter_generated_node_ids | _filter_imgfmt
39
+ container_of(job, TestDropBackingBlockJob, common.job);
40
+
41
+ bdrv_set_backing_hd(blk_bs(s->common.blk), NULL, &error_abort);
42
+
43
+ *s->did_complete = true;
79
+}
44
+}
80
+
45
+
81
+function run_qemu_info_block()
46
+static const BlockJobDriver test_drop_backing_job_driver = {
47
+ .job_driver = {
48
+ .instance_size = sizeof(TestDropBackingBlockJob),
49
+ .free = block_job_free,
50
+ .user_resume = block_job_user_resume,
51
+ .drain = block_job_drain,
52
+ .run = test_drop_backing_job_run,
53
+ .commit = test_drop_backing_job_commit,
54
+ }
55
+};
56
+
57
+/**
58
+ * Creates a child node with three parent nodes on it, and then runs a
59
+ * block job on the final one, parent-node-2.
60
+ *
61
+ * (TODO: parent-node-0 currently serves no purpose, but will as of a
62
+ * follow-up patch.)
63
+ *
64
+ * The job is then asked to complete before a section where the child
65
+ * is drained.
66
+ *
67
+ * Ending this section will undrain the child's parents, first
68
+ * parent-node-2, then parent-node-1, then parent-node-0 -- the parent
69
+ * list is in reverse order of how they were added. Ending the drain
70
+ * on parent-node-2 will resume the job, thus completing it and
71
+ * scheduling job_exit().
72
+ *
73
+ * Ending the drain on parent-node-1 will poll the AioContext, which
74
+ * lets job_exit() and thus test_drop_backing_job_commit() run. That
75
+ * function removes the child as parent-node-2's backing file.
76
+ *
77
+ * In old (and buggy) implementations, there are two problems with
78
+ * that:
79
+ * (A) bdrv_drain_invoke() polls for every node that leaves the
80
+ * drained section. This means that job_exit() is scheduled
81
+ * before the child has left the drained section. Its
82
+ * quiesce_counter is therefore still 1 when it is removed from
83
+ * parent-node-2.
84
+ *
85
+ * (B) bdrv_replace_child_noperm() calls drained_end() on the old
86
+ * child's parents as many times as the child is quiesced. This
87
+ * means it will call drained_end() on parent-node-2 once.
88
+ * Because parent-node-2 is no longer quiesced at this point, this
89
+ * will fail.
90
+ *
91
+ * bdrv_replace_child_noperm() therefore must call drained_end() on
92
+ * the parent only if it really is still drained because the child is
93
+ * drained.
94
+ */
95
+static void test_blockjob_commit_by_drained_end(void)
82
+{
96
+{
83
+ echo "info block -n" | run_qemu "$@" | grep -e "(file" -e "QEMU_PROG"
97
+ BlockDriverState *bs_child, *bs_parents[3];
98
+ TestDropBackingBlockJob *job;
99
+ bool job_has_completed = false;
100
+ int i;
101
+
102
+ bs_child = bdrv_new_open_driver(&bdrv_test, "child-node", BDRV_O_RDWR,
103
+ &error_abort);
104
+
105
+ for (i = 0; i < 3; i++) {
106
+ char name[32];
107
+ snprintf(name, sizeof(name), "parent-node-%i", i);
108
+ bs_parents[i] = bdrv_new_open_driver(&bdrv_test, name, BDRV_O_RDWR,
109
+ &error_abort);
110
+ bdrv_set_backing_hd(bs_parents[i], bs_child, &error_abort);
111
+ }
112
+
113
+ job = block_job_create("job", &test_drop_backing_job_driver, NULL,
114
+ bs_parents[2], 0, BLK_PERM_ALL, 0, 0, NULL, NULL,
115
+ &error_abort);
116
+
117
+ job->did_complete = &job_has_completed;
118
+
119
+ job_start(&job->common.job);
120
+
121
+ job->should_complete = true;
122
+ bdrv_drained_begin(bs_child);
123
+ g_assert(!job_has_completed);
124
+ bdrv_drained_end(bs_child);
125
+ g_assert(job_has_completed);
126
+
127
+ bdrv_unref(bs_parents[0]);
128
+ bdrv_unref(bs_parents[1]);
129
+ bdrv_unref(bs_parents[2]);
130
+ bdrv_unref(bs_child);
84
+}
131
+}
85
+
132
+
86
+size=128M
133
int main(int argc, char **argv)
134
{
135
int ret;
136
@@ -XXX,XX +XXX,XX @@ int main(int argc, char **argv)
137
138
g_test_add_func("/bdrv-drain/set_aio_context", test_set_aio_context);
139
140
+ g_test_add_func("/bdrv-drain/blockjob/commit_by_drained_end",
141
+ test_blockjob_commit_by_drained_end);
87
+
142
+
88
+_make_test_img $size
143
ret = g_test_run();
89
+
144
qemu_event_destroy(&done_event);
90
+echo
145
return ret;
91
+echo "=== -drive with read-write image: read-only/auto-read-only combinations ==="
92
+echo
93
+
94
+run_qemu_info_block -drive driver=file,file="$TEST_IMG",if=none,read-only=on,auto-read-only=off
95
+run_qemu_info_block -drive driver=file,file="$TEST_IMG",if=none,read-only=on,auto-read-only=on
96
+run_qemu_info_block -drive driver=file,file="$TEST_IMG",if=none,read-only=on
97
+echo
98
+run_qemu_info_block -drive driver=file,file="$TEST_IMG",if=none,read-only=off,auto-read-only=off
99
+run_qemu_info_block -drive driver=file,file="$TEST_IMG",if=none,read-only=off,auto-read-only=on
100
+run_qemu_info_block -drive driver=file,file="$TEST_IMG",if=none,read-only=off
101
+echo
102
+run_qemu_info_block -drive driver=file,file="$TEST_IMG",if=none,auto-read-only=off
103
+run_qemu_info_block -drive driver=file,file="$TEST_IMG",if=none,auto-read-only=on
104
+run_qemu_info_block -drive driver=file,file="$TEST_IMG",if=none
105
+
106
+echo
107
+echo "=== -drive with read-only image: read-only/auto-read-only combinations ==="
108
+echo
109
+
110
+chmod a-w $TEST_IMG
111
+
112
+run_qemu_info_block -drive driver=file,file="$TEST_IMG",if=none,read-only=on,auto-read-only=off
113
+run_qemu_info_block -drive driver=file,file="$TEST_IMG",if=none,read-only=on,auto-read-only=on
114
+run_qemu_info_block -drive driver=file,file="$TEST_IMG",if=none,read-only=on
115
+echo
116
+run_qemu_info_block -drive driver=file,file="$TEST_IMG",if=none,read-only=off,auto-read-only=off
117
+run_qemu_info_block -drive driver=file,file="$TEST_IMG",if=none,read-only=off,auto-read-only=on
118
+run_qemu_info_block -drive driver=file,file="$TEST_IMG",if=none,read-only=off
119
+echo
120
+run_qemu_info_block -drive driver=file,file="$TEST_IMG",if=none,auto-read-only=off
121
+run_qemu_info_block -drive driver=file,file="$TEST_IMG",if=none,auto-read-only=on
122
+run_qemu_info_block -drive driver=file,file="$TEST_IMG",if=none
123
+
124
+echo
125
+echo "=== -blockdev with read-write image: read-only/auto-read-only combinations ==="
126
+echo
127
+
128
+chmod a+w $TEST_IMG
129
+
130
+run_qemu_info_block -blockdev driver=file,filename="$TEST_IMG",node-name=node0,read-only=on,auto-read-only=off
131
+run_qemu_info_block -blockdev driver=file,filename="$TEST_IMG",node-name=node0,read-only=on,auto-read-only=on
132
+run_qemu_info_block -blockdev driver=file,filename="$TEST_IMG",node-name=node0,read-only=on
133
+echo
134
+run_qemu_info_block -blockdev driver=file,filename="$TEST_IMG",node-name=node0,read-only=off,auto-read-only=off
135
+run_qemu_info_block -blockdev driver=file,filename="$TEST_IMG",node-name=node0,read-only=off,auto-read-only=on
136
+run_qemu_info_block -blockdev driver=file,filename="$TEST_IMG",node-name=node0,read-only=off
137
+echo
138
+run_qemu_info_block -blockdev driver=file,filename="$TEST_IMG",node-name=node0,auto-read-only=off
139
+run_qemu_info_block -blockdev driver=file,filename="$TEST_IMG",node-name=node0,auto-read-only=on
140
+run_qemu_info_block -blockdev driver=file,filename="$TEST_IMG",node-name=node0
141
+
142
+echo
143
+echo "=== -blockdev with read-only image: read-only/auto-read-only combinations ==="
144
+echo
145
+
146
+chmod a-w $TEST_IMG
147
+
148
+run_qemu_info_block -blockdev driver=file,filename="$TEST_IMG",node-name=node0,read-only=on,auto-read-only=off
149
+run_qemu_info_block -blockdev driver=file,filename="$TEST_IMG",node-name=node0,read-only=on,auto-read-only=on
150
+run_qemu_info_block -blockdev driver=file,filename="$TEST_IMG",node-name=node0,read-only=on
151
+echo
152
+run_qemu_info_block -blockdev driver=file,filename="$TEST_IMG",node-name=node0,read-only=off,auto-read-only=off
153
+run_qemu_info_block -blockdev driver=file,filename="$TEST_IMG",node-name=node0,read-only=off,auto-read-only=on
154
+run_qemu_info_block -blockdev driver=file,filename="$TEST_IMG",node-name=node0,read-only=off
155
+echo
156
+run_qemu_info_block -blockdev driver=file,filename="$TEST_IMG",node-name=node0,auto-read-only=off
157
+run_qemu_info_block -blockdev driver=file,filename="$TEST_IMG",node-name=node0,auto-read-only=on
158
+run_qemu_info_block -blockdev driver=file,filename="$TEST_IMG",node-name=node0
159
+
160
+# success, all done
161
+echo "*** done"
162
+rm -f $seq.full
163
+status=0
164
diff --git a/tests/qemu-iotests/232.out b/tests/qemu-iotests/232.out
165
new file mode 100644
166
index XXXXXXX..XXXXXXX
167
--- /dev/null
168
+++ b/tests/qemu-iotests/232.out
169
@@ -XXX,XX +XXX,XX @@
170
+QA output created by 232
171
+Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=134217728
172
+
173
+=== -drive with read-write image: read-only/auto-read-only combinations ===
174
+
175
+NODE_NAME: TEST_DIR/t.IMGFMT (file, read-only)
176
+NODE_NAME: TEST_DIR/t.IMGFMT (file, read-only)
177
+NODE_NAME: TEST_DIR/t.IMGFMT (file, read-only)
178
+
179
+NODE_NAME: TEST_DIR/t.IMGFMT (file)
180
+NODE_NAME: TEST_DIR/t.IMGFMT (file)
181
+NODE_NAME: TEST_DIR/t.IMGFMT (file)
182
+
183
+NODE_NAME: TEST_DIR/t.IMGFMT (file)
184
+NODE_NAME: TEST_DIR/t.IMGFMT (file)
185
+NODE_NAME: TEST_DIR/t.IMGFMT (file)
186
+
187
+=== -drive with read-only image: read-only/auto-read-only combinations ===
188
+
189
+NODE_NAME: TEST_DIR/t.IMGFMT (file, read-only)
190
+NODE_NAME: TEST_DIR/t.IMGFMT (file, read-only)
191
+NODE_NAME: TEST_DIR/t.IMGFMT (file, read-only)
192
+
193
+QEMU_PROG: -drive driver=file,file=TEST_DIR/t.IMGFMT,if=none,read-only=off,auto-read-only=off: Could not open 'TEST_DIR/t.IMGFMT': Permission denied
194
+NODE_NAME: TEST_DIR/t.IMGFMT (file, read-only)
195
+NODE_NAME: TEST_DIR/t.IMGFMT (file, read-only)
196
+
197
+QEMU_PROG: -drive driver=file,file=TEST_DIR/t.IMGFMT,if=none,auto-read-only=off: Could not open 'TEST_DIR/t.IMGFMT': Permission denied
198
+NODE_NAME: TEST_DIR/t.IMGFMT (file, read-only)
199
+NODE_NAME: TEST_DIR/t.IMGFMT (file, read-only)
200
+
201
+=== -blockdev with read-write image: read-only/auto-read-only combinations ===
202
+
203
+node0: TEST_DIR/t.IMGFMT (file, read-only)
204
+node0: TEST_DIR/t.IMGFMT (file, read-only)
205
+node0: TEST_DIR/t.IMGFMT (file, read-only)
206
+
207
+node0: TEST_DIR/t.IMGFMT (file)
208
+node0: TEST_DIR/t.IMGFMT (file)
209
+node0: TEST_DIR/t.IMGFMT (file)
210
+
211
+node0: TEST_DIR/t.IMGFMT (file)
212
+node0: TEST_DIR/t.IMGFMT (file)
213
+node0: TEST_DIR/t.IMGFMT (file)
214
+
215
+=== -blockdev with read-only image: read-only/auto-read-only combinations ===
216
+
217
+node0: TEST_DIR/t.IMGFMT (file, read-only)
218
+node0: TEST_DIR/t.IMGFMT (file, read-only)
219
+node0: TEST_DIR/t.IMGFMT (file, read-only)
220
+
221
+QEMU_PROG: -blockdev driver=file,filename=TEST_DIR/t.IMGFMT,node-name=node0,read-only=off,auto-read-only=off: Could not open 'TEST_DIR/t.IMGFMT': Permission denied
222
+node0: TEST_DIR/t.IMGFMT (file, read-only)
223
+QEMU_PROG: -blockdev driver=file,filename=TEST_DIR/t.IMGFMT,node-name=node0,read-only=off: Could not open 'TEST_DIR/t.IMGFMT': Permission denied
224
+
225
+QEMU_PROG: -blockdev driver=file,filename=TEST_DIR/t.IMGFMT,node-name=node0,auto-read-only=off: Could not open 'TEST_DIR/t.IMGFMT': Permission denied
226
+node0: TEST_DIR/t.IMGFMT (file, read-only)
227
+QEMU_PROG: -blockdev driver=file,filename=TEST_DIR/t.IMGFMT,node-name=node0: Could not open 'TEST_DIR/t.IMGFMT': Permission denied
228
+*** done
229
diff --git a/tests/qemu-iotests/group b/tests/qemu-iotests/group
230
index XXXXXXX..XXXXXXX 100644
231
--- a/tests/qemu-iotests/group
232
+++ b/tests/qemu-iotests/group
233
@@ -XXX,XX +XXX,XX @@
234
227 auto quick
235
229 auto quick
236
231 auto quick
237
+232 auto quick
238
--
146
--
239
2.19.1
147
2.20.1
240
148
241
149
diff view generated by jsdifflib
1
From: Alberto Garcia <berto@igalia.com>
1
From: Max Reitz <mreitz@redhat.com>
2
2
3
The blkverify mode of Quorum only works when the number of children is
3
Callers can now pass a pointer to an integer that bdrv_drain_invoke()
4
exactly two, so any attempt to add a new one must return an error.
4
(and its recursive callees) will increment for every
5
5
bdrv_drain_invoke_entry() operation they schedule.
6
quorum_del_child() on the other hand doesn't need any additional check
6
bdrv_drain_invoke_entry() in turn will decrement it once it has invoked
7
because decreasing the number of children would make it go under the
7
BlockDriver.bdrv_co_drain_end().
8
vote threshold.
8
9
9
We use atomic operations to access the pointee, because the
10
Signed-off-by: Alberto Garcia <berto@igalia.com>
10
bdrv_do_drained_end() caller may wish to end drained sections for
11
Reported-by: Kevin Wolf <kwolf@redhat.com>
11
multiple nodes in different AioContexts (bdrv_drain_all_end() does, for
12
example).
13
14
This is the first step to moving the polling for BdrvCoDrainData.done to
15
become true out of bdrv_drain_invoke() and into the root drained_end
16
function.
17
18
Signed-off-by: Max Reitz <mreitz@redhat.com>
12
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
19
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
13
---
20
---
14
block/quorum.c | 8 ++++++++
21
block/io.c | 58 +++++++++++++++++++++++++++++++++++++-----------------
15
1 file changed, 8 insertions(+)
22
1 file changed, 40 insertions(+), 18 deletions(-)
16
23
17
diff --git a/block/quorum.c b/block/quorum.c
24
diff --git a/block/io.c b/block/io.c
18
index XXXXXXX..XXXXXXX 100644
25
index XXXXXXX..XXXXXXX 100644
19
--- a/block/quorum.c
26
--- a/block/io.c
20
+++ b/block/quorum.c
27
+++ b/block/io.c
21
@@ -XXX,XX +XXX,XX @@ static void quorum_add_child(BlockDriverState *bs, BlockDriverState *child_bs,
28
@@ -XXX,XX +XXX,XX @@ typedef struct {
22
char indexstr[32];
29
bool poll;
23
int ret;
30
BdrvChild *parent;
24
31
bool ignore_bds_parents;
25
+ if (s->is_blkverify) {
32
+ int *drained_end_counter;
26
+ error_setg(errp, "Cannot add a child to a quorum in blkverify mode");
33
} BdrvCoDrainData;
27
+ return;
34
35
static void coroutine_fn bdrv_drain_invoke_entry(void *opaque)
36
@@ -XXX,XX +XXX,XX @@ static void coroutine_fn bdrv_drain_invoke_entry(void *opaque)
37
atomic_mb_set(&data->done, true);
38
bdrv_dec_in_flight(bs);
39
40
- if (data->begin) {
41
+ if (data->drained_end_counter) {
42
+ atomic_dec(data->drained_end_counter);
28
+ }
43
+ }
29
+
44
+
30
assert(s->num_children <= INT_MAX / sizeof(BdrvChild *));
45
+ if (data->begin || data->drained_end_counter) {
31
if (s->num_children == INT_MAX / sizeof(BdrvChild *) ||
46
g_free(data);
32
s->next_child_index == UINT_MAX) {
47
}
33
@@ -XXX,XX +XXX,XX @@ static void quorum_del_child(BlockDriverState *bs, BdrvChild *child,
48
}
49
50
/* Recursively call BlockDriver.bdrv_co_drain_begin/end callbacks */
51
-static void bdrv_drain_invoke(BlockDriverState *bs, bool begin)
52
+static void bdrv_drain_invoke(BlockDriverState *bs, bool begin,
53
+ int *drained_end_counter)
54
{
55
BdrvCoDrainData *data;
56
57
@@ -XXX,XX +XXX,XX @@ static void bdrv_drain_invoke(BlockDriverState *bs, bool begin)
58
*data = (BdrvCoDrainData) {
59
.bs = bs,
60
.done = false,
61
- .begin = begin
62
+ .begin = begin,
63
+ .drained_end_counter = drained_end_counter,
64
};
65
66
+ if (!begin && drained_end_counter) {
67
+ atomic_inc(drained_end_counter);
68
+ }
69
+
70
/* Make sure the driver callback completes during the polling phase for
71
* drain_begin. */
72
bdrv_inc_in_flight(bs);
73
data->co = qemu_coroutine_create(bdrv_drain_invoke_entry, data);
74
aio_co_schedule(bdrv_get_aio_context(bs), data->co);
75
76
- if (!begin) {
77
+ /*
78
+ * TODO: Drop this and make callers pass @drained_end_counter and poll
79
+ * themselves
80
+ */
81
+ if (!begin && !drained_end_counter) {
82
BDRV_POLL_WHILE(bs, !data->done);
83
g_free(data);
84
}
85
@@ -XXX,XX +XXX,XX @@ static void bdrv_do_drained_begin(BlockDriverState *bs, bool recursive,
86
BdrvChild *parent, bool ignore_bds_parents,
87
bool poll);
88
static void bdrv_do_drained_end(BlockDriverState *bs, bool recursive,
89
- BdrvChild *parent, bool ignore_bds_parents);
90
+ BdrvChild *parent, bool ignore_bds_parents,
91
+ int *drained_end_counter);
92
93
static void bdrv_co_drain_bh_cb(void *opaque)
94
{
95
@@ -XXX,XX +XXX,XX @@ static void bdrv_co_drain_bh_cb(void *opaque)
96
data->ignore_bds_parents, data->poll);
97
} else {
98
bdrv_do_drained_end(bs, data->recursive, data->parent,
99
- data->ignore_bds_parents);
100
+ data->ignore_bds_parents,
101
+ data->drained_end_counter);
102
}
103
if (ctx == co_ctx) {
104
aio_context_release(ctx);
105
@@ -XXX,XX +XXX,XX @@ static void coroutine_fn bdrv_co_yield_to_drain(BlockDriverState *bs,
106
bool begin, bool recursive,
107
BdrvChild *parent,
108
bool ignore_bds_parents,
109
- bool poll)
110
+ bool poll,
111
+ int *drained_end_counter)
112
{
113
BdrvCoDrainData data;
114
115
@@ -XXX,XX +XXX,XX @@ static void coroutine_fn bdrv_co_yield_to_drain(BlockDriverState *bs,
116
.parent = parent,
117
.ignore_bds_parents = ignore_bds_parents,
118
.poll = poll,
119
+ .drained_end_counter = drained_end_counter,
120
};
121
+
122
if (bs) {
123
bdrv_inc_in_flight(bs);
124
}
125
@@ -XXX,XX +XXX,XX @@ void bdrv_do_drained_begin_quiesce(BlockDriverState *bs,
126
}
127
128
bdrv_parent_drained_begin(bs, parent, ignore_bds_parents);
129
- bdrv_drain_invoke(bs, true);
130
+ bdrv_drain_invoke(bs, true, NULL);
131
}
132
133
static void bdrv_do_drained_begin(BlockDriverState *bs, bool recursive,
134
@@ -XXX,XX +XXX,XX @@ static void bdrv_do_drained_begin(BlockDriverState *bs, bool recursive,
135
136
if (qemu_in_coroutine()) {
137
bdrv_co_yield_to_drain(bs, true, recursive, parent, ignore_bds_parents,
138
- poll);
139
+ poll, NULL);
34
return;
140
return;
35
}
141
}
36
142
37
+ /* We know now that num_children > threshold, so blkverify must be false */
143
@@ -XXX,XX +XXX,XX @@ void bdrv_subtree_drained_begin(BlockDriverState *bs)
38
+ assert(!s->is_blkverify);
144
}
39
+
145
40
bdrv_drained_begin(bs);
146
static void bdrv_do_drained_end(BlockDriverState *bs, bool recursive,
41
147
- BdrvChild *parent, bool ignore_bds_parents)
42
/* We can safely remove this child now */
148
+ BdrvChild *parent, bool ignore_bds_parents,
149
+ int *drained_end_counter)
150
{
151
BdrvChild *child, *next;
152
int old_quiesce_counter;
153
154
if (qemu_in_coroutine()) {
155
bdrv_co_yield_to_drain(bs, false, recursive, parent, ignore_bds_parents,
156
- false);
157
+ false, drained_end_counter);
158
return;
159
}
160
assert(bs->quiesce_counter > 0);
161
162
/* Re-enable things in child-to-parent order */
163
- bdrv_drain_invoke(bs, false);
164
+ bdrv_drain_invoke(bs, false, drained_end_counter);
165
bdrv_parent_drained_end(bs, parent, ignore_bds_parents);
166
167
old_quiesce_counter = atomic_fetch_dec(&bs->quiesce_counter);
168
@@ -XXX,XX +XXX,XX @@ static void bdrv_do_drained_end(BlockDriverState *bs, bool recursive,
169
assert(!ignore_bds_parents);
170
bs->recursive_quiesce_counter--;
171
QLIST_FOREACH_SAFE(child, &bs->children, next, next) {
172
- bdrv_do_drained_end(child->bs, true, child, ignore_bds_parents);
173
+ bdrv_do_drained_end(child->bs, true, child, ignore_bds_parents,
174
+ drained_end_counter);
175
}
176
}
177
}
178
179
void bdrv_drained_end(BlockDriverState *bs)
180
{
181
- bdrv_do_drained_end(bs, false, NULL, false);
182
+ bdrv_do_drained_end(bs, false, NULL, false, NULL);
183
}
184
185
void bdrv_subtree_drained_end(BlockDriverState *bs)
186
{
187
- bdrv_do_drained_end(bs, true, NULL, false);
188
+ bdrv_do_drained_end(bs, true, NULL, false, NULL);
189
}
190
191
void bdrv_apply_subtree_drain(BdrvChild *child, BlockDriverState *new_parent)
192
@@ -XXX,XX +XXX,XX @@ void bdrv_unapply_subtree_drain(BdrvChild *child, BlockDriverState *old_parent)
193
int i;
194
195
for (i = 0; i < old_parent->recursive_quiesce_counter; i++) {
196
- bdrv_do_drained_end(child->bs, true, child, false);
197
+ bdrv_do_drained_end(child->bs, true, child, false, NULL);
198
}
199
}
200
201
@@ -XXX,XX +XXX,XX @@ void bdrv_drain_all_begin(void)
202
BlockDriverState *bs = NULL;
203
204
if (qemu_in_coroutine()) {
205
- bdrv_co_yield_to_drain(NULL, true, false, NULL, true, true);
206
+ bdrv_co_yield_to_drain(NULL, true, false, NULL, true, true, NULL);
207
return;
208
}
209
210
@@ -XXX,XX +XXX,XX @@ void bdrv_drain_all_end(void)
211
AioContext *aio_context = bdrv_get_aio_context(bs);
212
213
aio_context_acquire(aio_context);
214
- bdrv_do_drained_end(bs, false, NULL, true);
215
+ bdrv_do_drained_end(bs, false, NULL, true, NULL);
216
aio_context_release(aio_context);
217
}
218
43
--
219
--
44
2.19.1
220
2.20.1
45
221
46
222
diff view generated by jsdifflib
1
From: Peter Maydell <peter.maydell@linaro.org>
1
From: Max Reitz <mreitz@redhat.com>
2
2
3
Taking the address of a field in a packed struct is a bad idea, because
3
These functions are not used outside of block/io.c, there is no reason
4
it might not be actually aligned enough for that pointer type (and
4
why they should be globally available.
5
thus cause a crash on dereference on some host architectures). Newer
6
versions of clang warn about this. Avoid the bug by not using the
7
"modify in place" byte swapping functions.
8
5
9
There are a few places where the in-place swap function is
6
Signed-off-by: Max Reitz <mreitz@redhat.com>
10
used on something other than a packed struct field; we convert
11
those anyway, for consistency.
12
13
This patch was produced with the following spatch script:
14
15
@@
16
expression E;
17
@@
18
-be16_to_cpus(&E);
19
+E = be16_to_cpu(E);
20
@@
21
expression E;
22
@@
23
-be32_to_cpus(&E);
24
+E = be32_to_cpu(E);
25
@@
26
expression E;
27
@@
28
-be64_to_cpus(&E);
29
+E = be64_to_cpu(E);
30
@@
31
expression E;
32
@@
33
-cpu_to_be16s(&E);
34
+E = cpu_to_be16(E);
35
@@
36
expression E;
37
@@
38
-cpu_to_be32s(&E);
39
+E = cpu_to_be32(E);
40
@@
41
expression E;
42
@@
43
-cpu_to_be64s(&E);
44
+E = cpu_to_be64(E);
45
46
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
47
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
48
Tested-by: John Snow <jsnow@redhat.com>
49
Reviewed-by: John Snow <jsnow@redhat.com>
50
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
7
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
51
---
8
---
52
block/qcow2-bitmap.c | 24 ++++++++++++------------
9
include/block/block.h | 18 ------------------
53
1 file changed, 12 insertions(+), 12 deletions(-)
10
block/io.c | 8 ++++----
11
2 files changed, 4 insertions(+), 22 deletions(-)
54
12
55
diff --git a/block/qcow2-bitmap.c b/block/qcow2-bitmap.c
13
diff --git a/include/block/block.h b/include/block/block.h
56
index XXXXXXX..XXXXXXX 100644
14
index XXXXXXX..XXXXXXX 100644
57
--- a/block/qcow2-bitmap.c
15
--- a/include/block/block.h
58
+++ b/block/qcow2-bitmap.c
16
+++ b/include/block/block.h
59
@@ -XXX,XX +XXX,XX @@ static inline void bitmap_table_to_be(uint64_t *bitmap_table, size_t size)
17
@@ -XXX,XX +XXX,XX @@ int bdrv_probe_geometry(BlockDriverState *bs, HDGeometry *geo);
60
size_t i;
18
void bdrv_io_plug(BlockDriverState *bs);
61
19
void bdrv_io_unplug(BlockDriverState *bs);
62
for (i = 0; i < size; ++i) {
20
63
- cpu_to_be64s(&bitmap_table[i]);
21
-/**
64
+ bitmap_table[i] = cpu_to_be64(bitmap_table[i]);
22
- * bdrv_parent_drained_begin:
23
- *
24
- * Begin a quiesced section of all users of @bs. This is part of
25
- * bdrv_drained_begin.
26
- */
27
-void bdrv_parent_drained_begin(BlockDriverState *bs, BdrvChild *ignore,
28
- bool ignore_bds_parents);
29
-
30
/**
31
* bdrv_parent_drained_begin_single:
32
*
33
@@ -XXX,XX +XXX,XX @@ void bdrv_parent_drained_begin_single(BdrvChild *c, bool poll);
34
*/
35
void bdrv_parent_drained_end_single(BdrvChild *c);
36
37
-/**
38
- * bdrv_parent_drained_end:
39
- *
40
- * End a quiesced section of all users of @bs. This is part of
41
- * bdrv_drained_end.
42
- */
43
-void bdrv_parent_drained_end(BlockDriverState *bs, BdrvChild *ignore,
44
- bool ignore_bds_parents);
45
-
46
/**
47
* bdrv_drain_poll:
48
*
49
diff --git a/block/io.c b/block/io.c
50
index XXXXXXX..XXXXXXX 100644
51
--- a/block/io.c
52
+++ b/block/io.c
53
@@ -XXX,XX +XXX,XX @@ static void bdrv_parent_cb_resize(BlockDriverState *bs);
54
static int coroutine_fn bdrv_co_do_pwrite_zeroes(BlockDriverState *bs,
55
int64_t offset, int bytes, BdrvRequestFlags flags);
56
57
-void bdrv_parent_drained_begin(BlockDriverState *bs, BdrvChild *ignore,
58
- bool ignore_bds_parents)
59
+static void bdrv_parent_drained_begin(BlockDriverState *bs, BdrvChild *ignore,
60
+ bool ignore_bds_parents)
61
{
62
BdrvChild *c, *next;
63
64
@@ -XXX,XX +XXX,XX @@ void bdrv_parent_drained_end_single(BdrvChild *c)
65
}
65
}
66
}
66
}
67
67
68
@@ -XXX,XX +XXX,XX @@ static int bitmap_table_load(BlockDriverState *bs, Qcow2BitmapTable *tb,
68
-void bdrv_parent_drained_end(BlockDriverState *bs, BdrvChild *ignore,
69
}
69
- bool ignore_bds_parents)
70
70
+static void bdrv_parent_drained_end(BlockDriverState *bs, BdrvChild *ignore,
71
for (i = 0; i < tb->size; ++i) {
71
+ bool ignore_bds_parents)
72
- be64_to_cpus(&table[i]);
73
+ table[i] = be64_to_cpu(table[i]);
74
ret = check_table_entry(table[i], s->cluster_size);
75
if (ret < 0) {
76
goto fail;
77
@@ -XXX,XX +XXX,XX @@ fail:
78
79
static inline void bitmap_dir_entry_to_cpu(Qcow2BitmapDirEntry *entry)
80
{
72
{
81
- be64_to_cpus(&entry->bitmap_table_offset);
73
BdrvChild *c, *next;
82
- be32_to_cpus(&entry->bitmap_table_size);
74
83
- be32_to_cpus(&entry->flags);
84
- be16_to_cpus(&entry->name_size);
85
- be32_to_cpus(&entry->extra_data_size);
86
+ entry->bitmap_table_offset = be64_to_cpu(entry->bitmap_table_offset);
87
+ entry->bitmap_table_size = be32_to_cpu(entry->bitmap_table_size);
88
+ entry->flags = be32_to_cpu(entry->flags);
89
+ entry->name_size = be16_to_cpu(entry->name_size);
90
+ entry->extra_data_size = be32_to_cpu(entry->extra_data_size);
91
}
92
93
static inline void bitmap_dir_entry_to_be(Qcow2BitmapDirEntry *entry)
94
{
95
- cpu_to_be64s(&entry->bitmap_table_offset);
96
- cpu_to_be32s(&entry->bitmap_table_size);
97
- cpu_to_be32s(&entry->flags);
98
- cpu_to_be16s(&entry->name_size);
99
- cpu_to_be32s(&entry->extra_data_size);
100
+ entry->bitmap_table_offset = cpu_to_be64(entry->bitmap_table_offset);
101
+ entry->bitmap_table_size = cpu_to_be32(entry->bitmap_table_size);
102
+ entry->flags = cpu_to_be32(entry->flags);
103
+ entry->name_size = cpu_to_be16(entry->name_size);
104
+ entry->extra_data_size = cpu_to_be32(entry->extra_data_size);
105
}
106
107
static inline int calc_dir_entry_size(size_t name_size, size_t extra_data_size)
108
--
75
--
109
2.19.1
76
2.20.1
110
77
111
78
diff view generated by jsdifflib
Deleted patch
1
From: Daniel P. Berrangé <berrange@redhat.com>
2
1
3
The qcow2 block driver expects to see a valid sector size even when it
4
has opened the crypto layer with QCRYPTO_BLOCK_OPEN_NO_IO.
5
6
Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
7
Reviewed-by: Alberto Garcia <berto@igalia.com>
8
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
9
---
10
crypto/block-qcow.c | 2 ++
11
1 file changed, 2 insertions(+)
12
13
diff --git a/crypto/block-qcow.c b/crypto/block-qcow.c
14
index XXXXXXX..XXXXXXX 100644
15
--- a/crypto/block-qcow.c
16
+++ b/crypto/block-qcow.c
17
@@ -XXX,XX +XXX,XX @@ qcrypto_block_qcow_open(QCryptoBlock *block,
18
Error **errp)
19
{
20
if (flags & QCRYPTO_BLOCK_OPEN_NO_IO) {
21
+ block->sector_size = QCRYPTO_BLOCK_QCOW_SECTOR_SIZE;
22
+ block->payload_offset = 0;
23
return 0;
24
} else {
25
if (!options->u.qcow.key_secret) {
26
--
27
2.19.1
28
29
diff view generated by jsdifflib
Deleted patch
1
From: Alberto Garcia <berto@igalia.com>
2
1
3
This doesn't have any practical effect at the moment because the
4
values of BDRV_SECTOR_SIZE, QCRYPTO_BLOCK_LUKS_SECTOR_SIZE and
5
QCRYPTO_BLOCK_QCOW_SECTOR_SIZE are all the same (512 bytes), but
6
future encryption methods could have different requirements.
7
8
Signed-off-by: Alberto Garcia <berto@igalia.com>
9
Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>
10
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
11
---
12
block/qcow2.c | 2 +-
13
1 file changed, 1 insertion(+), 1 deletion(-)
14
15
diff --git a/block/qcow2.c b/block/qcow2.c
16
index XXXXXXX..XXXXXXX 100644
17
--- a/block/qcow2.c
18
+++ b/block/qcow2.c
19
@@ -XXX,XX +XXX,XX @@ static void qcow2_refresh_limits(BlockDriverState *bs, Error **errp)
20
21
if (bs->encrypted) {
22
/* Encryption works on a sector granularity */
23
- bs->bl.request_alignment = BDRV_SECTOR_SIZE;
24
+ bs->bl.request_alignment = qcrypto_block_get_sector_size(s->crypto);
25
}
26
bs->bl.pwrite_zeroes_alignment = s->cluster_size;
27
bs->bl.pdiscard_alignment = s->cluster_size;
28
--
29
2.19.1
30
31
diff view generated by jsdifflib
1
From: Li Qiang <liq3ea@163.com>
1
From: Max Reitz <mreitz@redhat.com>
2
2
3
Signed-off-by: Li Qiang <liq3ea@163.com>
3
When changing a node's AioContext, the caller must acquire the old
4
Reviewed-by: Alberto Garcia <berto@igalia.com>
4
AioContext (unless it currently runs in that old context). Therefore,
5
unless the node currently is in the main context, we always have to
6
acquire the old context around calls that may change a node's
7
AioContext.
8
9
Signed-off-by: Max Reitz <mreitz@redhat.com>
5
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
10
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
6
---
11
---
7
include/sysemu/block-backend.h | 6 +++---
12
tests/test-block-iothread.c | 40 ++++++++++++++++++++++++-------------
8
block/block-backend.c | 8 ++++----
13
1 file changed, 26 insertions(+), 14 deletions(-)
9
2 files changed, 7 insertions(+), 7 deletions(-)
10
14
11
diff --git a/include/sysemu/block-backend.h b/include/sysemu/block-backend.h
15
diff --git a/tests/test-block-iothread.c b/tests/test-block-iothread.c
12
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
13
--- a/include/sysemu/block-backend.h
17
--- a/tests/test-block-iothread.c
14
+++ b/include/sysemu/block-backend.h
18
+++ b/tests/test-block-iothread.c
15
@@ -XXX,XX +XXX,XX @@ BlockErrorAction blk_get_error_action(BlockBackend *blk, bool is_read,
19
@@ -XXX,XX +XXX,XX @@ static void test_sync_op(const void *opaque)
16
int error);
20
if (t->blkfn) {
17
void blk_error_action(BlockBackend *blk, BlockErrorAction action,
21
t->blkfn(blk);
18
bool is_read, int error);
19
-int blk_is_read_only(BlockBackend *blk);
20
-int blk_is_sg(BlockBackend *blk);
21
-int blk_enable_write_cache(BlockBackend *blk);
22
+bool blk_is_read_only(BlockBackend *blk);
23
+bool blk_is_sg(BlockBackend *blk);
24
+bool blk_enable_write_cache(BlockBackend *blk);
25
void blk_set_enable_write_cache(BlockBackend *blk, bool wce);
26
void blk_invalidate_cache(BlockBackend *blk, Error **errp);
27
bool blk_is_inserted(BlockBackend *blk);
28
diff --git a/block/block-backend.c b/block/block-backend.c
29
index XXXXXXX..XXXXXXX 100644
30
--- a/block/block-backend.c
31
+++ b/block/block-backend.c
32
@@ -XXX,XX +XXX,XX @@ void blk_error_action(BlockBackend *blk, BlockErrorAction action,
33
}
22
}
34
}
23
- aio_context_release(ctx);
35
24
blk_set_aio_context(blk, qemu_get_aio_context(), &error_abort);
36
-int blk_is_read_only(BlockBackend *blk)
25
+ aio_context_release(ctx);
37
+bool blk_is_read_only(BlockBackend *blk)
26
27
bdrv_unref(bs);
28
blk_unref(blk);
29
@@ -XXX,XX +XXX,XX @@ static void test_propagate_basic(void)
38
{
30
{
39
BlockDriverState *bs = blk_bs(blk);
31
IOThread *iothread = iothread_new();
40
32
AioContext *ctx = iothread_get_aio_context(iothread);
41
@@ -XXX,XX +XXX,XX @@ int blk_is_read_only(BlockBackend *blk)
33
+ AioContext *main_ctx;
42
}
34
BlockBackend *blk;
43
}
35
BlockDriverState *bs_a, *bs_b, *bs_verify;
44
36
QDict *options;
45
-int blk_is_sg(BlockBackend *blk)
37
@@ -XXX,XX +XXX,XX @@ static void test_propagate_basic(void)
46
+bool blk_is_sg(BlockBackend *blk)
38
g_assert(bdrv_get_aio_context(bs_b) == ctx);
39
40
/* Switch the AioContext back */
41
- ctx = qemu_get_aio_context();
42
- blk_set_aio_context(blk, ctx, &error_abort);
43
- g_assert(blk_get_aio_context(blk) == ctx);
44
- g_assert(bdrv_get_aio_context(bs_a) == ctx);
45
- g_assert(bdrv_get_aio_context(bs_verify) == ctx);
46
- g_assert(bdrv_get_aio_context(bs_b) == ctx);
47
+ main_ctx = qemu_get_aio_context();
48
+ aio_context_acquire(ctx);
49
+ blk_set_aio_context(blk, main_ctx, &error_abort);
50
+ aio_context_release(ctx);
51
+ g_assert(blk_get_aio_context(blk) == main_ctx);
52
+ g_assert(bdrv_get_aio_context(bs_a) == main_ctx);
53
+ g_assert(bdrv_get_aio_context(bs_verify) == main_ctx);
54
+ g_assert(bdrv_get_aio_context(bs_b) == main_ctx);
55
56
bdrv_unref(bs_verify);
57
bdrv_unref(bs_b);
58
@@ -XXX,XX +XXX,XX @@ static void test_propagate_diamond(void)
47
{
59
{
48
BlockDriverState *bs = blk_bs(blk);
60
IOThread *iothread = iothread_new();
49
61
AioContext *ctx = iothread_get_aio_context(iothread);
50
if (!bs) {
62
+ AioContext *main_ctx;
51
- return 0;
63
BlockBackend *blk;
52
+ return false;
64
BlockDriverState *bs_a, *bs_b, *bs_c, *bs_verify;
53
}
65
QDict *options;
54
66
@@ -XXX,XX +XXX,XX @@ static void test_propagate_diamond(void)
55
return bdrv_is_sg(bs);
67
g_assert(bdrv_get_aio_context(bs_c) == ctx);
56
}
68
57
69
/* Switch the AioContext back */
58
-int blk_enable_write_cache(BlockBackend *blk)
70
- ctx = qemu_get_aio_context();
59
+bool blk_enable_write_cache(BlockBackend *blk)
71
- blk_set_aio_context(blk, ctx, &error_abort);
60
{
72
- g_assert(blk_get_aio_context(blk) == ctx);
61
return blk->enable_write_cache;
73
- g_assert(bdrv_get_aio_context(bs_verify) == ctx);
74
- g_assert(bdrv_get_aio_context(bs_a) == ctx);
75
- g_assert(bdrv_get_aio_context(bs_b) == ctx);
76
- g_assert(bdrv_get_aio_context(bs_c) == ctx);
77
+ main_ctx = qemu_get_aio_context();
78
+ aio_context_acquire(ctx);
79
+ blk_set_aio_context(blk, main_ctx, &error_abort);
80
+ aio_context_release(ctx);
81
+ g_assert(blk_get_aio_context(blk) == main_ctx);
82
+ g_assert(bdrv_get_aio_context(bs_verify) == main_ctx);
83
+ g_assert(bdrv_get_aio_context(bs_a) == main_ctx);
84
+ g_assert(bdrv_get_aio_context(bs_b) == main_ctx);
85
+ g_assert(bdrv_get_aio_context(bs_c) == main_ctx);
86
87
blk_unref(blk);
88
bdrv_unref(bs_verify);
89
@@ -XXX,XX +XXX,XX @@ static void test_attach_second_node(void)
90
g_assert(bdrv_get_aio_context(bs) == ctx);
91
g_assert(bdrv_get_aio_context(filter) == ctx);
92
93
+ aio_context_acquire(ctx);
94
blk_set_aio_context(blk, main_ctx, &error_abort);
95
+ aio_context_release(ctx);
96
g_assert(blk_get_aio_context(blk) == main_ctx);
97
g_assert(bdrv_get_aio_context(bs) == main_ctx);
98
g_assert(bdrv_get_aio_context(filter) == main_ctx);
99
@@ -XXX,XX +XXX,XX @@ static void test_attach_preserve_blk_ctx(void)
100
g_assert(bdrv_get_aio_context(bs) == ctx);
101
102
/* Remove the node again */
103
+ aio_context_acquire(ctx);
104
blk_remove_bs(blk);
105
+ aio_context_release(ctx);
106
g_assert(blk_get_aio_context(blk) == ctx);
107
g_assert(bdrv_get_aio_context(bs) == qemu_get_aio_context());
108
109
@@ -XXX,XX +XXX,XX @@ static void test_attach_preserve_blk_ctx(void)
110
g_assert(blk_get_aio_context(blk) == ctx);
111
g_assert(bdrv_get_aio_context(bs) == ctx);
112
113
+ aio_context_acquire(ctx);
114
blk_set_aio_context(blk, qemu_get_aio_context(), &error_abort);
115
+ aio_context_release(ctx);
116
bdrv_unref(bs);
117
blk_unref(blk);
62
}
118
}
63
--
119
--
64
2.19.1
120
2.20.1
65
121
66
122
diff view generated by jsdifflib
Deleted patch
1
From: Cleber Rosa <crosa@redhat.com>
2
1
3
While testing the Python 3 changes which touch the 083 test, I noticed
4
that it would fail with qcow2. Expanding the testing, I noticed it
5
had nothing to do with the Python 3 changes, and in fact, it would not
6
pass on anything but raw:
7
8
raw: pass
9
bochs: not generic
10
cloop: not generic
11
parallels: fail
12
qcow: fail
13
qcow2: fail
14
qed: fail
15
vdi: fail
16
vhdx: fail
17
vmdk: fail
18
vpc: fail
19
luks: fail
20
21
The errors are a mixture I/O and "image not in xxx format", such as:
22
23
=== Check disconnect before data ===
24
25
Unexpected end-of-file before all bytes were read
26
-read failed: Input/output error
27
+can't open device nbd+tcp://127.0.0.1:PORT/foo: Could not open 'nbd://127.0.0.1:PORT/foo': Input/output error
28
29
=== Check disconnect after data ===
30
31
-read 512/512 bytes at offset 0
32
-512 bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
33
+can't open device nbd+tcp://127.0.0.1:PORT/foo: Image not in qcow format
34
35
I'm not aware if there's a quick fix, so, for the time being, it looks
36
like the honest approach is to make the test known to work on raw
37
only.
38
39
Signed-off-by: Cleber Rosa <crosa@redhat.com>
40
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
41
---
42
tests/qemu-iotests/083 | 2 +-
43
1 file changed, 1 insertion(+), 1 deletion(-)
44
45
diff --git a/tests/qemu-iotests/083 b/tests/qemu-iotests/083
46
index XXXXXXX..XXXXXXX 100755
47
--- a/tests/qemu-iotests/083
48
+++ b/tests/qemu-iotests/083
49
@@ -XXX,XX +XXX,XX @@ trap "_cleanup; exit \$status" 0 1 2 3 15
50
. ./common.rc
51
. ./common.filter
52
53
-_supported_fmt generic
54
+_supported_fmt raw
55
_supported_proto nbd
56
_supported_os Linux
57
58
--
59
2.19.1
60
61
diff view generated by jsdifflib
Deleted patch
1
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
2
Reviewed-by: Alberto Garcia <berto@igalia.com>
3
---
4
block/vpc.c | 2 ++
5
1 file changed, 2 insertions(+)
6
1
7
diff --git a/block/vpc.c b/block/vpc.c
8
index XXXXXXX..XXXXXXX 100644
9
--- a/block/vpc.c
10
+++ b/block/vpc.c
11
@@ -XXX,XX +XXX,XX @@ static int vpc_open(BlockDriverState *bs, QDict *options, int flags,
12
}
13
14
qemu_co_mutex_init(&s->lock);
15
+ qemu_opts_del(opts);
16
17
return 0;
18
19
fail:
20
+ qemu_opts_del(opts);
21
qemu_vfree(s->pagetable);
22
#ifdef CACHE
23
g_free(s->pageentry_u8);
24
--
25
2.19.1
26
27
diff view generated by jsdifflib
Deleted patch
1
From: Peter Maydell <peter.maydell@linaro.org>
2
1
3
Taking the address of a field in a packed struct is a bad idea, because
4
it might not be actually aligned enough for that pointer type (and
5
thus cause a crash on dereference on some host architectures). Newer
6
versions of clang warn about this. Avoid the bug by not using the
7
"modify in place" byte swapping functions.
8
9
There are a few places where the in-place swap function is
10
used on something other than a packed struct field; we convert
11
those anyway, for consistency.
12
13
Patch produced with scripts/coccinelle/inplace-byteswaps.cocci.
14
15
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
16
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
17
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
18
---
19
block/vhdx.h | 12 ++---
20
block/vhdx-endian.c | 118 ++++++++++++++++++++++----------------------
21
block/vhdx-log.c | 4 +-
22
block/vhdx.c | 18 +++----
23
4 files changed, 76 insertions(+), 76 deletions(-)
24
25
diff --git a/block/vhdx.h b/block/vhdx.h
26
index XXXXXXX..XXXXXXX 100644
27
--- a/block/vhdx.h
28
+++ b/block/vhdx.h
29
@@ -XXX,XX +XXX,XX @@ int vhdx_log_write_and_flush(BlockDriverState *bs, BDRVVHDXState *s,
30
31
static inline void leguid_to_cpus(MSGUID *guid)
32
{
33
- le32_to_cpus(&guid->data1);
34
- le16_to_cpus(&guid->data2);
35
- le16_to_cpus(&guid->data3);
36
+ guid->data1 = le32_to_cpu(guid->data1);
37
+ guid->data2 = le16_to_cpu(guid->data2);
38
+ guid->data3 = le16_to_cpu(guid->data3);
39
}
40
41
static inline void cpu_to_leguids(MSGUID *guid)
42
{
43
- cpu_to_le32s(&guid->data1);
44
- cpu_to_le16s(&guid->data2);
45
- cpu_to_le16s(&guid->data3);
46
+ guid->data1 = cpu_to_le32(guid->data1);
47
+ guid->data2 = cpu_to_le16(guid->data2);
48
+ guid->data3 = cpu_to_le16(guid->data3);
49
}
50
51
void vhdx_header_le_import(VHDXHeader *h);
52
diff --git a/block/vhdx-endian.c b/block/vhdx-endian.c
53
index XXXXXXX..XXXXXXX 100644
54
--- a/block/vhdx-endian.c
55
+++ b/block/vhdx-endian.c
56
@@ -XXX,XX +XXX,XX @@ void vhdx_header_le_import(VHDXHeader *h)
57
{
58
assert(h != NULL);
59
60
- le32_to_cpus(&h->signature);
61
- le32_to_cpus(&h->checksum);
62
- le64_to_cpus(&h->sequence_number);
63
+ h->signature = le32_to_cpu(h->signature);
64
+ h->checksum = le32_to_cpu(h->checksum);
65
+ h->sequence_number = le64_to_cpu(h->sequence_number);
66
67
leguid_to_cpus(&h->file_write_guid);
68
leguid_to_cpus(&h->data_write_guid);
69
leguid_to_cpus(&h->log_guid);
70
71
- le16_to_cpus(&h->log_version);
72
- le16_to_cpus(&h->version);
73
- le32_to_cpus(&h->log_length);
74
- le64_to_cpus(&h->log_offset);
75
+ h->log_version = le16_to_cpu(h->log_version);
76
+ h->version = le16_to_cpu(h->version);
77
+ h->log_length = le32_to_cpu(h->log_length);
78
+ h->log_offset = le64_to_cpu(h->log_offset);
79
}
80
81
void vhdx_header_le_export(VHDXHeader *orig_h, VHDXHeader *new_h)
82
@@ -XXX,XX +XXX,XX @@ void vhdx_log_desc_le_import(VHDXLogDescriptor *d)
83
{
84
assert(d != NULL);
85
86
- le32_to_cpus(&d->signature);
87
- le64_to_cpus(&d->file_offset);
88
- le64_to_cpus(&d->sequence_number);
89
+ d->signature = le32_to_cpu(d->signature);
90
+ d->file_offset = le64_to_cpu(d->file_offset);
91
+ d->sequence_number = le64_to_cpu(d->sequence_number);
92
}
93
94
void vhdx_log_desc_le_export(VHDXLogDescriptor *d)
95
{
96
assert(d != NULL);
97
98
- cpu_to_le32s(&d->signature);
99
- cpu_to_le32s(&d->trailing_bytes);
100
- cpu_to_le64s(&d->leading_bytes);
101
- cpu_to_le64s(&d->file_offset);
102
- cpu_to_le64s(&d->sequence_number);
103
+ d->signature = cpu_to_le32(d->signature);
104
+ d->trailing_bytes = cpu_to_le32(d->trailing_bytes);
105
+ d->leading_bytes = cpu_to_le64(d->leading_bytes);
106
+ d->file_offset = cpu_to_le64(d->file_offset);
107
+ d->sequence_number = cpu_to_le64(d->sequence_number);
108
}
109
110
void vhdx_log_data_le_import(VHDXLogDataSector *d)
111
{
112
assert(d != NULL);
113
114
- le32_to_cpus(&d->data_signature);
115
- le32_to_cpus(&d->sequence_high);
116
- le32_to_cpus(&d->sequence_low);
117
+ d->data_signature = le32_to_cpu(d->data_signature);
118
+ d->sequence_high = le32_to_cpu(d->sequence_high);
119
+ d->sequence_low = le32_to_cpu(d->sequence_low);
120
}
121
122
void vhdx_log_data_le_export(VHDXLogDataSector *d)
123
{
124
assert(d != NULL);
125
126
- cpu_to_le32s(&d->data_signature);
127
- cpu_to_le32s(&d->sequence_high);
128
- cpu_to_le32s(&d->sequence_low);
129
+ d->data_signature = cpu_to_le32(d->data_signature);
130
+ d->sequence_high = cpu_to_le32(d->sequence_high);
131
+ d->sequence_low = cpu_to_le32(d->sequence_low);
132
}
133
134
void vhdx_log_entry_hdr_le_import(VHDXLogEntryHeader *hdr)
135
{
136
assert(hdr != NULL);
137
138
- le32_to_cpus(&hdr->signature);
139
- le32_to_cpus(&hdr->checksum);
140
- le32_to_cpus(&hdr->entry_length);
141
- le32_to_cpus(&hdr->tail);
142
- le64_to_cpus(&hdr->sequence_number);
143
- le32_to_cpus(&hdr->descriptor_count);
144
+ hdr->signature = le32_to_cpu(hdr->signature);
145
+ hdr->checksum = le32_to_cpu(hdr->checksum);
146
+ hdr->entry_length = le32_to_cpu(hdr->entry_length);
147
+ hdr->tail = le32_to_cpu(hdr->tail);
148
+ hdr->sequence_number = le64_to_cpu(hdr->sequence_number);
149
+ hdr->descriptor_count = le32_to_cpu(hdr->descriptor_count);
150
leguid_to_cpus(&hdr->log_guid);
151
- le64_to_cpus(&hdr->flushed_file_offset);
152
- le64_to_cpus(&hdr->last_file_offset);
153
+ hdr->flushed_file_offset = le64_to_cpu(hdr->flushed_file_offset);
154
+ hdr->last_file_offset = le64_to_cpu(hdr->last_file_offset);
155
}
156
157
void vhdx_log_entry_hdr_le_export(VHDXLogEntryHeader *hdr)
158
{
159
assert(hdr != NULL);
160
161
- cpu_to_le32s(&hdr->signature);
162
- cpu_to_le32s(&hdr->checksum);
163
- cpu_to_le32s(&hdr->entry_length);
164
- cpu_to_le32s(&hdr->tail);
165
- cpu_to_le64s(&hdr->sequence_number);
166
- cpu_to_le32s(&hdr->descriptor_count);
167
+ hdr->signature = cpu_to_le32(hdr->signature);
168
+ hdr->checksum = cpu_to_le32(hdr->checksum);
169
+ hdr->entry_length = cpu_to_le32(hdr->entry_length);
170
+ hdr->tail = cpu_to_le32(hdr->tail);
171
+ hdr->sequence_number = cpu_to_le64(hdr->sequence_number);
172
+ hdr->descriptor_count = cpu_to_le32(hdr->descriptor_count);
173
cpu_to_leguids(&hdr->log_guid);
174
- cpu_to_le64s(&hdr->flushed_file_offset);
175
- cpu_to_le64s(&hdr->last_file_offset);
176
+ hdr->flushed_file_offset = cpu_to_le64(hdr->flushed_file_offset);
177
+ hdr->last_file_offset = cpu_to_le64(hdr->last_file_offset);
178
}
179
180
181
@@ -XXX,XX +XXX,XX @@ void vhdx_region_header_le_import(VHDXRegionTableHeader *hdr)
182
{
183
assert(hdr != NULL);
184
185
- le32_to_cpus(&hdr->signature);
186
- le32_to_cpus(&hdr->checksum);
187
- le32_to_cpus(&hdr->entry_count);
188
+ hdr->signature = le32_to_cpu(hdr->signature);
189
+ hdr->checksum = le32_to_cpu(hdr->checksum);
190
+ hdr->entry_count = le32_to_cpu(hdr->entry_count);
191
}
192
193
void vhdx_region_header_le_export(VHDXRegionTableHeader *hdr)
194
{
195
assert(hdr != NULL);
196
197
- cpu_to_le32s(&hdr->signature);
198
- cpu_to_le32s(&hdr->checksum);
199
- cpu_to_le32s(&hdr->entry_count);
200
+ hdr->signature = cpu_to_le32(hdr->signature);
201
+ hdr->checksum = cpu_to_le32(hdr->checksum);
202
+ hdr->entry_count = cpu_to_le32(hdr->entry_count);
203
}
204
205
void vhdx_region_entry_le_import(VHDXRegionTableEntry *e)
206
@@ -XXX,XX +XXX,XX @@ void vhdx_region_entry_le_import(VHDXRegionTableEntry *e)
207
assert(e != NULL);
208
209
leguid_to_cpus(&e->guid);
210
- le64_to_cpus(&e->file_offset);
211
- le32_to_cpus(&e->length);
212
- le32_to_cpus(&e->data_bits);
213
+ e->file_offset = le64_to_cpu(e->file_offset);
214
+ e->length = le32_to_cpu(e->length);
215
+ e->data_bits = le32_to_cpu(e->data_bits);
216
}
217
218
void vhdx_region_entry_le_export(VHDXRegionTableEntry *e)
219
@@ -XXX,XX +XXX,XX @@ void vhdx_region_entry_le_export(VHDXRegionTableEntry *e)
220
assert(e != NULL);
221
222
cpu_to_leguids(&e->guid);
223
- cpu_to_le64s(&e->file_offset);
224
- cpu_to_le32s(&e->length);
225
- cpu_to_le32s(&e->data_bits);
226
+ e->file_offset = cpu_to_le64(e->file_offset);
227
+ e->length = cpu_to_le32(e->length);
228
+ e->data_bits = cpu_to_le32(e->data_bits);
229
}
230
231
232
@@ -XXX,XX +XXX,XX @@ void vhdx_metadata_header_le_import(VHDXMetadataTableHeader *hdr)
233
{
234
assert(hdr != NULL);
235
236
- le64_to_cpus(&hdr->signature);
237
- le16_to_cpus(&hdr->entry_count);
238
+ hdr->signature = le64_to_cpu(hdr->signature);
239
+ hdr->entry_count = le16_to_cpu(hdr->entry_count);
240
}
241
242
void vhdx_metadata_header_le_export(VHDXMetadataTableHeader *hdr)
243
{
244
assert(hdr != NULL);
245
246
- cpu_to_le64s(&hdr->signature);
247
- cpu_to_le16s(&hdr->entry_count);
248
+ hdr->signature = cpu_to_le64(hdr->signature);
249
+ hdr->entry_count = cpu_to_le16(hdr->entry_count);
250
}
251
252
void vhdx_metadata_entry_le_import(VHDXMetadataTableEntry *e)
253
@@ -XXX,XX +XXX,XX @@ void vhdx_metadata_entry_le_import(VHDXMetadataTableEntry *e)
254
assert(e != NULL);
255
256
leguid_to_cpus(&e->item_id);
257
- le32_to_cpus(&e->offset);
258
- le32_to_cpus(&e->length);
259
- le32_to_cpus(&e->data_bits);
260
+ e->offset = le32_to_cpu(e->offset);
261
+ e->length = le32_to_cpu(e->length);
262
+ e->data_bits = le32_to_cpu(e->data_bits);
263
}
264
void vhdx_metadata_entry_le_export(VHDXMetadataTableEntry *e)
265
{
266
assert(e != NULL);
267
268
cpu_to_leguids(&e->item_id);
269
- cpu_to_le32s(&e->offset);
270
- cpu_to_le32s(&e->length);
271
- cpu_to_le32s(&e->data_bits);
272
+ e->offset = cpu_to_le32(e->offset);
273
+ e->length = cpu_to_le32(e->length);
274
+ e->data_bits = cpu_to_le32(e->data_bits);
275
}
276
diff --git a/block/vhdx-log.c b/block/vhdx-log.c
277
index XXXXXXX..XXXXXXX 100644
278
--- a/block/vhdx-log.c
279
+++ b/block/vhdx-log.c
280
@@ -XXX,XX +XXX,XX @@ static void vhdx_log_raw_to_le_sector(VHDXLogDescriptor *desc,
281
/* 8 + 4084 + 4 = 4096, 1 log sector */
282
memcpy(&desc->leading_bytes, data, 8);
283
data += 8;
284
- cpu_to_le64s(&desc->leading_bytes);
285
+ desc->leading_bytes = cpu_to_le64(desc->leading_bytes);
286
memcpy(sector->data, data, 4084);
287
data += 4084;
288
memcpy(&desc->trailing_bytes, data, 4);
289
- cpu_to_le32s(&desc->trailing_bytes);
290
+ desc->trailing_bytes = cpu_to_le32(desc->trailing_bytes);
291
data += 4;
292
293
sector->sequence_high = (uint32_t) (seq >> 32);
294
diff --git a/block/vhdx.c b/block/vhdx.c
295
index XXXXXXX..XXXXXXX 100644
296
--- a/block/vhdx.c
297
+++ b/block/vhdx.c
298
@@ -XXX,XX +XXX,XX @@ uint32_t vhdx_update_checksum(uint8_t *buf, size_t size, int crc_offset)
299
300
memset(buf + crc_offset, 0, sizeof(crc));
301
crc = crc32c(0xffffffff, buf, size);
302
- cpu_to_le32s(&crc);
303
+ crc = cpu_to_le32(crc);
304
memcpy(buf + crc_offset, &crc, sizeof(crc));
305
306
return crc;
307
@@ -XXX,XX +XXX,XX @@ static int vhdx_parse_metadata(BlockDriverState *bs, BDRVVHDXState *s)
308
goto exit;
309
}
310
311
- le32_to_cpus(&s->params.block_size);
312
- le32_to_cpus(&s->params.data_bits);
313
+ s->params.block_size = le32_to_cpu(s->params.block_size);
314
+ s->params.data_bits = le32_to_cpu(s->params.data_bits);
315
316
317
/* We now have the file parameters, so we can tell if this is a
318
@@ -XXX,XX +XXX,XX @@ static int vhdx_parse_metadata(BlockDriverState *bs, BDRVVHDXState *s)
319
goto exit;
320
}
321
322
- le64_to_cpus(&s->virtual_disk_size);
323
- le32_to_cpus(&s->logical_sector_size);
324
- le32_to_cpus(&s->physical_sector_size);
325
+ s->virtual_disk_size = le64_to_cpu(s->virtual_disk_size);
326
+ s->logical_sector_size = le32_to_cpu(s->logical_sector_size);
327
+ s->physical_sector_size = le32_to_cpu(s->physical_sector_size);
328
329
if (s->params.block_size < VHDX_BLOCK_SIZE_MIN ||
330
s->params.block_size > VHDX_BLOCK_SIZE_MAX) {
331
@@ -XXX,XX +XXX,XX @@ static int vhdx_open(BlockDriverState *bs, QDict *options, int flags,
332
/* endian convert, and verify populated BAT field file offsets against
333
* region table and log entries */
334
for (i = 0; i < s->bat_entries; i++) {
335
- le64_to_cpus(&s->bat[i]);
336
+ s->bat[i] = le64_to_cpu(s->bat[i]);
337
if (payblocks--) {
338
/* payload bat entries */
339
if ((s->bat[i] & VHDX_BAT_STATE_BIT_MASK) ==
340
@@ -XXX,XX +XXX,XX @@ static int vhdx_create_new_metadata(BlockBackend *blk,
341
mt_file_params->block_size = cpu_to_le32(block_size);
342
if (type == VHDX_TYPE_FIXED) {
343
mt_file_params->data_bits |= VHDX_PARAMS_LEAVE_BLOCKS_ALLOCED;
344
- cpu_to_le32s(&mt_file_params->data_bits);
345
+ mt_file_params->data_bits = cpu_to_le32(mt_file_params->data_bits);
346
}
347
348
vhdx_guid_generate(&mt_page83->page_83_data);
349
@@ -XXX,XX +XXX,XX @@ static int vhdx_create_bat(BlockBackend *blk, BDRVVHDXState *s,
350
sinfo.file_offset = ROUND_UP(sinfo.file_offset, MiB);
351
vhdx_update_bat_table_entry(blk_bs(blk), s, &sinfo, &unused, &unused,
352
block_state);
353
- cpu_to_le64s(&s->bat[sinfo.bat_idx]);
354
+ s->bat[sinfo.bat_idx] = cpu_to_le64(s->bat[sinfo.bat_idx]);
355
sector_num += s->sectors_per_block;
356
}
357
ret = blk_pwrite(blk, file_offset, s->bat, length, 0);
358
--
359
2.19.1
360
361
diff view generated by jsdifflib
Deleted patch
1
From: Peter Maydell <peter.maydell@linaro.org>
2
1
3
Taking the address of a field in a packed struct is a bad idea, because
4
it might not be actually aligned enough for that pointer type (and
5
thus cause a crash on dereference on some host architectures). Newer
6
versions of clang warn about this. Avoid the bug by not using the
7
"modify in place" byte swapping functions.
8
9
There are a few places where the in-place swap function is
10
used on something other than a packed struct field; we convert
11
those anyway, for consistency.
12
13
Patch produced with scripts/coccinelle/inplace-byteswaps.cocci.
14
15
There are other places where we take the address of a packed member
16
in this file for other purposes than passing it to a byteswap
17
function (all the calls to qemu_uuid_*()); we leave those for now.
18
19
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
20
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
21
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
22
---
23
block/vdi.c | 64 ++++++++++++++++++++++++++---------------------------
24
1 file changed, 32 insertions(+), 32 deletions(-)
25
26
diff --git a/block/vdi.c b/block/vdi.c
27
index XXXXXXX..XXXXXXX 100644
28
--- a/block/vdi.c
29
+++ b/block/vdi.c
30
@@ -XXX,XX +XXX,XX @@ typedef struct {
31
32
static void vdi_header_to_cpu(VdiHeader *header)
33
{
34
- le32_to_cpus(&header->signature);
35
- le32_to_cpus(&header->version);
36
- le32_to_cpus(&header->header_size);
37
- le32_to_cpus(&header->image_type);
38
- le32_to_cpus(&header->image_flags);
39
- le32_to_cpus(&header->offset_bmap);
40
- le32_to_cpus(&header->offset_data);
41
- le32_to_cpus(&header->cylinders);
42
- le32_to_cpus(&header->heads);
43
- le32_to_cpus(&header->sectors);
44
- le32_to_cpus(&header->sector_size);
45
- le64_to_cpus(&header->disk_size);
46
- le32_to_cpus(&header->block_size);
47
- le32_to_cpus(&header->block_extra);
48
- le32_to_cpus(&header->blocks_in_image);
49
- le32_to_cpus(&header->blocks_allocated);
50
+ header->signature = le32_to_cpu(header->signature);
51
+ header->version = le32_to_cpu(header->version);
52
+ header->header_size = le32_to_cpu(header->header_size);
53
+ header->image_type = le32_to_cpu(header->image_type);
54
+ header->image_flags = le32_to_cpu(header->image_flags);
55
+ header->offset_bmap = le32_to_cpu(header->offset_bmap);
56
+ header->offset_data = le32_to_cpu(header->offset_data);
57
+ header->cylinders = le32_to_cpu(header->cylinders);
58
+ header->heads = le32_to_cpu(header->heads);
59
+ header->sectors = le32_to_cpu(header->sectors);
60
+ header->sector_size = le32_to_cpu(header->sector_size);
61
+ header->disk_size = le64_to_cpu(header->disk_size);
62
+ header->block_size = le32_to_cpu(header->block_size);
63
+ header->block_extra = le32_to_cpu(header->block_extra);
64
+ header->blocks_in_image = le32_to_cpu(header->blocks_in_image);
65
+ header->blocks_allocated = le32_to_cpu(header->blocks_allocated);
66
qemu_uuid_bswap(&header->uuid_image);
67
qemu_uuid_bswap(&header->uuid_last_snap);
68
qemu_uuid_bswap(&header->uuid_link);
69
@@ -XXX,XX +XXX,XX @@ static void vdi_header_to_cpu(VdiHeader *header)
70
71
static void vdi_header_to_le(VdiHeader *header)
72
{
73
- cpu_to_le32s(&header->signature);
74
- cpu_to_le32s(&header->version);
75
- cpu_to_le32s(&header->header_size);
76
- cpu_to_le32s(&header->image_type);
77
- cpu_to_le32s(&header->image_flags);
78
- cpu_to_le32s(&header->offset_bmap);
79
- cpu_to_le32s(&header->offset_data);
80
- cpu_to_le32s(&header->cylinders);
81
- cpu_to_le32s(&header->heads);
82
- cpu_to_le32s(&header->sectors);
83
- cpu_to_le32s(&header->sector_size);
84
- cpu_to_le64s(&header->disk_size);
85
- cpu_to_le32s(&header->block_size);
86
- cpu_to_le32s(&header->block_extra);
87
- cpu_to_le32s(&header->blocks_in_image);
88
- cpu_to_le32s(&header->blocks_allocated);
89
+ header->signature = cpu_to_le32(header->signature);
90
+ header->version = cpu_to_le32(header->version);
91
+ header->header_size = cpu_to_le32(header->header_size);
92
+ header->image_type = cpu_to_le32(header->image_type);
93
+ header->image_flags = cpu_to_le32(header->image_flags);
94
+ header->offset_bmap = cpu_to_le32(header->offset_bmap);
95
+ header->offset_data = cpu_to_le32(header->offset_data);
96
+ header->cylinders = cpu_to_le32(header->cylinders);
97
+ header->heads = cpu_to_le32(header->heads);
98
+ header->sectors = cpu_to_le32(header->sectors);
99
+ header->sector_size = cpu_to_le32(header->sector_size);
100
+ header->disk_size = cpu_to_le64(header->disk_size);
101
+ header->block_size = cpu_to_le32(header->block_size);
102
+ header->block_extra = cpu_to_le32(header->block_extra);
103
+ header->blocks_in_image = cpu_to_le32(header->blocks_in_image);
104
+ header->blocks_allocated = cpu_to_le32(header->blocks_allocated);
105
qemu_uuid_bswap(&header->uuid_image);
106
qemu_uuid_bswap(&header->uuid_last_snap);
107
qemu_uuid_bswap(&header->uuid_link);
108
--
109
2.19.1
110
111
diff view generated by jsdifflib
Deleted patch
1
From: Alberto Garcia <berto@igalia.com>
2
1
3
This is a static function with only one caller, so there's no need to
4
keep it. Inlining the code in quorum_compare() makes it much simpler.
5
6
Signed-off-by: Alberto Garcia <berto@igalia.com>
7
Reported-by: Markus Armbruster <armbru@redhat.com>
8
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
9
---
10
block/quorum.c | 24 +++++-------------------
11
1 file changed, 5 insertions(+), 19 deletions(-)
12
13
diff --git a/block/quorum.c b/block/quorum.c
14
index XXXXXXX..XXXXXXX 100644
15
--- a/block/quorum.c
16
+++ b/block/quorum.c
17
@@ -XXX,XX +XXX,XX @@ static bool quorum_iovec_compare(QEMUIOVector *a, QEMUIOVector *b)
18
return true;
19
}
20
21
-static void GCC_FMT_ATTR(2, 3) quorum_err(QuorumAIOCB *acb,
22
- const char *fmt, ...)
23
-{
24
- va_list ap;
25
-
26
- va_start(ap, fmt);
27
- fprintf(stderr, "quorum: offset=%" PRIu64 " bytes=%" PRIu64 " ",
28
- acb->offset, acb->bytes);
29
- vfprintf(stderr, fmt, ap);
30
- fprintf(stderr, "\n");
31
- va_end(ap);
32
- exit(1);
33
-}
34
-
35
-static bool quorum_compare(QuorumAIOCB *acb,
36
- QEMUIOVector *a,
37
- QEMUIOVector *b)
38
+static bool quorum_compare(QuorumAIOCB *acb, QEMUIOVector *a, QEMUIOVector *b)
39
{
40
BDRVQuorumState *s = acb->bs->opaque;
41
ssize_t offset;
42
@@ -XXX,XX +XXX,XX @@ static bool quorum_compare(QuorumAIOCB *acb,
43
if (s->is_blkverify) {
44
offset = qemu_iovec_compare(a, b);
45
if (offset != -1) {
46
- quorum_err(acb, "contents mismatch at offset %" PRIu64,
47
- acb->offset + offset);
48
+ fprintf(stderr, "quorum: offset=%" PRIu64 " bytes=%" PRIu64
49
+ " contents mismatch at offset %" PRIu64 "\n",
50
+ acb->offset, acb->bytes, acb->offset + offset);
51
+ exit(1);
52
}
53
return true;
54
}
55
--
56
2.19.1
57
58
diff view generated by jsdifflib
Deleted patch
1
From: Alberto Garcia <berto@igalia.com>
2
1
3
The blkverify mode of Quorum can only be enabled if the number of
4
children is exactly two and the value of vote-threshold is also two.
5
6
If the user tries to enable it but the other settings are incorrect
7
then QEMU simply prints an error message to stderr and carries on
8
disabling the blkverify setting.
9
10
This patch makes quorum_open() fail and return an error in this case.
11
12
Signed-off-by: Alberto Garcia <berto@igalia.com>
13
Reported-by: Markus Armbruster <armbru@redhat.com>
14
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
15
---
16
block/quorum.c | 13 ++++++-------
17
1 file changed, 6 insertions(+), 7 deletions(-)
18
19
diff --git a/block/quorum.c b/block/quorum.c
20
index XXXXXXX..XXXXXXX 100644
21
--- a/block/quorum.c
22
+++ b/block/quorum.c
23
@@ -XXX,XX +XXX,XX @@ static int quorum_open(BlockDriverState *bs, QDict *options, int flags,
24
s->read_pattern = ret;
25
26
if (s->read_pattern == QUORUM_READ_PATTERN_QUORUM) {
27
- /* is the driver in blkverify mode */
28
- if (qemu_opt_get_bool(opts, QUORUM_OPT_BLKVERIFY, false) &&
29
- s->num_children == 2 && s->threshold == 2) {
30
- s->is_blkverify = true;
31
- } else if (qemu_opt_get_bool(opts, QUORUM_OPT_BLKVERIFY, false)) {
32
- fprintf(stderr, "blkverify mode is set by setting blkverify=on "
33
- "and using two files with vote_threshold=2\n");
34
+ s->is_blkverify = qemu_opt_get_bool(opts, QUORUM_OPT_BLKVERIFY, false);
35
+ if (s->is_blkverify && (s->num_children != 2 || s->threshold != 2)) {
36
+ error_setg(&local_err, "blkverify=on can only be set if there are "
37
+ "exactly two files and vote-threshold is 2");
38
+ ret = -EINVAL;
39
+ goto exit;
40
}
41
42
s->rewrite_corrupted = qemu_opt_get_bool(opts, QUORUM_OPT_REWRITE,
43
--
44
2.19.1
45
46
diff view generated by jsdifflib
Deleted patch
1
From: Alberto Garcia <berto@igalia.com>
2
1
3
This patch tests that you can add and remove drives from a Quorum
4
using the x-blockdev-change command.
5
6
Signed-off-by: Alberto Garcia <berto@igalia.com>
7
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
8
---
9
tests/qemu-iotests/081 | 86 ++++++++++++++++++++++++++++++++++++++
10
tests/qemu-iotests/081.out | 54 ++++++++++++++++++++++++
11
2 files changed, 140 insertions(+)
12
13
diff --git a/tests/qemu-iotests/081 b/tests/qemu-iotests/081
14
index XXXXXXX..XXXXXXX 100755
15
--- a/tests/qemu-iotests/081
16
+++ b/tests/qemu-iotests/081
17
@@ -XXX,XX +XXX,XX @@ quorum="$quorum,file.children.2.driver=raw"
18
19
$QEMU_IO -c "open -o $quorum" | _filter_qemu_io
20
21
+echo
22
+echo "== dynamically adding a child to a quorum =="
23
+
24
+for verify in false true; do
25
+ run_qemu <<EOF
26
+ { "execute": "qmp_capabilities" }
27
+ { "execute": "blockdev-add",
28
+ "arguments": {
29
+ "driver": "quorum",
30
+ "node-name": "drive0-quorum",
31
+ "vote-threshold": 2,
32
+ "blkverify": ${verify},
33
+ "children": [
34
+ {
35
+ "driver": "$IMGFMT",
36
+ "file": {
37
+ "driver": "file",
38
+ "filename": "$TEST_DIR/1.raw"
39
+ }
40
+ },
41
+ {
42
+ "driver": "$IMGFMT",
43
+ "file": {
44
+ "driver": "file",
45
+ "filename": "$TEST_DIR/2.raw"
46
+ }
47
+ }
48
+ ]
49
+ }
50
+ }
51
+ { "execute": "blockdev-add",
52
+ "arguments": {
53
+ "node-name": "drive3",
54
+ "driver": "$IMGFMT",
55
+ "file": {
56
+ "driver": "file",
57
+ "filename": "$TEST_DIR/2.raw"
58
+ }
59
+ }
60
+ }
61
+ { "execute": "x-blockdev-change",
62
+ "arguments": { "parent": "drive0-quorum",
63
+ "node": "drive3" } }
64
+ { "execute": "quit" }
65
+EOF
66
+done
67
+
68
+echo
69
+echo "== dynamically removing a child from a quorum =="
70
+
71
+for verify in false true; do
72
+ for vote_threshold in 1 2; do
73
+ run_qemu <<EOF
74
+ { "execute": "qmp_capabilities" }
75
+ { "execute": "blockdev-add",
76
+ "arguments": {
77
+ "driver": "quorum",
78
+ "node-name": "drive0-quorum",
79
+ "vote-threshold": ${vote_threshold},
80
+ "blkverify": ${verify},
81
+ "children": [
82
+ {
83
+ "driver": "$IMGFMT",
84
+ "file": {
85
+ "driver": "file",
86
+ "filename": "$TEST_DIR/1.raw"
87
+ }
88
+ },
89
+ {
90
+ "driver": "$IMGFMT",
91
+ "file": {
92
+ "driver": "file",
93
+ "filename": "$TEST_DIR/2.raw"
94
+ }
95
+ }
96
+ ]
97
+ }
98
+ }
99
+ { "execute": "x-blockdev-change",
100
+ "arguments": { "parent": "drive0-quorum",
101
+ "child": "children.1" } }
102
+ { "execute": "quit" }
103
+EOF
104
+ done
105
+done
106
+
107
# success, all done
108
echo "*** done"
109
rm -f $seq.full
110
diff --git a/tests/qemu-iotests/081.out b/tests/qemu-iotests/081.out
111
index XXXXXXX..XXXXXXX 100644
112
--- a/tests/qemu-iotests/081.out
113
+++ b/tests/qemu-iotests/081.out
114
@@ -XXX,XX +XXX,XX @@ read 10485760/10485760 bytes at offset 0
115
116
== checking the blkverify mode with invalid settings ==
117
can't open: blkverify=on can only be set if there are exactly two files and vote-threshold is 2
118
+
119
+== dynamically adding a child to a quorum ==
120
+Testing:
121
+QMP_VERSION
122
+{"return": {}}
123
+{"return": {}}
124
+{"return": {}}
125
+{"return": {}}
126
+{"return": {}}
127
+{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "SHUTDOWN", "data": {"guest": false}}
128
+
129
+Testing:
130
+QMP_VERSION
131
+{"return": {}}
132
+{"return": {}}
133
+{"return": {}}
134
+{"error": {"class": "GenericError", "desc": "Cannot add a child to a quorum in blkverify mode"}}
135
+{"return": {}}
136
+{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "SHUTDOWN", "data": {"guest": false}}
137
+
138
+
139
+== dynamically removing a child from a quorum ==
140
+Testing:
141
+QMP_VERSION
142
+{"return": {}}
143
+{"return": {}}
144
+{"return": {}}
145
+{"return": {}}
146
+{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "SHUTDOWN", "data": {"guest": false}}
147
+
148
+Testing:
149
+QMP_VERSION
150
+{"return": {}}
151
+{"return": {}}
152
+{"error": {"class": "GenericError", "desc": "The number of children cannot be lower than the vote threshold 2"}}
153
+{"return": {}}
154
+{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "SHUTDOWN", "data": {"guest": false}}
155
+
156
+Testing:
157
+QMP_VERSION
158
+{"return": {}}
159
+{"error": {"class": "GenericError", "desc": "blkverify=on can only be set if there are exactly two files and vote-threshold is 2"}}
160
+{"error": {"class": "GenericError", "desc": "Cannot find device=drive0-quorum nor node_name=drive0-quorum"}}
161
+{"return": {}}
162
+{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "SHUTDOWN", "data": {"guest": false}}
163
+
164
+Testing:
165
+QMP_VERSION
166
+{"return": {}}
167
+{"return": {}}
168
+{"error": {"class": "GenericError", "desc": "The number of children cannot be lower than the vote threshold 2"}}
169
+{"return": {}}
170
+{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "SHUTDOWN", "data": {"guest": false}}
171
+
172
*** done
173
--
174
2.19.1
175
176
diff view generated by jsdifflib
Deleted patch
1
To fully change the read-only state of a node, we must not only change
2
bs->read_only, but also update bs->open_flags.
3
1
4
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
5
Reviewed-by: Eric Blake <eblake@redhat.com>
6
Reviewed-by: Alberto Garcia <berto@igalia.com>
7
---
8
block.c | 7 +++++++
9
1 file changed, 7 insertions(+)
10
11
diff --git a/block.c b/block.c
12
index XXXXXXX..XXXXXXX 100644
13
--- a/block.c
14
+++ b/block.c
15
@@ -XXX,XX +XXX,XX @@ int bdrv_set_read_only(BlockDriverState *bs, bool read_only, Error **errp)
16
}
17
18
bs->read_only = read_only;
19
+
20
+ if (read_only) {
21
+ bs->open_flags &= ~BDRV_O_RDWR;
22
+ } else {
23
+ bs->open_flags |= BDRV_O_RDWR;
24
+ }
25
+
26
return 0;
27
}
28
29
--
30
2.19.1
31
32
diff view generated by jsdifflib
1
If a management application builds the block graph node by node, the
1
From: Max Reitz <mreitz@redhat.com>
2
protocol layer doesn't inherit its read-only option from the format
2
3
layer any more, so it must be set explicitly.
3
We should never poll anywhere in bdrv_do_drained_end() (including its
4
4
recursive callees like bdrv_drain_invoke()), because it does not cope
5
Backing files should work on read-only storage, but at the same time, a
5
well with graph changes. In fact, it has been written based on the
6
block job like commit should be able to reopen them read-write if they
6
postulation that no graph changes will happen in it.
7
are on read-write storage. However, without option inheritance, reopen
7
8
only changes the read-only option for the root node (typically the
8
Instead, the callers that want to poll must poll, i.e. all currently
9
format layer), but not the protocol layer, so reopening fails (the
9
globally available wrappers: bdrv_drained_end(),
10
format layer wants to get write permissions, but the protocol layer is
10
bdrv_subtree_drained_end(), bdrv_unapply_subtree_drain(), and
11
still read-only).
11
bdrv_drain_all_end(). Graph changes there do not matter.
12
12
13
A simple workaround for the problem in the management tool would be to
13
They can poll simply by passing a pointer to a drained_end_counter and
14
open the protocol layer always read-write and to make only the format
14
wait until it reaches 0.
15
layer read-only for backing files. However, sometimes the file is
15
16
actually stored on read-only storage and we don't know whether the image
16
This patch also adds a non-polling global wrapper for
17
can be opened read-write (for example, for NBD it depends on the server
17
bdrv_do_drained_end() that takes a drained_end_counter pointer. We need
18
we're trying to connect to). This adds an option that makes QEMU try to
18
such a variant because now no function called anywhere from
19
open the image read-write, but allows it to degrade to a read-only mode
19
bdrv_do_drained_end() must poll. This includes
20
without returning an error.
20
BdrvChildRole.drained_end(), which already must not poll according to
21
21
its interface documentation, but bdrv_child_cb_drained_end() just
22
The documentation for this option is consciously phrased in a way that
22
violates that by invoking bdrv_drained_end() (which does poll).
23
allows QEMU to switch to a better model eventually: Instead of trying
23
Therefore, BdrvChildRole.drained_end() must take a *drained_end_counter
24
when the image is first opened, making the read-only flag dynamic and
24
parameter, which bdrv_child_cb_drained_end() can pass on to the new
25
changing it automatically whenever the first BLK_PERM_WRITE user is
25
bdrv_drained_end_no_poll() function.
26
attached or the last one is detached would be much more useful
26
27
behaviour.
27
Note that we now have a pattern of all drained_end-related functions
28
28
either polling or receiving a *drained_end_counter to let the caller
29
Unfortunately, this more useful behaviour is also a lot harder to
29
poll based on that.
30
implement, and libvirt needs a solution now before it can switch to
30
31
-blockdev, so let's start with this easier approach for now.
31
A problem with a single poll loop is that when the drained section in
32
32
bdrv_set_aio_context_ignore() ends, some nodes in the subgraph may be in
33
Instead of adding a new auto-read-only option, turning the existing
33
the old contexts, while others are in the new context already. To let
34
read-only into an enum (with a bool alternate for compatibility) was
34
the collective poll in bdrv_drained_end() work correctly, we must not
35
considered, but it complicated the implementation to the point that it
35
hold a lock to the old context, so that the old context can make
36
didn't seem to be worth it.
36
progress in case it is different from the current context.
37
37
38
(In the process, remove the comment saying that the current context is
39
always the old context, because it is wrong.)
40
41
In all other places, all nodes in a subtree must be in the same context,
42
so we can just poll that. The exception of course is
43
bdrv_drain_all_end(), but that always runs in the main context, so we
44
can just poll NULL (like bdrv_drain_all_begin() does).
45
46
Signed-off-by: Max Reitz <mreitz@redhat.com>
38
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
47
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
39
Reviewed-by: Eric Blake <eblake@redhat.com>
40
---
48
---
41
qapi/block-core.json | 7 +++++++
49
include/block/block.h | 25 ++++++++++++
42
include/block/block.h | 2 ++
50
include/block/block_int.h | 6 ++-
43
block.c | 17 +++++++++++++++++
51
block.c | 37 ++++++++++++++----
44
block/vvfat.c | 1 +
52
block/block-backend.c | 6 +--
45
blockdev.c | 2 +-
53
block/io.c | 80 ++++++++++++++++++++++++++++-----------
46
5 files changed, 28 insertions(+), 1 deletion(-)
54
blockjob.c | 2 +-
47
55
6 files changed, 120 insertions(+), 36 deletions(-)
48
diff --git a/qapi/block-core.json b/qapi/block-core.json
56
49
index XXXXXXX..XXXXXXX 100644
50
--- a/qapi/block-core.json
51
+++ b/qapi/block-core.json
52
@@ -XXX,XX +XXX,XX @@
53
# either generally or in certain configurations. In this case,
54
# the default value does not work and the option must be
55
# specified explicitly.
56
+# @auto-read-only: if true and @read-only is false, QEMU may automatically
57
+# decide not to open the image read-write as requested, but
58
+# fall back to read-only instead (and switch between the modes
59
+# later), e.g. depending on whether the image file is writable
60
+# or whether a writing user is attached to the node
61
+# (default: false, since 3.1)
62
# @detect-zeroes: detect and optimize zero writes (Since 2.1)
63
# (default: off)
64
# @force-share: force share all permission on added nodes.
65
@@ -XXX,XX +XXX,XX @@
66
'*discard': 'BlockdevDiscardOptions',
67
'*cache': 'BlockdevCacheOptions',
68
'*read-only': 'bool',
69
+ '*auto-read-only': 'bool',
70
'*force-share': 'bool',
71
'*detect-zeroes': 'BlockdevDetectZeroesOptions' },
72
'discriminator': 'driver',
73
diff --git a/include/block/block.h b/include/block/block.h
57
diff --git a/include/block/block.h b/include/block/block.h
74
index XXXXXXX..XXXXXXX 100644
58
index XXXXXXX..XXXXXXX 100644
75
--- a/include/block/block.h
59
--- a/include/block/block.h
76
+++ b/include/block/block.h
60
+++ b/include/block/block.h
77
@@ -XXX,XX +XXX,XX @@ typedef struct HDGeometry {
61
@@ -XXX,XX +XXX,XX @@ void bdrv_parent_drained_begin_single(BdrvChild *c, bool poll);
78
select an appropriate protocol driver,
62
* bdrv_parent_drained_end_single:
79
ignoring the format layer */
63
*
80
#define BDRV_O_NO_IO 0x10000 /* don't initialize for I/O */
64
* End a quiesced section for the parent of @c.
81
+#define BDRV_O_AUTO_RDONLY 0x20000 /* degrade to read-only if opening read-write fails */
65
+ *
82
66
+ * This polls @bs's AioContext until all scheduled sub-drained_ends
83
#define BDRV_O_CACHE_MASK (BDRV_O_NOCACHE | BDRV_O_NO_FLUSH)
67
+ * have settled, which may result in graph changes.
84
68
*/
85
@@ -XXX,XX +XXX,XX @@ typedef struct HDGeometry {
69
void bdrv_parent_drained_end_single(BdrvChild *c);
86
#define BDRV_OPT_CACHE_DIRECT "cache.direct"
70
87
#define BDRV_OPT_CACHE_NO_FLUSH "cache.no-flush"
71
@@ -XXX,XX +XXX,XX @@ void bdrv_subtree_drained_begin(BlockDriverState *bs);
88
#define BDRV_OPT_READ_ONLY "read-only"
72
* bdrv_drained_end:
89
+#define BDRV_OPT_AUTO_READ_ONLY "auto-read-only"
73
*
90
#define BDRV_OPT_DISCARD "discard"
74
* End a quiescent section started by bdrv_drained_begin().
91
#define BDRV_OPT_FORCE_SHARE "force-share"
75
+ *
92
76
+ * This polls @bs's AioContext until all scheduled sub-drained_ends
77
+ * have settled. On one hand, that may result in graph changes. On
78
+ * the other, this requires that all involved nodes (@bs and all of
79
+ * its parents) are in the same AioContext, and that the caller has
80
+ * acquired it.
81
+ * If there are any nodes that are in different contexts from @bs,
82
+ * these contexts must not be acquired.
83
*/
84
void bdrv_drained_end(BlockDriverState *bs);
85
86
+/**
87
+ * bdrv_drained_end_no_poll:
88
+ *
89
+ * Same as bdrv_drained_end(), but do not poll for the subgraph to
90
+ * actually become unquiesced. Therefore, no graph changes will occur
91
+ * with this function.
92
+ *
93
+ * *drained_end_counter is incremented for every background operation
94
+ * that is scheduled, and will be decremented for every operation once
95
+ * it settles. The caller must poll until it reaches 0. The counter
96
+ * should be accessed using atomic operations only.
97
+ */
98
+void bdrv_drained_end_no_poll(BlockDriverState *bs, int *drained_end_counter);
99
+
100
/**
101
* End a quiescent section started by bdrv_subtree_drained_begin().
102
*/
103
diff --git a/include/block/block_int.h b/include/block/block_int.h
104
index XXXXXXX..XXXXXXX 100644
105
--- a/include/block/block_int.h
106
+++ b/include/block/block_int.h
107
@@ -XXX,XX +XXX,XX @@ struct BdrvChildRole {
108
* These functions must not change the graph (and therefore also must not
109
* call aio_poll(), which could change the graph indirectly).
110
*
111
+ * If drained_end() schedules background operations, it must atomically
112
+ * increment *drained_end_counter for each such operation and atomically
113
+ * decrement it once the operation has settled.
114
+ *
115
* Note that this can be nested. If drained_begin() was called twice, new
116
* I/O is allowed only after drained_end() was called twice, too.
117
*/
118
void (*drained_begin)(BdrvChild *child);
119
- void (*drained_end)(BdrvChild *child);
120
+ void (*drained_end)(BdrvChild *child, int *drained_end_counter);
121
122
/*
123
* Returns whether the parent has pending requests for the child. This
93
diff --git a/block.c b/block.c
124
diff --git a/block.c b/block.c
94
index XXXXXXX..XXXXXXX 100644
125
index XXXXXXX..XXXXXXX 100644
95
--- a/block.c
126
--- a/block.c
96
+++ b/block.c
127
+++ b/block.c
97
@@ -XXX,XX +XXX,XX @@ static void bdrv_inherited_options(int *child_flags, QDict *child_options,
128
@@ -XXX,XX +XXX,XX @@ static bool bdrv_child_cb_drained_poll(BdrvChild *child)
98
129
return bdrv_drain_poll(bs, false, NULL, false);
99
/* Inherit the read-only option from the parent if it's not set */
130
}
100
qdict_copy_default(child_options, parent_options, BDRV_OPT_READ_ONLY);
131
101
+ qdict_copy_default(child_options, parent_options, BDRV_OPT_AUTO_READ_ONLY);
132
-static void bdrv_child_cb_drained_end(BdrvChild *child)
102
133
+static void bdrv_child_cb_drained_end(BdrvChild *child,
103
/* Our block drivers take care to send flushes and respect unmap policy,
134
+ int *drained_end_counter)
104
* so we can default to enable both on lower layers regardless of the
135
{
105
@@ -XXX,XX +XXX,XX @@ static void bdrv_backing_options(int *child_flags, QDict *child_options,
136
BlockDriverState *bs = child->opaque;
106
137
- bdrv_drained_end(bs);
107
/* backing files always opened read-only */
138
+ bdrv_drained_end_no_poll(bs, drained_end_counter);
108
qdict_set_default_str(child_options, BDRV_OPT_READ_ONLY, "on");
139
}
109
+ qdict_set_default_str(child_options, BDRV_OPT_AUTO_READ_ONLY, "off");
140
110
flags &= ~BDRV_O_COPY_ON_READ;
141
static void bdrv_child_cb_attach(BdrvChild *child)
111
142
@@ -XXX,XX +XXX,XX @@ static void bdrv_attach_aio_context(BlockDriverState *bs,
112
/* snapshot=on is handled on the top layer */
143
void bdrv_set_aio_context_ignore(BlockDriverState *bs,
113
@@ -XXX,XX +XXX,XX @@ static void update_flags_from_options(int *flags, QemuOpts *opts)
144
AioContext *new_context, GSList **ignore)
114
*flags |= BDRV_O_RDWR;
145
{
115
}
146
+ AioContext *old_context = bdrv_get_aio_context(bs);
116
147
+ AioContext *current_context = qemu_get_current_aio_context();
117
+ assert(qemu_opt_find(opts, BDRV_OPT_AUTO_READ_ONLY));
148
BdrvChild *child;
118
+ if (qemu_opt_get_bool_del(opts, BDRV_OPT_AUTO_READ_ONLY, false)) {
149
119
+ *flags |= BDRV_O_AUTO_RDONLY;
150
- if (bdrv_get_aio_context(bs) == new_context) {
151
+ if (old_context == new_context) {
152
return;
153
}
154
155
@@ -XXX,XX +XXX,XX @@ void bdrv_set_aio_context_ignore(BlockDriverState *bs,
156
157
bdrv_detach_aio_context(bs);
158
159
- /* This function executes in the old AioContext so acquire the new one in
160
- * case it runs in a different thread.
161
- */
162
- aio_context_acquire(new_context);
163
+ /* Acquire the new context, if necessary */
164
+ if (current_context != new_context) {
165
+ aio_context_acquire(new_context);
120
+ }
166
+ }
121
}
167
+
122
168
bdrv_attach_aio_context(bs, new_context);
123
static void update_options_from_flags(QDict *options, int flags)
169
+
124
@@ -XXX,XX +XXX,XX @@ static void update_options_from_flags(QDict *options, int flags)
170
+ /*
125
if (!qdict_haskey(options, BDRV_OPT_READ_ONLY)) {
171
+ * If this function was recursively called from
126
qdict_put_bool(options, BDRV_OPT_READ_ONLY, !(flags & BDRV_O_RDWR));
172
+ * bdrv_set_aio_context_ignore(), there may be nodes in the
127
}
173
+ * subtree that have not yet been moved to the new AioContext.
128
+ if (!qdict_haskey(options, BDRV_OPT_AUTO_READ_ONLY)) {
174
+ * Release the old one so bdrv_drained_end() can poll them.
129
+ qdict_put_bool(options, BDRV_OPT_AUTO_READ_ONLY,
175
+ */
130
+ flags & BDRV_O_AUTO_RDONLY);
176
+ if (current_context != old_context) {
177
+ aio_context_release(old_context);
131
+ }
178
+ }
132
}
179
+
133
180
bdrv_drained_end(bs);
134
static void bdrv_assign_node_name(BlockDriverState *bs,
181
- aio_context_release(new_context);
135
@@ -XXX,XX +XXX,XX @@ QemuOptsList bdrv_runtime_opts = {
182
+
136
.type = QEMU_OPT_BOOL,
183
+ if (current_context != old_context) {
137
.help = "Node is opened in read-only mode",
184
+ aio_context_acquire(old_context);
138
},
185
+ }
139
+ {
186
+ if (current_context != new_context) {
140
+ .name = BDRV_OPT_AUTO_READ_ONLY,
187
+ aio_context_release(new_context);
141
+ .type = QEMU_OPT_BOOL,
188
+ }
142
+ .help = "Node can become read-only if opening read-write fails",
189
}
143
+ },
190
144
{
191
static bool bdrv_parent_can_set_aio_context(BdrvChild *c, AioContext *ctx,
145
.name = "detect-zeroes",
192
diff --git a/block/block-backend.c b/block/block-backend.c
146
.type = QEMU_OPT_STRING,
193
index XXXXXXX..XXXXXXX 100644
147
@@ -XXX,XX +XXX,XX @@ BlockDriverState *bdrv_open_blockdev_ref(BlockdevRef *ref, Error **errp)
194
--- a/block/block-backend.c
148
qdict_set_default_str(qdict, BDRV_OPT_CACHE_DIRECT, "off");
195
+++ b/block/block-backend.c
149
qdict_set_default_str(qdict, BDRV_OPT_CACHE_NO_FLUSH, "off");
196
@@ -XXX,XX +XXX,XX @@ static void blk_root_inherit_options(int *child_flags, QDict *child_options,
150
qdict_set_default_str(qdict, BDRV_OPT_READ_ONLY, "off");
197
}
151
+ qdict_set_default_str(qdict, BDRV_OPT_AUTO_READ_ONLY, "off");
198
static void blk_root_drained_begin(BdrvChild *child);
152
+
199
static bool blk_root_drained_poll(BdrvChild *child);
153
}
200
-static void blk_root_drained_end(BdrvChild *child);
154
201
+static void blk_root_drained_end(BdrvChild *child, int *drained_end_counter);
155
bs = bdrv_open_inherit(NULL, reference, qdict, 0, NULL, NULL, errp);
202
156
diff --git a/block/vvfat.c b/block/vvfat.c
203
static void blk_root_change_media(BdrvChild *child, bool load);
157
index XXXXXXX..XXXXXXX 100644
204
static void blk_root_resize(BdrvChild *child);
158
--- a/block/vvfat.c
205
@@ -XXX,XX +XXX,XX @@ int blk_pread_unthrottled(BlockBackend *blk, int64_t offset, uint8_t *buf,
159
+++ b/block/vvfat.c
206
160
@@ -XXX,XX +XXX,XX @@ static void vvfat_qcow_options(int *child_flags, QDict *child_options,
207
blk_root_drained_begin(blk->root);
161
int parent_flags, QDict *parent_options)
208
ret = blk_pread(blk, offset, buf, count);
162
{
209
- blk_root_drained_end(blk->root);
163
qdict_set_default_str(child_options, BDRV_OPT_READ_ONLY, "off");
210
+ blk_root_drained_end(blk->root, NULL);
164
+ qdict_set_default_str(child_options, BDRV_OPT_AUTO_READ_ONLY, "off");
211
return ret;
165
qdict_set_default_str(child_options, BDRV_OPT_CACHE_NO_FLUSH, "on");
212
}
166
}
213
167
214
@@ -XXX,XX +XXX,XX @@ static bool blk_root_drained_poll(BdrvChild *child)
168
diff --git a/blockdev.c b/blockdev.c
215
return !!blk->in_flight;
169
index XXXXXXX..XXXXXXX 100644
216
}
170
--- a/blockdev.c
217
171
+++ b/blockdev.c
218
-static void blk_root_drained_end(BdrvChild *child)
172
@@ -XXX,XX +XXX,XX @@ void qmp_blockdev_change_medium(bool has_device, const char *device,
219
+static void blk_root_drained_end(BdrvChild *child, int *drained_end_counter)
173
220
{
174
bdrv_flags = blk_get_open_flags_from_root_state(blk);
221
BlockBackend *blk = child->opaque;
175
bdrv_flags &= ~(BDRV_O_TEMPORARY | BDRV_O_SNAPSHOT | BDRV_O_NO_BACKING |
222
assert(blk->quiesce_counter);
176
- BDRV_O_PROTOCOL);
223
diff --git a/block/io.c b/block/io.c
177
+ BDRV_O_PROTOCOL | BDRV_O_AUTO_RDONLY);
224
index XXXXXXX..XXXXXXX 100644
178
225
--- a/block/io.c
179
if (!has_read_only) {
226
+++ b/block/io.c
180
read_only = BLOCKDEV_CHANGE_READ_ONLY_MODE_RETAIN;
227
@@ -XXX,XX +XXX,XX @@ static void bdrv_parent_drained_begin(BlockDriverState *bs, BdrvChild *ignore,
228
}
229
}
230
231
-void bdrv_parent_drained_end_single(BdrvChild *c)
232
+static void bdrv_parent_drained_end_single_no_poll(BdrvChild *c,
233
+ int *drained_end_counter)
234
{
235
assert(c->parent_quiesce_counter > 0);
236
c->parent_quiesce_counter--;
237
if (c->role->drained_end) {
238
- c->role->drained_end(c);
239
+ c->role->drained_end(c, drained_end_counter);
240
}
241
}
242
243
+void bdrv_parent_drained_end_single(BdrvChild *c)
244
+{
245
+ int drained_end_counter = 0;
246
+ bdrv_parent_drained_end_single_no_poll(c, &drained_end_counter);
247
+ BDRV_POLL_WHILE(c->bs, atomic_read(&drained_end_counter) > 0);
248
+}
249
+
250
static void bdrv_parent_drained_end(BlockDriverState *bs, BdrvChild *ignore,
251
- bool ignore_bds_parents)
252
+ bool ignore_bds_parents,
253
+ int *drained_end_counter)
254
{
255
BdrvChild *c, *next;
256
257
@@ -XXX,XX +XXX,XX @@ static void bdrv_parent_drained_end(BlockDriverState *bs, BdrvChild *ignore,
258
if (c == ignore || (ignore_bds_parents && c->role->parent_is_bds)) {
259
continue;
260
}
261
- bdrv_parent_drained_end_single(c);
262
+ bdrv_parent_drained_end_single_no_poll(c, drained_end_counter);
263
}
264
}
265
266
@@ -XXX,XX +XXX,XX @@ static void coroutine_fn bdrv_drain_invoke_entry(void *opaque)
267
atomic_mb_set(&data->done, true);
268
bdrv_dec_in_flight(bs);
269
270
- if (data->drained_end_counter) {
271
+ if (!data->begin) {
272
atomic_dec(data->drained_end_counter);
273
}
274
275
- if (data->begin || data->drained_end_counter) {
276
- g_free(data);
277
- }
278
+ g_free(data);
279
}
280
281
/* Recursively call BlockDriver.bdrv_co_drain_begin/end callbacks */
282
@@ -XXX,XX +XXX,XX @@ static void bdrv_drain_invoke(BlockDriverState *bs, bool begin,
283
.drained_end_counter = drained_end_counter,
284
};
285
286
- if (!begin && drained_end_counter) {
287
+ if (!begin) {
288
atomic_inc(drained_end_counter);
289
}
290
291
@@ -XXX,XX +XXX,XX @@ static void bdrv_drain_invoke(BlockDriverState *bs, bool begin,
292
bdrv_inc_in_flight(bs);
293
data->co = qemu_coroutine_create(bdrv_drain_invoke_entry, data);
294
aio_co_schedule(bdrv_get_aio_context(bs), data->co);
295
-
296
- /*
297
- * TODO: Drop this and make callers pass @drained_end_counter and poll
298
- * themselves
299
- */
300
- if (!begin && !drained_end_counter) {
301
- BDRV_POLL_WHILE(bs, !data->done);
302
- g_free(data);
303
- }
304
}
305
306
/* Returns true if BDRV_POLL_WHILE() should go into a blocking aio_poll() */
307
@@ -XXX,XX +XXX,XX @@ static void bdrv_co_drain_bh_cb(void *opaque)
308
}
309
bdrv_dec_in_flight(bs);
310
if (data->begin) {
311
+ assert(!data->drained_end_counter);
312
bdrv_do_drained_begin(bs, data->recursive, data->parent,
313
data->ignore_bds_parents, data->poll);
314
} else {
315
+ assert(!data->poll);
316
bdrv_do_drained_end(bs, data->recursive, data->parent,
317
data->ignore_bds_parents,
318
data->drained_end_counter);
319
@@ -XXX,XX +XXX,XX @@ void bdrv_subtree_drained_begin(BlockDriverState *bs)
320
bdrv_do_drained_begin(bs, true, NULL, false, true);
321
}
322
323
+/**
324
+ * This function does not poll, nor must any of its recursively called
325
+ * functions. The *drained_end_counter pointee will be incremented
326
+ * once for every background operation scheduled, and decremented once
327
+ * the operation settles. Therefore, the pointer must remain valid
328
+ * until the pointee reaches 0. That implies that whoever sets up the
329
+ * pointee has to poll until it is 0.
330
+ *
331
+ * We use atomic operations to access *drained_end_counter, because
332
+ * (1) when called from bdrv_set_aio_context_ignore(), the subgraph of
333
+ * @bs may contain nodes in different AioContexts,
334
+ * (2) bdrv_drain_all_end() uses the same counter for all nodes,
335
+ * regardless of which AioContext they are in.
336
+ */
337
static void bdrv_do_drained_end(BlockDriverState *bs, bool recursive,
338
BdrvChild *parent, bool ignore_bds_parents,
339
int *drained_end_counter)
340
@@ -XXX,XX +XXX,XX @@ static void bdrv_do_drained_end(BlockDriverState *bs, bool recursive,
341
BdrvChild *child, *next;
342
int old_quiesce_counter;
343
344
+ assert(drained_end_counter != NULL);
345
+
346
if (qemu_in_coroutine()) {
347
bdrv_co_yield_to_drain(bs, false, recursive, parent, ignore_bds_parents,
348
false, drained_end_counter);
349
@@ -XXX,XX +XXX,XX @@ static void bdrv_do_drained_end(BlockDriverState *bs, bool recursive,
350
351
/* Re-enable things in child-to-parent order */
352
bdrv_drain_invoke(bs, false, drained_end_counter);
353
- bdrv_parent_drained_end(bs, parent, ignore_bds_parents);
354
+ bdrv_parent_drained_end(bs, parent, ignore_bds_parents,
355
+ drained_end_counter);
356
357
old_quiesce_counter = atomic_fetch_dec(&bs->quiesce_counter);
358
if (old_quiesce_counter == 1) {
359
@@ -XXX,XX +XXX,XX @@ static void bdrv_do_drained_end(BlockDriverState *bs, bool recursive,
360
361
void bdrv_drained_end(BlockDriverState *bs)
362
{
363
- bdrv_do_drained_end(bs, false, NULL, false, NULL);
364
+ int drained_end_counter = 0;
365
+ bdrv_do_drained_end(bs, false, NULL, false, &drained_end_counter);
366
+ BDRV_POLL_WHILE(bs, atomic_read(&drained_end_counter) > 0);
367
+}
368
+
369
+void bdrv_drained_end_no_poll(BlockDriverState *bs, int *drained_end_counter)
370
+{
371
+ bdrv_do_drained_end(bs, false, NULL, false, drained_end_counter);
372
}
373
374
void bdrv_subtree_drained_end(BlockDriverState *bs)
375
{
376
- bdrv_do_drained_end(bs, true, NULL, false, NULL);
377
+ int drained_end_counter = 0;
378
+ bdrv_do_drained_end(bs, true, NULL, false, &drained_end_counter);
379
+ BDRV_POLL_WHILE(bs, atomic_read(&drained_end_counter) > 0);
380
}
381
382
void bdrv_apply_subtree_drain(BdrvChild *child, BlockDriverState *new_parent)
383
@@ -XXX,XX +XXX,XX @@ void bdrv_apply_subtree_drain(BdrvChild *child, BlockDriverState *new_parent)
384
385
void bdrv_unapply_subtree_drain(BdrvChild *child, BlockDriverState *old_parent)
386
{
387
+ int drained_end_counter = 0;
388
int i;
389
390
for (i = 0; i < old_parent->recursive_quiesce_counter; i++) {
391
- bdrv_do_drained_end(child->bs, true, child, false, NULL);
392
+ bdrv_do_drained_end(child->bs, true, child, false,
393
+ &drained_end_counter);
394
}
395
+
396
+ BDRV_POLL_WHILE(child->bs, atomic_read(&drained_end_counter) > 0);
397
}
398
399
/*
400
@@ -XXX,XX +XXX,XX @@ void bdrv_drain_all_begin(void)
401
void bdrv_drain_all_end(void)
402
{
403
BlockDriverState *bs = NULL;
404
+ int drained_end_counter = 0;
405
406
while ((bs = bdrv_next_all_states(bs))) {
407
AioContext *aio_context = bdrv_get_aio_context(bs);
408
409
aio_context_acquire(aio_context);
410
- bdrv_do_drained_end(bs, false, NULL, true, NULL);
411
+ bdrv_do_drained_end(bs, false, NULL, true, &drained_end_counter);
412
aio_context_release(aio_context);
413
}
414
415
+ assert(qemu_get_current_aio_context() == qemu_get_aio_context());
416
+ AIO_WAIT_WHILE(NULL, atomic_read(&drained_end_counter) > 0);
417
+
418
assert(bdrv_drain_all_count > 0);
419
bdrv_drain_all_count--;
420
}
421
diff --git a/blockjob.c b/blockjob.c
422
index XXXXXXX..XXXXXXX 100644
423
--- a/blockjob.c
424
+++ b/blockjob.c
425
@@ -XXX,XX +XXX,XX @@ static bool child_job_drained_poll(BdrvChild *c)
426
}
427
}
428
429
-static void child_job_drained_end(BdrvChild *c)
430
+static void child_job_drained_end(BdrvChild *c, int *drained_end_counter)
431
{
432
BlockJob *job = c->opaque;
433
job_resume(&job->job);
181
--
434
--
182
2.19.1
435
2.20.1
183
436
184
437
diff view generated by jsdifflib
Deleted patch
1
Commit e2b8247a322 introduced an error path in qemu_rbd_open() after
2
calling rbd_open(), but neglected to close the image again in this error
3
path. The error path should contain everything that the regular close
4
function qemu_rbd_close() contains.
5
1
6
This adds the missing rbd_close() call.
7
8
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
9
Reviewed-by: Eric Blake <eblake@redhat.com>
10
---
11
block/rbd.c | 1 +
12
1 file changed, 1 insertion(+)
13
14
diff --git a/block/rbd.c b/block/rbd.c
15
index XXXXXXX..XXXXXXX 100644
16
--- a/block/rbd.c
17
+++ b/block/rbd.c
18
@@ -XXX,XX +XXX,XX @@ static int qemu_rbd_open(BlockDriverState *bs, QDict *options, int flags,
19
"automatically marking the image read-only.");
20
r = bdrv_set_read_only(bs, true, &local_err);
21
if (r < 0) {
22
+ rbd_close(s->image);
23
error_propagate(errp, local_err);
24
goto failed_open;
25
}
26
--
27
2.19.1
28
29
diff view generated by jsdifflib
Deleted patch
1
If read-only=off, but auto-read-only=on is given, open a read-write NBD
2
connection if the server provides a read-write export, but instead of
3
erroring out for read-only exports, just degrade to read-only.
4
1
5
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
6
Reviewed-by: Eric Blake <eblake@redhat.com>
7
---
8
block/nbd-client.c | 10 +++++-----
9
1 file changed, 5 insertions(+), 5 deletions(-)
10
11
diff --git a/block/nbd-client.c b/block/nbd-client.c
12
index XXXXXXX..XXXXXXX 100644
13
--- a/block/nbd-client.c
14
+++ b/block/nbd-client.c
15
@@ -XXX,XX +XXX,XX @@ int nbd_client_init(BlockDriverState *bs,
16
logout("Failed to negotiate with the NBD server\n");
17
return ret;
18
}
19
- if (client->info.flags & NBD_FLAG_READ_ONLY &&
20
- !bdrv_is_read_only(bs)) {
21
- error_setg(errp,
22
- "request for write access conflicts with read-only export");
23
- return -EACCES;
24
+ if (client->info.flags & NBD_FLAG_READ_ONLY) {
25
+ ret = bdrv_apply_auto_read_only(bs, "NBD export is read-only", errp);
26
+ if (ret < 0) {
27
+ return ret;
28
+ }
29
}
30
if (client->info.flags & NBD_FLAG_SEND_FUA) {
31
bs->supported_write_flags = BDRV_REQ_FUA;
32
--
33
2.19.1
34
35
diff view generated by jsdifflib
Deleted patch
1
If read-only=off, but auto-read-only=on is given, open the file
2
read-write if we have the permissions, but instead of erroring out for
3
read-only files, just degrade to read-only.
4
1
5
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
6
Reviewed-by: Eric Blake <eblake@redhat.com>
7
---
8
block/file-posix.c | 19 ++++++++++++++++---
9
1 file changed, 16 insertions(+), 3 deletions(-)
10
11
diff --git a/block/file-posix.c b/block/file-posix.c
12
index XXXXXXX..XXXXXXX 100644
13
--- a/block/file-posix.c
14
+++ b/block/file-posix.c
15
@@ -XXX,XX +XXX,XX @@ static int raw_open_common(BlockDriverState *bs, QDict *options,
16
17
s->fd = -1;
18
fd = qemu_open(filename, s->open_flags, 0644);
19
- if (fd < 0) {
20
- ret = -errno;
21
- error_setg_errno(errp, errno, "Could not open '%s'", filename);
22
+ ret = fd < 0 ? -errno : 0;
23
+
24
+ if (ret == -EACCES || ret == -EROFS) {
25
+ /* Try to degrade to read-only, but if it doesn't work, still use the
26
+ * normal error message. */
27
+ if (bdrv_apply_auto_read_only(bs, NULL, NULL) == 0) {
28
+ bdrv_flags &= ~BDRV_O_RDWR;
29
+ raw_parse_flags(bdrv_flags, &s->open_flags);
30
+ assert(!(s->open_flags & O_CREAT));
31
+ fd = qemu_open(filename, s->open_flags);
32
+ ret = fd < 0 ? -errno : 0;
33
+ }
34
+ }
35
+
36
+ if (ret < 0) {
37
+ error_setg_errno(errp, -ret, "Could not open '%s'", filename);
38
if (ret == -EROFS) {
39
ret = -EACCES;
40
}
41
--
42
2.19.1
43
44
diff view generated by jsdifflib
Deleted patch
1
If read-only=off, but auto-read-only=on is given, just degrade to
2
read-only.
3
1
4
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
5
Reviewed-by: Eric Blake <eblake@redhat.com>
6
---
7
block/curl.c | 8 ++++----
8
1 file changed, 4 insertions(+), 4 deletions(-)
9
10
diff --git a/block/curl.c b/block/curl.c
11
index XXXXXXX..XXXXXXX 100644
12
--- a/block/curl.c
13
+++ b/block/curl.c
14
@@ -XXX,XX +XXX,XX @@ static int curl_open(BlockDriverState *bs, QDict *options, int flags,
15
const char *protocol_delimiter;
16
int ret;
17
18
-
19
- if (flags & BDRV_O_RDWR) {
20
- error_setg(errp, "curl block device does not support writes");
21
- return -EROFS;
22
+ ret = bdrv_apply_auto_read_only(bs, "curl driver does not support writes",
23
+ errp);
24
+ if (ret < 0) {
25
+ return ret;
26
}
27
28
if (!libcurl_initialized) {
29
--
30
2.19.1
31
32
diff view generated by jsdifflib
Deleted patch
1
If read-only=off, but auto-read-only=on is given, open the file
2
read-write if we have the permissions, but instead of erroring out for
3
read-only files, just degrade to read-only.
4
1
5
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
6
Reviewed-by: Niels de Vos <ndevos@redhat.com>
7
---
8
block/gluster.c | 12 ++++++++++--
9
1 file changed, 10 insertions(+), 2 deletions(-)
10
11
diff --git a/block/gluster.c b/block/gluster.c
12
index XXXXXXX..XXXXXXX 100644
13
--- a/block/gluster.c
14
+++ b/block/gluster.c
15
@@ -XXX,XX +XXX,XX @@ static int qemu_gluster_open(BlockDriverState *bs, QDict *options,
16
qemu_gluster_parse_flags(bdrv_flags, &open_flags);
17
18
s->fd = glfs_open(s->glfs, gconf->path, open_flags);
19
- if (!s->fd) {
20
- ret = -errno;
21
+ ret = s->fd ? 0 : -errno;
22
+
23
+ if (ret == -EACCES || ret == -EROFS) {
24
+ /* Try to degrade to read-only, but if it doesn't work, still use the
25
+ * normal error message. */
26
+ if (bdrv_apply_auto_read_only(bs, NULL, NULL) == 0) {
27
+ open_flags = (open_flags & ~O_RDWR) | O_RDONLY;
28
+ s->fd = glfs_open(s->glfs, gconf->path, open_flags);
29
+ ret = s->fd ? 0 : -errno;
30
+ }
31
}
32
33
s->supports_seek_data = qemu_gluster_test_seek(s->fd);
34
--
35
2.19.1
36
37
diff view generated by jsdifflib
Deleted patch
1
If read-only=off, but auto-read-only=on is given, open the volume
2
read-write if we have the permissions, but instead of erroring out for
3
read-only volumes, just degrade to read-only.
4
1
5
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
6
Reviewed-by: Eric Blake <eblake@redhat.com>
7
---
8
block/iscsi.c | 8 +++++---
9
1 file changed, 5 insertions(+), 3 deletions(-)
10
11
diff --git a/block/iscsi.c b/block/iscsi.c
12
index XXXXXXX..XXXXXXX 100644
13
--- a/block/iscsi.c
14
+++ b/block/iscsi.c
15
@@ -XXX,XX +XXX,XX @@ static int iscsi_open(BlockDriverState *bs, QDict *options, int flags,
16
/* Check the write protect flag of the LUN if we want to write */
17
if (iscsilun->type == TYPE_DISK && (flags & BDRV_O_RDWR) &&
18
iscsilun->write_protected) {
19
- error_setg(errp, "Cannot open a write protected LUN as read-write");
20
- ret = -EACCES;
21
- goto out;
22
+ ret = bdrv_apply_auto_read_only(bs, "LUN is write protected", errp);
23
+ if (ret < 0) {
24
+ goto out;
25
+ }
26
+ flags &= ~BDRV_O_RDWR;
27
}
28
29
iscsi_readcapacity_sync(iscsilun, &local_err);
30
--
31
2.19.1
32
33
diff view generated by jsdifflib
Deleted patch
1
While we want machine interfaces like -blockdev and QMP blockdev-add to
2
add as little auto-detection as possible so that management tools are
3
explicit about their needs, -drive is a convenience option for human
4
users. Enabling auto-read-only=on by default there enables users to use
5
read-only images for read-only guest devices without having to specify
6
read-only=on explicitly. If they try to attach the image to a read-write
7
device, they will still get an error message.
8
1
9
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
10
Reviewed-by: Eric Blake <eblake@redhat.com>
11
---
12
blockdev.c | 1 +
13
1 file changed, 1 insertion(+)
14
15
diff --git a/blockdev.c b/blockdev.c
16
index XXXXXXX..XXXXXXX 100644
17
--- a/blockdev.c
18
+++ b/blockdev.c
19
@@ -XXX,XX +XXX,XX @@ static BlockBackend *blockdev_init(const char *file, QDict *bs_opts,
20
qdict_set_default_str(bs_opts, BDRV_OPT_CACHE_NO_FLUSH, "off");
21
qdict_set_default_str(bs_opts, BDRV_OPT_READ_ONLY,
22
read_only ? "on" : "off");
23
+ qdict_set_default_str(bs_opts, BDRV_OPT_AUTO_READ_ONLY, "on");
24
assert((bdrv_flags & BDRV_O_CACHE_MASK) == 0);
25
26
if (runstate_check(RUN_STATE_INMIGRATE)) {
27
--
28
2.19.1
29
30
diff view generated by jsdifflib
1
From: Leonid Bloch <lbloch@janustech.com>
1
From: Max Reitz <mreitz@redhat.com>
2
2
3
The lookup table for power-of-two sizes was added in commit 540b8492618eb
3
Signed-off-by: Max Reitz <mreitz@redhat.com>
4
for the purpose of having convenient shortcuts for these sizes in cases
5
when the literal number has to be present at compile time, and
6
expressions as '(1 * KiB)' can not be used. One such case is the
7
stringification of sizes. Beyond that, it is convenient to use these
8
shortcuts for all power-of-two sizes, even if they don't have to be
9
literal numbers.
10
11
Despite its convenience, this table introduced 55 lines of "dumb" code,
12
the purpose and origin of which are obscure without reading the message
13
of the commit which introduced it. This patch fixes that by adding a
14
comment to the code itself with a brief explanation for the reasoning
15
behind this table. This comment includes the short AWK script that
16
generated the table, so that anyone who's interested could make sure
17
that the values in it are correct (otherwise these values look as if
18
they were typed manually).
19
20
Signed-off-by: Leonid Bloch <lbloch@janustech.com>
21
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
4
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
22
---
5
---
23
include/qemu/units.h | 18 ++++++++++++++++++
6
tests/test-bdrv-drain.c | 36 ++++++++++++++++++++++++++++++++----
24
1 file changed, 18 insertions(+)
7
1 file changed, 32 insertions(+), 4 deletions(-)
25
8
26
diff --git a/include/qemu/units.h b/include/qemu/units.h
9
diff --git a/tests/test-bdrv-drain.c b/tests/test-bdrv-drain.c
27
index XXXXXXX..XXXXXXX 100644
10
index XXXXXXX..XXXXXXX 100644
28
--- a/include/qemu/units.h
11
--- a/tests/test-bdrv-drain.c
29
+++ b/include/qemu/units.h
12
+++ b/tests/test-bdrv-drain.c
30
@@ -XXX,XX +XXX,XX @@
13
@@ -XXX,XX +XXX,XX @@ typedef struct TestDropBackingBlockJob {
31
#define PiB (INT64_C(1) << 50)
14
BlockJob common;
32
#define EiB (INT64_C(1) << 60)
15
bool should_complete;
33
16
bool *did_complete;
34
+/*
17
+ BlockDriverState *detach_also;
35
+ * The following lookup table is intended to be used when a literal string of
18
} TestDropBackingBlockJob;
36
+ * the number of bytes is required (for example if it needs to be stringified).
19
37
+ * It can also be used for generic shortcuts of power-of-two sizes.
20
static int coroutine_fn test_drop_backing_job_run(Job *job, Error **errp)
38
+ * This table is generated using the AWK script below:
21
@@ -XXX,XX +XXX,XX @@ static void test_drop_backing_job_commit(Job *job)
22
container_of(job, TestDropBackingBlockJob, common.job);
23
24
bdrv_set_backing_hd(blk_bs(s->common.blk), NULL, &error_abort);
25
+ bdrv_set_backing_hd(s->detach_also, NULL, &error_abort);
26
27
*s->did_complete = true;
28
}
29
@@ -XXX,XX +XXX,XX @@ static const BlockJobDriver test_drop_backing_job_driver = {
30
* Creates a child node with three parent nodes on it, and then runs a
31
* block job on the final one, parent-node-2.
32
*
33
- * (TODO: parent-node-0 currently serves no purpose, but will as of a
34
- * follow-up patch.)
35
- *
36
* The job is then asked to complete before a section where the child
37
* is drained.
38
*
39
@@ -XXX,XX +XXX,XX @@ static const BlockJobDriver test_drop_backing_job_driver = {
40
*
41
* Ending the drain on parent-node-1 will poll the AioContext, which
42
* lets job_exit() and thus test_drop_backing_job_commit() run. That
43
- * function removes the child as parent-node-2's backing file.
44
+ * function first removes the child as parent-node-2's backing file.
45
*
46
* In old (and buggy) implementations, there are two problems with
47
* that:
48
@@ -XXX,XX +XXX,XX @@ static const BlockJobDriver test_drop_backing_job_driver = {
49
* bdrv_replace_child_noperm() therefore must call drained_end() on
50
* the parent only if it really is still drained because the child is
51
* drained.
39
+ *
52
+ *
40
+ * BEGIN {
53
+ * If removing child from parent-node-2 was successful (as it should
41
+ * suffix="KMGTPE";
54
+ * be), test_drop_backing_job_commit() will then also remove the child
42
+ * for(i=10; i<64; i++) {
55
+ * from parent-node-0.
43
+ * val=2**i;
56
+ *
44
+ * s=substr(suffix, int(i/10), 1);
57
+ * With an old version of our drain infrastructure ((A) above), that
45
+ * n=2**(i%10);
58
+ * resulted in the following flow:
46
+ * pad=21-int(log(n)/log(10));
59
+ *
47
+ * printf("#define S_%d%siB %*d\n", n, s, pad, val);
60
+ * 1. child attempts to leave its drained section. The call recurses
48
+ * }
61
+ * to its parents.
49
+ * }
62
+ *
50
+ */
63
+ * 2. parent-node-2 leaves the drained section. Polling in
51
+
64
+ * bdrv_drain_invoke() will schedule job_exit().
52
#define S_1KiB 1024
65
+ *
53
#define S_2KiB 2048
66
+ * 3. parent-node-1 leaves the drained section. Polling in
54
#define S_4KiB 4096
67
+ * bdrv_drain_invoke() will run job_exit(), thus disconnecting
68
+ * parent-node-0 from the child node.
69
+ *
70
+ * 4. bdrv_parent_drained_end() uses a QLIST_FOREACH_SAFE() loop to
71
+ * iterate over the parents. Thus, it now accesses the BdrvChild
72
+ * object that used to connect parent-node-0 and the child node.
73
+ * However, that object no longer exists, so it accesses a dangling
74
+ * pointer.
75
+ *
76
+ * The solution is to only poll once when running a bdrv_drained_end()
77
+ * operation, specifically at the end when all drained_end()
78
+ * operations for all involved nodes have been scheduled.
79
+ * Note that this also solves (A) above, thus hiding (B).
80
*/
81
static void test_blockjob_commit_by_drained_end(void)
82
{
83
@@ -XXX,XX +XXX,XX @@ static void test_blockjob_commit_by_drained_end(void)
84
bs_parents[2], 0, BLK_PERM_ALL, 0, 0, NULL, NULL,
85
&error_abort);
86
87
+ job->detach_also = bs_parents[0];
88
job->did_complete = &job_has_completed;
89
90
job_start(&job->common.job);
55
--
91
--
56
2.19.1
92
2.20.1
57
93
58
94
diff view generated by jsdifflib
1
From: Max Reitz <mreitz@redhat.com>
1
From: Max Reitz <mreitz@redhat.com>
2
2
3
Just like in qemu_opts_print_help(), print the device name as a caption
3
The graph must not change in these loops (or a QLIST_FOREACH_SAFE would
4
instead of on every single line, indent all options, add angle brackets
4
not even be enough). We now ensure this by only polling once in the
5
around types, and align the descriptions after 24 characters. Also,
5
root bdrv_drained_end() call, so we can drop the _SAFE suffix. Doing so
6
separate the descriptions with " - " instead of putting them in
6
makes it clear that the graph must not change.
7
parentheses, because that is what we do everywhere else. This does look
8
a bit funny here because basically all bits have the description
9
"on/off", but funny does not mean it is less readable.
10
7
11
Signed-off-by: Max Reitz <mreitz@redhat.com>
8
Signed-off-by: Max Reitz <mreitz@redhat.com>
12
Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>
13
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
9
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
14
---
10
---
15
qdev-monitor.c | 13 +++++++++++--
11
block/io.c | 8 ++++----
16
1 file changed, 11 insertions(+), 2 deletions(-)
12
1 file changed, 4 insertions(+), 4 deletions(-)
17
13
18
diff --git a/qdev-monitor.c b/qdev-monitor.c
14
diff --git a/block/io.c b/block/io.c
19
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
20
--- a/qdev-monitor.c
16
--- a/block/io.c
21
+++ b/qdev-monitor.c
17
+++ b/block/io.c
22
@@ -XXX,XX +XXX,XX @@ int qdev_device_help(QemuOpts *opts)
18
@@ -XXX,XX +XXX,XX @@ static void bdrv_parent_drained_end(BlockDriverState *bs, BdrvChild *ignore,
23
goto error;
19
bool ignore_bds_parents,
24
}
20
int *drained_end_counter)
25
21
{
26
+ if (prop_list) {
22
- BdrvChild *c, *next;
27
+ out_printf("%s options:\n", driver);
23
+ BdrvChild *c;
28
+ } else {
24
29
+ out_printf("There are no options for %s.\n", driver);
25
- QLIST_FOREACH_SAFE(c, &bs->parents, next_parent, next) {
30
+ }
26
+ QLIST_FOREACH(c, &bs->parents, next_parent) {
31
for (prop = prop_list; prop; prop = prop->next) {
27
if (c == ignore || (ignore_bds_parents && c->role->parent_is_bds)) {
32
- out_printf("%s.%s=%s", driver, prop->value->name, prop->value->type);
28
continue;
33
+ int len;
29
}
34
+ out_printf(" %s=<%s>%n", prop->value->name, prop->value->type, &len);
30
@@ -XXX,XX +XXX,XX @@ static void bdrv_do_drained_end(BlockDriverState *bs, bool recursive,
35
if (prop->value->has_description) {
31
BdrvChild *parent, bool ignore_bds_parents,
36
- out_printf(" (%s)\n", prop->value->description);
32
int *drained_end_counter)
37
+ if (len < 24) {
33
{
38
+ out_printf("%*s", 24 - len, "");
34
- BdrvChild *child, *next;
39
+ }
35
+ BdrvChild *child;
40
+ out_printf(" - %s\n", prop->value->description);
36
int old_quiesce_counter;
41
} else {
37
42
out_printf("\n");
38
assert(drained_end_counter != NULL);
39
@@ -XXX,XX +XXX,XX @@ static void bdrv_do_drained_end(BlockDriverState *bs, bool recursive,
40
if (recursive) {
41
assert(!ignore_bds_parents);
42
bs->recursive_quiesce_counter--;
43
- QLIST_FOREACH_SAFE(child, &bs->children, next, next) {
44
+ QLIST_FOREACH(child, &bs->children, next) {
45
bdrv_do_drained_end(child->bs, true, child, ignore_bds_parents,
46
drained_end_counter);
43
}
47
}
44
--
48
--
45
2.19.1
49
2.20.1
46
50
47
51
diff view generated by jsdifflib
1
From: Max Reitz <mreitz@redhat.com>
1
From: Max Reitz <mreitz@redhat.com>
2
2
3
There is no good reason why there should be a newline in this
3
If a test has issued a quit command already (which may be useful to do
4
description, so remove it.
4
explicitly because the test wants to show its effects),
5
QEMUMachine.shutdown() should not do so again. Otherwise, the VM may
6
well return an ECONNRESET which will lead QEMUMachine.shutdown() to
7
killing it, which then turns into a "qemu received signal 9" line.
5
8
6
Signed-off-by: Max Reitz <mreitz@redhat.com>
9
Signed-off-by: Max Reitz <mreitz@redhat.com>
7
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
8
Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>
9
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
10
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
10
---
11
---
11
vl.c | 2 +-
12
python/qemu/machine.py | 5 +++--
12
1 file changed, 1 insertion(+), 1 deletion(-)
13
tests/qemu-iotests/255 | 2 +-
14
2 files changed, 4 insertions(+), 3 deletions(-)
13
15
14
diff --git a/vl.c b/vl.c
16
diff --git a/python/qemu/machine.py b/python/qemu/machine.py
15
index XXXXXXX..XXXXXXX 100644
17
index XXXXXXX..XXXXXXX 100644
16
--- a/vl.c
18
--- a/python/qemu/machine.py
17
+++ b/vl.c
19
+++ b/python/qemu/machine.py
18
@@ -XXX,XX +XXX,XX @@ static QemuOptsList qemu_fw_cfg_opts = {
20
@@ -XXX,XX +XXX,XX @@ class QEMUMachine(object):
19
}, {
21
self._load_io_log()
20
.name = "file",
22
self._post_shutdown()
21
.type = QEMU_OPT_STRING,
23
22
- .help = "Sets the name of the file from which\n"
24
- def shutdown(self):
23
+ .help = "Sets the name of the file from which "
25
+ def shutdown(self, has_quit=False):
24
"the fw_cfg blob will be loaded",
26
"""
25
}, {
27
Terminate the VM and clean up
26
.name = "string",
28
"""
29
if self.is_running():
30
try:
31
- self._qmp.cmd('quit')
32
+ if not has_quit:
33
+ self._qmp.cmd('quit')
34
self._qmp.close()
35
except:
36
self._popen.kill()
37
diff --git a/tests/qemu-iotests/255 b/tests/qemu-iotests/255
38
index XXXXXXX..XXXXXXX 100755
39
--- a/tests/qemu-iotests/255
40
+++ b/tests/qemu-iotests/255
41
@@ -XXX,XX +XXX,XX @@ with iotests.FilePath('src.qcow2') as src_path, \
42
vm.qmp_log('block-job-cancel', device='job0')
43
vm.qmp_log('quit')
44
45
- vm.shutdown()
46
+ vm.shutdown(has_quit=True)
27
--
47
--
28
2.19.1
48
2.20.1
29
49
30
50
diff view generated by jsdifflib
1
From: Max Reitz <mreitz@redhat.com>
1
From: Max Reitz <mreitz@redhat.com>
2
2
3
Following the example of qemu_opts_print_help(), indent all entries in
3
Before the previous patches, the first case resulted in a failed
4
the list of character devices.
4
assertion (which is noted as qemu receiving a SIGABRT in the test
5
output), and the second usually triggered a segmentation fault.
5
6
6
Signed-off-by: Max Reitz <mreitz@redhat.com>
7
Signed-off-by: Max Reitz <mreitz@redhat.com>
7
Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>
8
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
8
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
9
---
9
---
10
chardev/char.c | 2 +-
10
tests/qemu-iotests/040 | 40 +++++++++++++++++++++++++++++++++++++-
11
1 file changed, 1 insertion(+), 1 deletion(-)
11
tests/qemu-iotests/040.out | 4 ++--
12
2 files changed, 41 insertions(+), 3 deletions(-)
12
13
13
diff --git a/chardev/char.c b/chardev/char.c
14
diff --git a/tests/qemu-iotests/040 b/tests/qemu-iotests/040
15
index XXXXXXX..XXXXXXX 100755
16
--- a/tests/qemu-iotests/040
17
+++ b/tests/qemu-iotests/040
18
@@ -XXX,XX +XXX,XX @@ class TestSingleDrive(ImageCommitTestCase):
19
20
self.vm.add_device("scsi-hd,id=scsi0,drive=drive0")
21
self.vm.launch()
22
+ self.has_quit = False
23
24
def tearDown(self):
25
- self.vm.shutdown()
26
+ self.vm.shutdown(has_quit=self.has_quit)
27
os.remove(test_img)
28
os.remove(mid_img)
29
os.remove(backing_img)
30
@@ -XXX,XX +XXX,XX @@ class TestSingleDrive(ImageCommitTestCase):
31
self.assertEqual(-1, qemu_io('-f', 'raw', '-c', 'read -P 0xab 0 524288', backing_img).find("verification failed"))
32
self.assertEqual(-1, qemu_io('-f', 'raw', '-c', 'read -P 0xef 524288 524288', backing_img).find("verification failed"))
33
34
+ def test_commit_with_filter_and_quit(self):
35
+ result = self.vm.qmp('object-add', qom_type='throttle-group', id='tg')
36
+ self.assert_qmp(result, 'return', {})
37
+
38
+ # Add a filter outside of the backing chain
39
+ result = self.vm.qmp('blockdev-add', driver='throttle', node_name='filter', throttle_group='tg', file='mid')
40
+ self.assert_qmp(result, 'return', {})
41
+
42
+ result = self.vm.qmp('block-commit', device='drive0')
43
+ self.assert_qmp(result, 'return', {})
44
+
45
+ # Quit immediately, thus forcing a simultaneous cancel of the
46
+ # block job and a bdrv_drain_all()
47
+ result = self.vm.qmp('quit')
48
+ self.assert_qmp(result, 'return', {})
49
+
50
+ self.has_quit = True
51
+
52
+ # Same as above, but this time we add the filter after starting the job
53
+ def test_commit_plus_filter_and_quit(self):
54
+ result = self.vm.qmp('object-add', qom_type='throttle-group', id='tg')
55
+ self.assert_qmp(result, 'return', {})
56
+
57
+ result = self.vm.qmp('block-commit', device='drive0')
58
+ self.assert_qmp(result, 'return', {})
59
+
60
+ # Add a filter outside of the backing chain
61
+ result = self.vm.qmp('blockdev-add', driver='throttle', node_name='filter', throttle_group='tg', file='mid')
62
+ self.assert_qmp(result, 'return', {})
63
+
64
+ # Quit immediately, thus forcing a simultaneous cancel of the
65
+ # block job and a bdrv_drain_all()
66
+ result = self.vm.qmp('quit')
67
+ self.assert_qmp(result, 'return', {})
68
+
69
+ self.has_quit = True
70
+
71
def test_device_not_found(self):
72
result = self.vm.qmp('block-commit', device='nonexistent', top='%s' % mid_img)
73
self.assert_qmp(result, 'error/class', 'DeviceNotFound')
74
diff --git a/tests/qemu-iotests/040.out b/tests/qemu-iotests/040.out
14
index XXXXXXX..XXXXXXX 100644
75
index XXXXXXX..XXXXXXX 100644
15
--- a/chardev/char.c
76
--- a/tests/qemu-iotests/040.out
16
+++ b/chardev/char.c
77
+++ b/tests/qemu-iotests/040.out
17
@@ -XXX,XX +XXX,XX @@ help_string_append(const char *name, void *opaque)
78
@@ -XXX,XX +XXX,XX @@
18
{
79
-...........................................
19
GString *str = opaque;
80
+...............................................
20
81
----------------------------------------------------------------------
21
- g_string_append_printf(str, "\n%s", name);
82
-Ran 43 tests
22
+ g_string_append_printf(str, "\n %s", name);
83
+Ran 47 tests
23
}
84
24
85
OK
25
static const char *chardev_alias_translate(const char *name)
26
--
86
--
27
2.19.1
87
2.20.1
28
88
29
89
diff view generated by jsdifflib
1
From: Max Reitz <mreitz@redhat.com>
1
From: Max Reitz <mreitz@redhat.com>
2
2
3
Just like in qemu_opts_print_help(), print the object name as a caption
3
If the main loop cancels all block jobs while the block layer is not
4
instead of on every single line, indent all options, add angle brackets
4
drained, this cancelling may not happen instantaneously. We can start a
5
around types, and align the descriptions after 24 characters.
5
drained section before vm_shutdown(), which entails another
6
bdrv_drain_all(); this nested bdrv_drain_all() will thus be a no-op,
7
basically.
6
8
7
Also, indent every object name in the list of available objects.
9
We do not have to end the drained section, because we actually do not
10
want any requests to happen from this point on.
8
11
9
Signed-off-by: Max Reitz <mreitz@redhat.com>
12
Signed-off-by: Max Reitz <mreitz@redhat.com>
10
Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>
11
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
13
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
12
---
14
---
13
vl.c | 13 ++++++++++---
15
vl.c | 11 +++++++++++
14
1 file changed, 10 insertions(+), 3 deletions(-)
16
1 file changed, 11 insertions(+)
15
17
16
diff --git a/vl.c b/vl.c
18
diff --git a/vl.c b/vl.c
17
index XXXXXXX..XXXXXXX 100644
19
index XXXXXXX..XXXXXXX 100644
18
--- a/vl.c
20
--- a/vl.c
19
+++ b/vl.c
21
+++ b/vl.c
20
@@ -XXX,XX +XXX,XX @@ static bool object_create_initial(const char *type, QemuOpts *opts)
22
@@ -XXX,XX +XXX,XX @@ int main(int argc, char **argv, char **envp)
21
list = object_class_get_list_sorted(TYPE_USER_CREATABLE, false);
23
*/
22
for (l = list; l != NULL; l = l->next) {
24
migration_shutdown();
23
ObjectClass *oc = OBJECT_CLASS(l->data);
25
24
- printf("%s\n", object_class_get_name(oc));
26
+ /*
25
+ printf(" %s\n", object_class_get_name(oc));
27
+ * We must cancel all block jobs while the block layer is drained,
26
}
28
+ * or cancelling will be affected by throttling and thus may block
27
g_slist_free(list);
29
+ * for an extended period of time.
28
exit(0);
30
+ * vm_shutdown() will bdrv_drain_all(), so we may as well include
29
@@ -XXX,XX +XXX,XX @@ static bool object_create_initial(const char *type, QemuOpts *opts)
31
+ * it in the drained section.
30
}
32
+ * We do not need to end this section, because we do not want any
31
33
+ * requests happening from here on anyway.
32
str = g_string_new(NULL);
34
+ */
33
- g_string_append_printf(str, "%s.%s=%s", type,
35
+ bdrv_drain_all_begin();
34
- prop->name, prop->type);
36
+
35
+ g_string_append_printf(str, " %s=<%s>", prop->name, prop->type);
37
/* No more vcpu or device emulation activity beyond this point */
36
if (prop->description) {
38
vm_shutdown();
37
+ if (str->len < 24) {
39
38
+ g_string_append_printf(str, "%*s", 24 - (int)str->len, "");
39
+ }
40
g_string_append_printf(str, " - %s", prop->description);
41
}
42
g_ptr_array_add(array, g_string_free(str, false));
43
}
44
g_ptr_array_sort(array, (GCompareFunc)qemu_pstrcmp0);
45
+ if (array->len > 0) {
46
+ printf("%s options:\n", type);
47
+ } else {
48
+ printf("There are no options for %s.\n", type);
49
+ }
50
for (i = 0; i < array->len; i++) {
51
printf("%s\n", (char *)array->pdata[i]);
52
}
53
--
40
--
54
2.19.1
41
2.20.1
55
42
56
43
diff view generated by jsdifflib
1
From: Max Reitz <mreitz@redhat.com>
1
From: Max Reitz <mreitz@redhat.com>
2
2
3
This adds some whitespace into the option help (including indentation)
3
When qemu quits, all throttling should be ignored. That means, if there
4
and puts angle brackets around the type names. Furthermore, the list
4
is a mirror job running from a throttled node, it should be cancelled
5
name is no longer printed as part of every line, but only once in
5
immediately and qemu close without blocking.
6
advance, and only if the caller did not print a caption already.
7
8
This patch also restores the description alignment we had before commit
9
9cbef9d68ee1d8d0, just at 24 instead of 16 characters like we used to.
10
This increase is because now we have the type and two spaces of
11
indentation before the description, and with a usual type name length of
12
three chracters, this sums up to eight additional characters -- which
13
means that we now need 24 characters to get the same amount of padding
14
for most options. Also, 24 is a third of 80, which makes it kind of a
15
round number in terminal terms.
16
17
Finally, this patch amends the reference output of iotest 082 to match
18
the changes (and thus makes it pass again).
19
6
20
Signed-off-by: Max Reitz <mreitz@redhat.com>
7
Signed-off-by: Max Reitz <mreitz@redhat.com>
21
Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>
22
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
8
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
23
---
9
---
24
include/qemu/option.h | 2 +-
10
tests/qemu-iotests/218 | 55 ++++++++++++++++++++++++++++++++++++--
25
qemu-img.c | 4 +-
11
tests/qemu-iotests/218.out | 4 +++
26
util/qemu-option.c | 32 +-
12
2 files changed, 57 insertions(+), 2 deletions(-)
27
tests/qemu-iotests/082.out | 956 ++++++++++++++++++-------------------
28
4 files changed, 507 insertions(+), 487 deletions(-)
29
13
30
diff --git a/include/qemu/option.h b/include/qemu/option.h
14
diff --git a/tests/qemu-iotests/218 b/tests/qemu-iotests/218
15
index XXXXXXX..XXXXXXX 100755
16
--- a/tests/qemu-iotests/218
17
+++ b/tests/qemu-iotests/218
18
@@ -XXX,XX +XXX,XX @@
19
# Creator/Owner: Max Reitz <mreitz@redhat.com>
20
21
import iotests
22
-from iotests import log
23
+from iotests import log, qemu_img, qemu_io_silent
24
25
-iotests.verify_platform(['linux'])
26
+iotests.verify_image_format(supported_fmts=['qcow2', 'raw'])
27
28
29
# Launches the VM, adds two null-co nodes (source and target), and
30
@@ -XXX,XX +XXX,XX @@ with iotests.VM() as vm:
31
32
log(vm.event_wait('BLOCK_JOB_CANCELLED'),
33
filters=[iotests.filter_qmp_event])
34
+
35
+log('')
36
+log('=== Cancel mirror job from throttled node by quitting ===')
37
+log('')
38
+
39
+with iotests.VM() as vm, \
40
+ iotests.FilePath('src.img') as src_img_path:
41
+
42
+ assert qemu_img('create', '-f', iotests.imgfmt, src_img_path, '64M') == 0
43
+ assert qemu_io_silent('-f', iotests.imgfmt, src_img_path,
44
+ '-c', 'write -P 42 0M 64M') == 0
45
+
46
+ vm.launch()
47
+
48
+ ret = vm.qmp('object-add', qom_type='throttle-group', id='tg',
49
+ props={'x-bps-read': 4096})
50
+ assert ret['return'] == {}
51
+
52
+ ret = vm.qmp('blockdev-add',
53
+ node_name='source',
54
+ driver=iotests.imgfmt,
55
+ file={
56
+ 'driver': 'file',
57
+ 'filename': src_img_path
58
+ })
59
+ assert ret['return'] == {}
60
+
61
+ ret = vm.qmp('blockdev-add',
62
+ node_name='throttled-source',
63
+ driver='throttle',
64
+ throttle_group='tg',
65
+ file='source')
66
+ assert ret['return'] == {}
67
+
68
+ ret = vm.qmp('blockdev-add',
69
+ node_name='target',
70
+ driver='null-co',
71
+ size=(64 * 1048576))
72
+ assert ret['return'] == {}
73
+
74
+ ret = vm.qmp('blockdev-mirror',
75
+ job_id='mirror',
76
+ device='throttled-source',
77
+ target='target',
78
+ sync='full')
79
+ assert ret['return'] == {}
80
+
81
+ log(vm.qmp('quit'))
82
+
83
+ with iotests.Timeout(5, 'Timeout waiting for VM to quit'):
84
+ vm.shutdown(has_quit=True)
85
diff --git a/tests/qemu-iotests/218.out b/tests/qemu-iotests/218.out
31
index XXXXXXX..XXXXXXX 100644
86
index XXXXXXX..XXXXXXX 100644
32
--- a/include/qemu/option.h
87
--- a/tests/qemu-iotests/218.out
33
+++ b/include/qemu/option.h
88
+++ b/tests/qemu-iotests/218.out
34
@@ -XXX,XX +XXX,XX @@ typedef int (*qemu_opts_loopfunc)(void *opaque, QemuOpts *opts, Error **errp);
89
@@ -XXX,XX +XXX,XX @@ Cancelling job
35
int qemu_opts_foreach(QemuOptsList *list, qemu_opts_loopfunc func,
90
Cancelling job
36
void *opaque, Error **errp);
91
{"return": {}}
37
void qemu_opts_print(QemuOpts *opts, const char *sep);
92
{"data": {"device": "mirror", "len": 1048576, "offset": 1048576, "speed": 0, "type": "mirror"}, "event": "BLOCK_JOB_CANCELLED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
38
-void qemu_opts_print_help(QemuOptsList *list);
93
+
39
+void qemu_opts_print_help(QemuOptsList *list, bool print_caption);
94
+=== Cancel mirror job from throttled node by quitting ===
40
void qemu_opts_free(QemuOptsList *list);
95
+
41
QemuOptsList *qemu_opts_append(QemuOptsList *dst, QemuOptsList *list);
96
+{"return": {}}
42
43
diff --git a/qemu-img.c b/qemu-img.c
44
index XXXXXXX..XXXXXXX 100644
45
--- a/qemu-img.c
46
+++ b/qemu-img.c
47
@@ -XXX,XX +XXX,XX @@ static int print_block_option_help(const char *filename, const char *fmt)
48
}
49
50
printf("Supported options:\n");
51
- qemu_opts_print_help(create_opts);
52
+ qemu_opts_print_help(create_opts, false);
53
qemu_opts_free(create_opts);
54
return 0;
55
}
56
@@ -XXX,XX +XXX,XX @@ static int print_amend_option_help(const char *format)
57
assert(drv->create_opts);
58
59
printf("Creation options for '%s':\n", format);
60
- qemu_opts_print_help(drv->create_opts);
61
+ qemu_opts_print_help(drv->create_opts, false);
62
printf("\nNote that not all of these options may be amendable.\n");
63
return 0;
64
}
65
diff --git a/util/qemu-option.c b/util/qemu-option.c
66
index XXXXXXX..XXXXXXX 100644
67
--- a/util/qemu-option.c
68
+++ b/util/qemu-option.c
69
@@ -XXX,XX +XXX,XX @@ static const char *opt_type_to_string(enum QemuOptType type)
70
g_assert_not_reached();
71
}
72
73
-void qemu_opts_print_help(QemuOptsList *list)
74
+/**
75
+ * Print the list of options available in the given list. If
76
+ * @print_caption is true, a caption (including the list name, if it
77
+ * exists) is printed. The options itself will be indented, so
78
+ * @print_caption should only be set to false if the caller prints its
79
+ * own custom caption (so that the indentation makes sense).
80
+ */
81
+void qemu_opts_print_help(QemuOptsList *list, bool print_caption)
82
{
83
QemuOptDesc *desc;
84
int i;
85
@@ -XXX,XX +XXX,XX @@ void qemu_opts_print_help(QemuOptsList *list)
86
desc = list->desc;
87
while (desc && desc->name) {
88
GString *str = g_string_new(NULL);
89
- if (list->name) {
90
- g_string_append_printf(str, "%s.", list->name);
91
- }
92
- g_string_append_printf(str, "%s=%s", desc->name,
93
+ g_string_append_printf(str, " %s=<%s>", desc->name,
94
opt_type_to_string(desc->type));
95
if (desc->help) {
96
+ if (str->len < 24) {
97
+ g_string_append_printf(str, "%*s", 24 - (int)str->len, "");
98
+ }
99
g_string_append_printf(str, " - %s", desc->help);
100
}
101
g_ptr_array_add(array, g_string_free(str, false));
102
@@ -XXX,XX +XXX,XX @@ void qemu_opts_print_help(QemuOptsList *list)
103
}
104
105
g_ptr_array_sort(array, (GCompareFunc)qemu_pstrcmp0);
106
+ if (print_caption && array->len > 0) {
107
+ if (list->name) {
108
+ printf("%s options:\n", list->name);
109
+ } else {
110
+ printf("Options:\n");
111
+ }
112
+ } else if (array->len == 0) {
113
+ if (list->name) {
114
+ printf("There are no options for %s.\n", list->name);
115
+ } else {
116
+ printf("No options available.\n");
117
+ }
118
+ }
119
for (i = 0; i < array->len; i++) {
120
printf("%s\n", (char *)array->pdata[i]);
121
}
122
@@ -XXX,XX +XXX,XX @@ QemuOpts *qemu_opts_parse_noisily(QemuOptsList *list, const char *params,
123
opts = opts_parse(list, params, permit_abbrev, false, &invalidp, &err);
124
if (err) {
125
if (invalidp && has_help_option(params)) {
126
- qemu_opts_print_help(list);
127
+ qemu_opts_print_help(list, true);
128
error_free(err);
129
} else {
130
error_report_err(err);
131
diff --git a/tests/qemu-iotests/082.out b/tests/qemu-iotests/082.out
132
index XXXXXXX..XXXXXXX 100644
133
--- a/tests/qemu-iotests/082.out
134
+++ b/tests/qemu-iotests/082.out
135
@@ -XXX,XX +XXX,XX @@ cluster_size: 8192
136
137
Testing: create -f qcow2 -o help TEST_DIR/t.qcow2 128M
138
Supported options:
139
-size Virtual disk size
140
-compat Compatibility level (0.10 or 1.1)
141
-backing_file File name of a base image
142
-backing_fmt Image format of the base image
143
-encryption Encrypt the image with format 'aes'. (Deprecated in favor of encrypt.format=aes)
144
-encrypt.format Encrypt the image, format choices: 'aes', 'luks'
145
-encrypt.key-secret ID of secret providing qcow AES key or LUKS passphrase
146
-encrypt.cipher-alg Name of encryption cipher algorithm
147
-encrypt.cipher-mode Name of encryption cipher mode
148
-encrypt.ivgen-alg Name of IV generator algorithm
149
-encrypt.ivgen-hash-alg Name of IV generator hash algorithm
150
-encrypt.hash-alg Name of encryption hash algorithm
151
-encrypt.iter-time Time to spend in PBKDF in milliseconds
152
-cluster_size qcow2 cluster size
153
-preallocation Preallocation mode (allowed values: off, metadata, falloc, full)
154
-lazy_refcounts Postpone refcount updates
155
-refcount_bits Width of a reference count entry in bits
156
-nocow Turn off copy-on-write (valid only on btrfs)
157
+ backing_file=<str> - File name of a base image
158
+ backing_fmt=<str> - Image format of the base image
159
+ cluster_size=<size> - qcow2 cluster size
160
+ compat=<str> - Compatibility level (0.10 or 1.1)
161
+ encrypt.cipher-alg=<str> - Name of encryption cipher algorithm
162
+ encrypt.cipher-mode=<str> - Name of encryption cipher mode
163
+ encrypt.format=<str> - Encrypt the image, format choices: 'aes', 'luks'
164
+ encrypt.hash-alg=<str> - Name of encryption hash algorithm
165
+ encrypt.iter-time=<num> - Time to spend in PBKDF in milliseconds
166
+ encrypt.ivgen-alg=<str> - Name of IV generator algorithm
167
+ encrypt.ivgen-hash-alg=<str> - Name of IV generator hash algorithm
168
+ encrypt.key-secret=<str> - ID of secret providing qcow AES key or LUKS passphrase
169
+ encryption=<bool (on/off)> - Encrypt the image with format 'aes'. (Deprecated in favor of encrypt.format=aes)
170
+ lazy_refcounts=<bool (on/off)> - Postpone refcount updates
171
+ nocow=<bool (on/off)> - Turn off copy-on-write (valid only on btrfs)
172
+ preallocation=<str> - Preallocation mode (allowed values: off, metadata, falloc, full)
173
+ refcount_bits=<num> - Width of a reference count entry in bits
174
+ size=<size> - Virtual disk size
175
176
Testing: create -f qcow2 -o ? TEST_DIR/t.qcow2 128M
177
Supported options:
178
-size Virtual disk size
179
-compat Compatibility level (0.10 or 1.1)
180
-backing_file File name of a base image
181
-backing_fmt Image format of the base image
182
-encryption Encrypt the image with format 'aes'. (Deprecated in favor of encrypt.format=aes)
183
-encrypt.format Encrypt the image, format choices: 'aes', 'luks'
184
-encrypt.key-secret ID of secret providing qcow AES key or LUKS passphrase
185
-encrypt.cipher-alg Name of encryption cipher algorithm
186
-encrypt.cipher-mode Name of encryption cipher mode
187
-encrypt.ivgen-alg Name of IV generator algorithm
188
-encrypt.ivgen-hash-alg Name of IV generator hash algorithm
189
-encrypt.hash-alg Name of encryption hash algorithm
190
-encrypt.iter-time Time to spend in PBKDF in milliseconds
191
-cluster_size qcow2 cluster size
192
-preallocation Preallocation mode (allowed values: off, metadata, falloc, full)
193
-lazy_refcounts Postpone refcount updates
194
-refcount_bits Width of a reference count entry in bits
195
-nocow Turn off copy-on-write (valid only on btrfs)
196
+ backing_file=<str> - File name of a base image
197
+ backing_fmt=<str> - Image format of the base image
198
+ cluster_size=<size> - qcow2 cluster size
199
+ compat=<str> - Compatibility level (0.10 or 1.1)
200
+ encrypt.cipher-alg=<str> - Name of encryption cipher algorithm
201
+ encrypt.cipher-mode=<str> - Name of encryption cipher mode
202
+ encrypt.format=<str> - Encrypt the image, format choices: 'aes', 'luks'
203
+ encrypt.hash-alg=<str> - Name of encryption hash algorithm
204
+ encrypt.iter-time=<num> - Time to spend in PBKDF in milliseconds
205
+ encrypt.ivgen-alg=<str> - Name of IV generator algorithm
206
+ encrypt.ivgen-hash-alg=<str> - Name of IV generator hash algorithm
207
+ encrypt.key-secret=<str> - ID of secret providing qcow AES key or LUKS passphrase
208
+ encryption=<bool (on/off)> - Encrypt the image with format 'aes'. (Deprecated in favor of encrypt.format=aes)
209
+ lazy_refcounts=<bool (on/off)> - Postpone refcount updates
210
+ nocow=<bool (on/off)> - Turn off copy-on-write (valid only on btrfs)
211
+ preallocation=<str> - Preallocation mode (allowed values: off, metadata, falloc, full)
212
+ refcount_bits=<num> - Width of a reference count entry in bits
213
+ size=<size> - Virtual disk size
214
215
Testing: create -f qcow2 -o cluster_size=4k,help TEST_DIR/t.qcow2 128M
216
Supported options:
217
-size Virtual disk size
218
-compat Compatibility level (0.10 or 1.1)
219
-backing_file File name of a base image
220
-backing_fmt Image format of the base image
221
-encryption Encrypt the image with format 'aes'. (Deprecated in favor of encrypt.format=aes)
222
-encrypt.format Encrypt the image, format choices: 'aes', 'luks'
223
-encrypt.key-secret ID of secret providing qcow AES key or LUKS passphrase
224
-encrypt.cipher-alg Name of encryption cipher algorithm
225
-encrypt.cipher-mode Name of encryption cipher mode
226
-encrypt.ivgen-alg Name of IV generator algorithm
227
-encrypt.ivgen-hash-alg Name of IV generator hash algorithm
228
-encrypt.hash-alg Name of encryption hash algorithm
229
-encrypt.iter-time Time to spend in PBKDF in milliseconds
230
-cluster_size qcow2 cluster size
231
-preallocation Preallocation mode (allowed values: off, metadata, falloc, full)
232
-lazy_refcounts Postpone refcount updates
233
-refcount_bits Width of a reference count entry in bits
234
-nocow Turn off copy-on-write (valid only on btrfs)
235
+ backing_file=<str> - File name of a base image
236
+ backing_fmt=<str> - Image format of the base image
237
+ cluster_size=<size> - qcow2 cluster size
238
+ compat=<str> - Compatibility level (0.10 or 1.1)
239
+ encrypt.cipher-alg=<str> - Name of encryption cipher algorithm
240
+ encrypt.cipher-mode=<str> - Name of encryption cipher mode
241
+ encrypt.format=<str> - Encrypt the image, format choices: 'aes', 'luks'
242
+ encrypt.hash-alg=<str> - Name of encryption hash algorithm
243
+ encrypt.iter-time=<num> - Time to spend in PBKDF in milliseconds
244
+ encrypt.ivgen-alg=<str> - Name of IV generator algorithm
245
+ encrypt.ivgen-hash-alg=<str> - Name of IV generator hash algorithm
246
+ encrypt.key-secret=<str> - ID of secret providing qcow AES key or LUKS passphrase
247
+ encryption=<bool (on/off)> - Encrypt the image with format 'aes'. (Deprecated in favor of encrypt.format=aes)
248
+ lazy_refcounts=<bool (on/off)> - Postpone refcount updates
249
+ nocow=<bool (on/off)> - Turn off copy-on-write (valid only on btrfs)
250
+ preallocation=<str> - Preallocation mode (allowed values: off, metadata, falloc, full)
251
+ refcount_bits=<num> - Width of a reference count entry in bits
252
+ size=<size> - Virtual disk size
253
254
Testing: create -f qcow2 -o cluster_size=4k,? TEST_DIR/t.qcow2 128M
255
Supported options:
256
-size Virtual disk size
257
-compat Compatibility level (0.10 or 1.1)
258
-backing_file File name of a base image
259
-backing_fmt Image format of the base image
260
-encryption Encrypt the image with format 'aes'. (Deprecated in favor of encrypt.format=aes)
261
-encrypt.format Encrypt the image, format choices: 'aes', 'luks'
262
-encrypt.key-secret ID of secret providing qcow AES key or LUKS passphrase
263
-encrypt.cipher-alg Name of encryption cipher algorithm
264
-encrypt.cipher-mode Name of encryption cipher mode
265
-encrypt.ivgen-alg Name of IV generator algorithm
266
-encrypt.ivgen-hash-alg Name of IV generator hash algorithm
267
-encrypt.hash-alg Name of encryption hash algorithm
268
-encrypt.iter-time Time to spend in PBKDF in milliseconds
269
-cluster_size qcow2 cluster size
270
-preallocation Preallocation mode (allowed values: off, metadata, falloc, full)
271
-lazy_refcounts Postpone refcount updates
272
-refcount_bits Width of a reference count entry in bits
273
-nocow Turn off copy-on-write (valid only on btrfs)
274
+ backing_file=<str> - File name of a base image
275
+ backing_fmt=<str> - Image format of the base image
276
+ cluster_size=<size> - qcow2 cluster size
277
+ compat=<str> - Compatibility level (0.10 or 1.1)
278
+ encrypt.cipher-alg=<str> - Name of encryption cipher algorithm
279
+ encrypt.cipher-mode=<str> - Name of encryption cipher mode
280
+ encrypt.format=<str> - Encrypt the image, format choices: 'aes', 'luks'
281
+ encrypt.hash-alg=<str> - Name of encryption hash algorithm
282
+ encrypt.iter-time=<num> - Time to spend in PBKDF in milliseconds
283
+ encrypt.ivgen-alg=<str> - Name of IV generator algorithm
284
+ encrypt.ivgen-hash-alg=<str> - Name of IV generator hash algorithm
285
+ encrypt.key-secret=<str> - ID of secret providing qcow AES key or LUKS passphrase
286
+ encryption=<bool (on/off)> - Encrypt the image with format 'aes'. (Deprecated in favor of encrypt.format=aes)
287
+ lazy_refcounts=<bool (on/off)> - Postpone refcount updates
288
+ nocow=<bool (on/off)> - Turn off copy-on-write (valid only on btrfs)
289
+ preallocation=<str> - Preallocation mode (allowed values: off, metadata, falloc, full)
290
+ refcount_bits=<num> - Width of a reference count entry in bits
291
+ size=<size> - Virtual disk size
292
293
Testing: create -f qcow2 -o help,cluster_size=4k TEST_DIR/t.qcow2 128M
294
Supported options:
295
-size Virtual disk size
296
-compat Compatibility level (0.10 or 1.1)
297
-backing_file File name of a base image
298
-backing_fmt Image format of the base image
299
-encryption Encrypt the image with format 'aes'. (Deprecated in favor of encrypt.format=aes)
300
-encrypt.format Encrypt the image, format choices: 'aes', 'luks'
301
-encrypt.key-secret ID of secret providing qcow AES key or LUKS passphrase
302
-encrypt.cipher-alg Name of encryption cipher algorithm
303
-encrypt.cipher-mode Name of encryption cipher mode
304
-encrypt.ivgen-alg Name of IV generator algorithm
305
-encrypt.ivgen-hash-alg Name of IV generator hash algorithm
306
-encrypt.hash-alg Name of encryption hash algorithm
307
-encrypt.iter-time Time to spend in PBKDF in milliseconds
308
-cluster_size qcow2 cluster size
309
-preallocation Preallocation mode (allowed values: off, metadata, falloc, full)
310
-lazy_refcounts Postpone refcount updates
311
-refcount_bits Width of a reference count entry in bits
312
-nocow Turn off copy-on-write (valid only on btrfs)
313
+ backing_file=<str> - File name of a base image
314
+ backing_fmt=<str> - Image format of the base image
315
+ cluster_size=<size> - qcow2 cluster size
316
+ compat=<str> - Compatibility level (0.10 or 1.1)
317
+ encrypt.cipher-alg=<str> - Name of encryption cipher algorithm
318
+ encrypt.cipher-mode=<str> - Name of encryption cipher mode
319
+ encrypt.format=<str> - Encrypt the image, format choices: 'aes', 'luks'
320
+ encrypt.hash-alg=<str> - Name of encryption hash algorithm
321
+ encrypt.iter-time=<num> - Time to spend in PBKDF in milliseconds
322
+ encrypt.ivgen-alg=<str> - Name of IV generator algorithm
323
+ encrypt.ivgen-hash-alg=<str> - Name of IV generator hash algorithm
324
+ encrypt.key-secret=<str> - ID of secret providing qcow AES key or LUKS passphrase
325
+ encryption=<bool (on/off)> - Encrypt the image with format 'aes'. (Deprecated in favor of encrypt.format=aes)
326
+ lazy_refcounts=<bool (on/off)> - Postpone refcount updates
327
+ nocow=<bool (on/off)> - Turn off copy-on-write (valid only on btrfs)
328
+ preallocation=<str> - Preallocation mode (allowed values: off, metadata, falloc, full)
329
+ refcount_bits=<num> - Width of a reference count entry in bits
330
+ size=<size> - Virtual disk size
331
332
Testing: create -f qcow2 -o ?,cluster_size=4k TEST_DIR/t.qcow2 128M
333
Supported options:
334
-size Virtual disk size
335
-compat Compatibility level (0.10 or 1.1)
336
-backing_file File name of a base image
337
-backing_fmt Image format of the base image
338
-encryption Encrypt the image with format 'aes'. (Deprecated in favor of encrypt.format=aes)
339
-encrypt.format Encrypt the image, format choices: 'aes', 'luks'
340
-encrypt.key-secret ID of secret providing qcow AES key or LUKS passphrase
341
-encrypt.cipher-alg Name of encryption cipher algorithm
342
-encrypt.cipher-mode Name of encryption cipher mode
343
-encrypt.ivgen-alg Name of IV generator algorithm
344
-encrypt.ivgen-hash-alg Name of IV generator hash algorithm
345
-encrypt.hash-alg Name of encryption hash algorithm
346
-encrypt.iter-time Time to spend in PBKDF in milliseconds
347
-cluster_size qcow2 cluster size
348
-preallocation Preallocation mode (allowed values: off, metadata, falloc, full)
349
-lazy_refcounts Postpone refcount updates
350
-refcount_bits Width of a reference count entry in bits
351
-nocow Turn off copy-on-write (valid only on btrfs)
352
+ backing_file=<str> - File name of a base image
353
+ backing_fmt=<str> - Image format of the base image
354
+ cluster_size=<size> - qcow2 cluster size
355
+ compat=<str> - Compatibility level (0.10 or 1.1)
356
+ encrypt.cipher-alg=<str> - Name of encryption cipher algorithm
357
+ encrypt.cipher-mode=<str> - Name of encryption cipher mode
358
+ encrypt.format=<str> - Encrypt the image, format choices: 'aes', 'luks'
359
+ encrypt.hash-alg=<str> - Name of encryption hash algorithm
360
+ encrypt.iter-time=<num> - Time to spend in PBKDF in milliseconds
361
+ encrypt.ivgen-alg=<str> - Name of IV generator algorithm
362
+ encrypt.ivgen-hash-alg=<str> - Name of IV generator hash algorithm
363
+ encrypt.key-secret=<str> - ID of secret providing qcow AES key or LUKS passphrase
364
+ encryption=<bool (on/off)> - Encrypt the image with format 'aes'. (Deprecated in favor of encrypt.format=aes)
365
+ lazy_refcounts=<bool (on/off)> - Postpone refcount updates
366
+ nocow=<bool (on/off)> - Turn off copy-on-write (valid only on btrfs)
367
+ preallocation=<str> - Preallocation mode (allowed values: off, metadata, falloc, full)
368
+ refcount_bits=<num> - Width of a reference count entry in bits
369
+ size=<size> - Virtual disk size
370
371
Testing: create -f qcow2 -o cluster_size=4k -o help TEST_DIR/t.qcow2 128M
372
Supported options:
373
-size Virtual disk size
374
-compat Compatibility level (0.10 or 1.1)
375
-backing_file File name of a base image
376
-backing_fmt Image format of the base image
377
-encryption Encrypt the image with format 'aes'. (Deprecated in favor of encrypt.format=aes)
378
-encrypt.format Encrypt the image, format choices: 'aes', 'luks'
379
-encrypt.key-secret ID of secret providing qcow AES key or LUKS passphrase
380
-encrypt.cipher-alg Name of encryption cipher algorithm
381
-encrypt.cipher-mode Name of encryption cipher mode
382
-encrypt.ivgen-alg Name of IV generator algorithm
383
-encrypt.ivgen-hash-alg Name of IV generator hash algorithm
384
-encrypt.hash-alg Name of encryption hash algorithm
385
-encrypt.iter-time Time to spend in PBKDF in milliseconds
386
-cluster_size qcow2 cluster size
387
-preallocation Preallocation mode (allowed values: off, metadata, falloc, full)
388
-lazy_refcounts Postpone refcount updates
389
-refcount_bits Width of a reference count entry in bits
390
-nocow Turn off copy-on-write (valid only on btrfs)
391
+ backing_file=<str> - File name of a base image
392
+ backing_fmt=<str> - Image format of the base image
393
+ cluster_size=<size> - qcow2 cluster size
394
+ compat=<str> - Compatibility level (0.10 or 1.1)
395
+ encrypt.cipher-alg=<str> - Name of encryption cipher algorithm
396
+ encrypt.cipher-mode=<str> - Name of encryption cipher mode
397
+ encrypt.format=<str> - Encrypt the image, format choices: 'aes', 'luks'
398
+ encrypt.hash-alg=<str> - Name of encryption hash algorithm
399
+ encrypt.iter-time=<num> - Time to spend in PBKDF in milliseconds
400
+ encrypt.ivgen-alg=<str> - Name of IV generator algorithm
401
+ encrypt.ivgen-hash-alg=<str> - Name of IV generator hash algorithm
402
+ encrypt.key-secret=<str> - ID of secret providing qcow AES key or LUKS passphrase
403
+ encryption=<bool (on/off)> - Encrypt the image with format 'aes'. (Deprecated in favor of encrypt.format=aes)
404
+ lazy_refcounts=<bool (on/off)> - Postpone refcount updates
405
+ nocow=<bool (on/off)> - Turn off copy-on-write (valid only on btrfs)
406
+ preallocation=<str> - Preallocation mode (allowed values: off, metadata, falloc, full)
407
+ refcount_bits=<num> - Width of a reference count entry in bits
408
+ size=<size> - Virtual disk size
409
410
Testing: create -f qcow2 -o cluster_size=4k -o ? TEST_DIR/t.qcow2 128M
411
Supported options:
412
-size Virtual disk size
413
-compat Compatibility level (0.10 or 1.1)
414
-backing_file File name of a base image
415
-backing_fmt Image format of the base image
416
-encryption Encrypt the image with format 'aes'. (Deprecated in favor of encrypt.format=aes)
417
-encrypt.format Encrypt the image, format choices: 'aes', 'luks'
418
-encrypt.key-secret ID of secret providing qcow AES key or LUKS passphrase
419
-encrypt.cipher-alg Name of encryption cipher algorithm
420
-encrypt.cipher-mode Name of encryption cipher mode
421
-encrypt.ivgen-alg Name of IV generator algorithm
422
-encrypt.ivgen-hash-alg Name of IV generator hash algorithm
423
-encrypt.hash-alg Name of encryption hash algorithm
424
-encrypt.iter-time Time to spend in PBKDF in milliseconds
425
-cluster_size qcow2 cluster size
426
-preallocation Preallocation mode (allowed values: off, metadata, falloc, full)
427
-lazy_refcounts Postpone refcount updates
428
-refcount_bits Width of a reference count entry in bits
429
-nocow Turn off copy-on-write (valid only on btrfs)
430
+ backing_file=<str> - File name of a base image
431
+ backing_fmt=<str> - Image format of the base image
432
+ cluster_size=<size> - qcow2 cluster size
433
+ compat=<str> - Compatibility level (0.10 or 1.1)
434
+ encrypt.cipher-alg=<str> - Name of encryption cipher algorithm
435
+ encrypt.cipher-mode=<str> - Name of encryption cipher mode
436
+ encrypt.format=<str> - Encrypt the image, format choices: 'aes', 'luks'
437
+ encrypt.hash-alg=<str> - Name of encryption hash algorithm
438
+ encrypt.iter-time=<num> - Time to spend in PBKDF in milliseconds
439
+ encrypt.ivgen-alg=<str> - Name of IV generator algorithm
440
+ encrypt.ivgen-hash-alg=<str> - Name of IV generator hash algorithm
441
+ encrypt.key-secret=<str> - ID of secret providing qcow AES key or LUKS passphrase
442
+ encryption=<bool (on/off)> - Encrypt the image with format 'aes'. (Deprecated in favor of encrypt.format=aes)
443
+ lazy_refcounts=<bool (on/off)> - Postpone refcount updates
444
+ nocow=<bool (on/off)> - Turn off copy-on-write (valid only on btrfs)
445
+ preallocation=<str> - Preallocation mode (allowed values: off, metadata, falloc, full)
446
+ refcount_bits=<num> - Width of a reference count entry in bits
447
+ size=<size> - Virtual disk size
448
449
Testing: create -f qcow2 -u -o backing_file=TEST_DIR/t.qcow2,,help TEST_DIR/t.qcow2 128M
450
Formatting 'TEST_DIR/t.qcow2', fmt=qcow2 size=134217728 backing_file=TEST_DIR/t.qcow2,,help cluster_size=65536 lazy_refcounts=off refcount_bits=16
451
@@ -XXX,XX +XXX,XX @@ qemu-img: Invalid option list: ,,
452
453
Testing: create -f qcow2 -o help
454
Supported options:
455
-size Virtual disk size
456
-compat Compatibility level (0.10 or 1.1)
457
-backing_file File name of a base image
458
-backing_fmt Image format of the base image
459
-encryption Encrypt the image with format 'aes'. (Deprecated in favor of encrypt.format=aes)
460
-encrypt.format Encrypt the image, format choices: 'aes', 'luks'
461
-encrypt.key-secret ID of secret providing qcow AES key or LUKS passphrase
462
-encrypt.cipher-alg Name of encryption cipher algorithm
463
-encrypt.cipher-mode Name of encryption cipher mode
464
-encrypt.ivgen-alg Name of IV generator algorithm
465
-encrypt.ivgen-hash-alg Name of IV generator hash algorithm
466
-encrypt.hash-alg Name of encryption hash algorithm
467
-encrypt.iter-time Time to spend in PBKDF in milliseconds
468
-cluster_size qcow2 cluster size
469
-preallocation Preallocation mode (allowed values: off, metadata, falloc, full)
470
-lazy_refcounts Postpone refcount updates
471
-refcount_bits Width of a reference count entry in bits
472
+ backing_file=<str> - File name of a base image
473
+ backing_fmt=<str> - Image format of the base image
474
+ cluster_size=<size> - qcow2 cluster size
475
+ compat=<str> - Compatibility level (0.10 or 1.1)
476
+ encrypt.cipher-alg=<str> - Name of encryption cipher algorithm
477
+ encrypt.cipher-mode=<str> - Name of encryption cipher mode
478
+ encrypt.format=<str> - Encrypt the image, format choices: 'aes', 'luks'
479
+ encrypt.hash-alg=<str> - Name of encryption hash algorithm
480
+ encrypt.iter-time=<num> - Time to spend in PBKDF in milliseconds
481
+ encrypt.ivgen-alg=<str> - Name of IV generator algorithm
482
+ encrypt.ivgen-hash-alg=<str> - Name of IV generator hash algorithm
483
+ encrypt.key-secret=<str> - ID of secret providing qcow AES key or LUKS passphrase
484
+ encryption=<bool (on/off)> - Encrypt the image with format 'aes'. (Deprecated in favor of encrypt.format=aes)
485
+ lazy_refcounts=<bool (on/off)> - Postpone refcount updates
486
+ preallocation=<str> - Preallocation mode (allowed values: off, metadata, falloc, full)
487
+ refcount_bits=<num> - Width of a reference count entry in bits
488
+ size=<size> - Virtual disk size
489
490
Testing: create -o help
491
Supported options:
492
-size Virtual disk size
493
+ size=<size> - Virtual disk size
494
495
Testing: create -f bochs -o help
496
qemu-img: Format driver 'bochs' does not support image creation
497
@@ -XXX,XX +XXX,XX @@ cluster_size: 8192
498
499
Testing: convert -O qcow2 -o help TEST_DIR/t.qcow2 TEST_DIR/t.qcow2.base
500
Supported options:
501
-size Virtual disk size
502
-compat Compatibility level (0.10 or 1.1)
503
-backing_file File name of a base image
504
-backing_fmt Image format of the base image
505
-encryption Encrypt the image with format 'aes'. (Deprecated in favor of encrypt.format=aes)
506
-encrypt.format Encrypt the image, format choices: 'aes', 'luks'
507
-encrypt.key-secret ID of secret providing qcow AES key or LUKS passphrase
508
-encrypt.cipher-alg Name of encryption cipher algorithm
509
-encrypt.cipher-mode Name of encryption cipher mode
510
-encrypt.ivgen-alg Name of IV generator algorithm
511
-encrypt.ivgen-hash-alg Name of IV generator hash algorithm
512
-encrypt.hash-alg Name of encryption hash algorithm
513
-encrypt.iter-time Time to spend in PBKDF in milliseconds
514
-cluster_size qcow2 cluster size
515
-preallocation Preallocation mode (allowed values: off, metadata, falloc, full)
516
-lazy_refcounts Postpone refcount updates
517
-refcount_bits Width of a reference count entry in bits
518
-nocow Turn off copy-on-write (valid only on btrfs)
519
+ backing_file=<str> - File name of a base image
520
+ backing_fmt=<str> - Image format of the base image
521
+ cluster_size=<size> - qcow2 cluster size
522
+ compat=<str> - Compatibility level (0.10 or 1.1)
523
+ encrypt.cipher-alg=<str> - Name of encryption cipher algorithm
524
+ encrypt.cipher-mode=<str> - Name of encryption cipher mode
525
+ encrypt.format=<str> - Encrypt the image, format choices: 'aes', 'luks'
526
+ encrypt.hash-alg=<str> - Name of encryption hash algorithm
527
+ encrypt.iter-time=<num> - Time to spend in PBKDF in milliseconds
528
+ encrypt.ivgen-alg=<str> - Name of IV generator algorithm
529
+ encrypt.ivgen-hash-alg=<str> - Name of IV generator hash algorithm
530
+ encrypt.key-secret=<str> - ID of secret providing qcow AES key or LUKS passphrase
531
+ encryption=<bool (on/off)> - Encrypt the image with format 'aes'. (Deprecated in favor of encrypt.format=aes)
532
+ lazy_refcounts=<bool (on/off)> - Postpone refcount updates
533
+ nocow=<bool (on/off)> - Turn off copy-on-write (valid only on btrfs)
534
+ preallocation=<str> - Preallocation mode (allowed values: off, metadata, falloc, full)
535
+ refcount_bits=<num> - Width of a reference count entry in bits
536
+ size=<size> - Virtual disk size
537
538
Testing: convert -O qcow2 -o ? TEST_DIR/t.qcow2 TEST_DIR/t.qcow2.base
539
Supported options:
540
-size Virtual disk size
541
-compat Compatibility level (0.10 or 1.1)
542
-backing_file File name of a base image
543
-backing_fmt Image format of the base image
544
-encryption Encrypt the image with format 'aes'. (Deprecated in favor of encrypt.format=aes)
545
-encrypt.format Encrypt the image, format choices: 'aes', 'luks'
546
-encrypt.key-secret ID of secret providing qcow AES key or LUKS passphrase
547
-encrypt.cipher-alg Name of encryption cipher algorithm
548
-encrypt.cipher-mode Name of encryption cipher mode
549
-encrypt.ivgen-alg Name of IV generator algorithm
550
-encrypt.ivgen-hash-alg Name of IV generator hash algorithm
551
-encrypt.hash-alg Name of encryption hash algorithm
552
-encrypt.iter-time Time to spend in PBKDF in milliseconds
553
-cluster_size qcow2 cluster size
554
-preallocation Preallocation mode (allowed values: off, metadata, falloc, full)
555
-lazy_refcounts Postpone refcount updates
556
-refcount_bits Width of a reference count entry in bits
557
-nocow Turn off copy-on-write (valid only on btrfs)
558
+ backing_file=<str> - File name of a base image
559
+ backing_fmt=<str> - Image format of the base image
560
+ cluster_size=<size> - qcow2 cluster size
561
+ compat=<str> - Compatibility level (0.10 or 1.1)
562
+ encrypt.cipher-alg=<str> - Name of encryption cipher algorithm
563
+ encrypt.cipher-mode=<str> - Name of encryption cipher mode
564
+ encrypt.format=<str> - Encrypt the image, format choices: 'aes', 'luks'
565
+ encrypt.hash-alg=<str> - Name of encryption hash algorithm
566
+ encrypt.iter-time=<num> - Time to spend in PBKDF in milliseconds
567
+ encrypt.ivgen-alg=<str> - Name of IV generator algorithm
568
+ encrypt.ivgen-hash-alg=<str> - Name of IV generator hash algorithm
569
+ encrypt.key-secret=<str> - ID of secret providing qcow AES key or LUKS passphrase
570
+ encryption=<bool (on/off)> - Encrypt the image with format 'aes'. (Deprecated in favor of encrypt.format=aes)
571
+ lazy_refcounts=<bool (on/off)> - Postpone refcount updates
572
+ nocow=<bool (on/off)> - Turn off copy-on-write (valid only on btrfs)
573
+ preallocation=<str> - Preallocation mode (allowed values: off, metadata, falloc, full)
574
+ refcount_bits=<num> - Width of a reference count entry in bits
575
+ size=<size> - Virtual disk size
576
577
Testing: convert -O qcow2 -o cluster_size=4k,help TEST_DIR/t.qcow2 TEST_DIR/t.qcow2.base
578
Supported options:
579
-size Virtual disk size
580
-compat Compatibility level (0.10 or 1.1)
581
-backing_file File name of a base image
582
-backing_fmt Image format of the base image
583
-encryption Encrypt the image with format 'aes'. (Deprecated in favor of encrypt.format=aes)
584
-encrypt.format Encrypt the image, format choices: 'aes', 'luks'
585
-encrypt.key-secret ID of secret providing qcow AES key or LUKS passphrase
586
-encrypt.cipher-alg Name of encryption cipher algorithm
587
-encrypt.cipher-mode Name of encryption cipher mode
588
-encrypt.ivgen-alg Name of IV generator algorithm
589
-encrypt.ivgen-hash-alg Name of IV generator hash algorithm
590
-encrypt.hash-alg Name of encryption hash algorithm
591
-encrypt.iter-time Time to spend in PBKDF in milliseconds
592
-cluster_size qcow2 cluster size
593
-preallocation Preallocation mode (allowed values: off, metadata, falloc, full)
594
-lazy_refcounts Postpone refcount updates
595
-refcount_bits Width of a reference count entry in bits
596
-nocow Turn off copy-on-write (valid only on btrfs)
597
+ backing_file=<str> - File name of a base image
598
+ backing_fmt=<str> - Image format of the base image
599
+ cluster_size=<size> - qcow2 cluster size
600
+ compat=<str> - Compatibility level (0.10 or 1.1)
601
+ encrypt.cipher-alg=<str> - Name of encryption cipher algorithm
602
+ encrypt.cipher-mode=<str> - Name of encryption cipher mode
603
+ encrypt.format=<str> - Encrypt the image, format choices: 'aes', 'luks'
604
+ encrypt.hash-alg=<str> - Name of encryption hash algorithm
605
+ encrypt.iter-time=<num> - Time to spend in PBKDF in milliseconds
606
+ encrypt.ivgen-alg=<str> - Name of IV generator algorithm
607
+ encrypt.ivgen-hash-alg=<str> - Name of IV generator hash algorithm
608
+ encrypt.key-secret=<str> - ID of secret providing qcow AES key or LUKS passphrase
609
+ encryption=<bool (on/off)> - Encrypt the image with format 'aes'. (Deprecated in favor of encrypt.format=aes)
610
+ lazy_refcounts=<bool (on/off)> - Postpone refcount updates
611
+ nocow=<bool (on/off)> - Turn off copy-on-write (valid only on btrfs)
612
+ preallocation=<str> - Preallocation mode (allowed values: off, metadata, falloc, full)
613
+ refcount_bits=<num> - Width of a reference count entry in bits
614
+ size=<size> - Virtual disk size
615
616
Testing: convert -O qcow2 -o cluster_size=4k,? TEST_DIR/t.qcow2 TEST_DIR/t.qcow2.base
617
Supported options:
618
-size Virtual disk size
619
-compat Compatibility level (0.10 or 1.1)
620
-backing_file File name of a base image
621
-backing_fmt Image format of the base image
622
-encryption Encrypt the image with format 'aes'. (Deprecated in favor of encrypt.format=aes)
623
-encrypt.format Encrypt the image, format choices: 'aes', 'luks'
624
-encrypt.key-secret ID of secret providing qcow AES key or LUKS passphrase
625
-encrypt.cipher-alg Name of encryption cipher algorithm
626
-encrypt.cipher-mode Name of encryption cipher mode
627
-encrypt.ivgen-alg Name of IV generator algorithm
628
-encrypt.ivgen-hash-alg Name of IV generator hash algorithm
629
-encrypt.hash-alg Name of encryption hash algorithm
630
-encrypt.iter-time Time to spend in PBKDF in milliseconds
631
-cluster_size qcow2 cluster size
632
-preallocation Preallocation mode (allowed values: off, metadata, falloc, full)
633
-lazy_refcounts Postpone refcount updates
634
-refcount_bits Width of a reference count entry in bits
635
-nocow Turn off copy-on-write (valid only on btrfs)
636
+ backing_file=<str> - File name of a base image
637
+ backing_fmt=<str> - Image format of the base image
638
+ cluster_size=<size> - qcow2 cluster size
639
+ compat=<str> - Compatibility level (0.10 or 1.1)
640
+ encrypt.cipher-alg=<str> - Name of encryption cipher algorithm
641
+ encrypt.cipher-mode=<str> - Name of encryption cipher mode
642
+ encrypt.format=<str> - Encrypt the image, format choices: 'aes', 'luks'
643
+ encrypt.hash-alg=<str> - Name of encryption hash algorithm
644
+ encrypt.iter-time=<num> - Time to spend in PBKDF in milliseconds
645
+ encrypt.ivgen-alg=<str> - Name of IV generator algorithm
646
+ encrypt.ivgen-hash-alg=<str> - Name of IV generator hash algorithm
647
+ encrypt.key-secret=<str> - ID of secret providing qcow AES key or LUKS passphrase
648
+ encryption=<bool (on/off)> - Encrypt the image with format 'aes'. (Deprecated in favor of encrypt.format=aes)
649
+ lazy_refcounts=<bool (on/off)> - Postpone refcount updates
650
+ nocow=<bool (on/off)> - Turn off copy-on-write (valid only on btrfs)
651
+ preallocation=<str> - Preallocation mode (allowed values: off, metadata, falloc, full)
652
+ refcount_bits=<num> - Width of a reference count entry in bits
653
+ size=<size> - Virtual disk size
654
655
Testing: convert -O qcow2 -o help,cluster_size=4k TEST_DIR/t.qcow2 TEST_DIR/t.qcow2.base
656
Supported options:
657
-size Virtual disk size
658
-compat Compatibility level (0.10 or 1.1)
659
-backing_file File name of a base image
660
-backing_fmt Image format of the base image
661
-encryption Encrypt the image with format 'aes'. (Deprecated in favor of encrypt.format=aes)
662
-encrypt.format Encrypt the image, format choices: 'aes', 'luks'
663
-encrypt.key-secret ID of secret providing qcow AES key or LUKS passphrase
664
-encrypt.cipher-alg Name of encryption cipher algorithm
665
-encrypt.cipher-mode Name of encryption cipher mode
666
-encrypt.ivgen-alg Name of IV generator algorithm
667
-encrypt.ivgen-hash-alg Name of IV generator hash algorithm
668
-encrypt.hash-alg Name of encryption hash algorithm
669
-encrypt.iter-time Time to spend in PBKDF in milliseconds
670
-cluster_size qcow2 cluster size
671
-preallocation Preallocation mode (allowed values: off, metadata, falloc, full)
672
-lazy_refcounts Postpone refcount updates
673
-refcount_bits Width of a reference count entry in bits
674
-nocow Turn off copy-on-write (valid only on btrfs)
675
+ backing_file=<str> - File name of a base image
676
+ backing_fmt=<str> - Image format of the base image
677
+ cluster_size=<size> - qcow2 cluster size
678
+ compat=<str> - Compatibility level (0.10 or 1.1)
679
+ encrypt.cipher-alg=<str> - Name of encryption cipher algorithm
680
+ encrypt.cipher-mode=<str> - Name of encryption cipher mode
681
+ encrypt.format=<str> - Encrypt the image, format choices: 'aes', 'luks'
682
+ encrypt.hash-alg=<str> - Name of encryption hash algorithm
683
+ encrypt.iter-time=<num> - Time to spend in PBKDF in milliseconds
684
+ encrypt.ivgen-alg=<str> - Name of IV generator algorithm
685
+ encrypt.ivgen-hash-alg=<str> - Name of IV generator hash algorithm
686
+ encrypt.key-secret=<str> - ID of secret providing qcow AES key or LUKS passphrase
687
+ encryption=<bool (on/off)> - Encrypt the image with format 'aes'. (Deprecated in favor of encrypt.format=aes)
688
+ lazy_refcounts=<bool (on/off)> - Postpone refcount updates
689
+ nocow=<bool (on/off)> - Turn off copy-on-write (valid only on btrfs)
690
+ preallocation=<str> - Preallocation mode (allowed values: off, metadata, falloc, full)
691
+ refcount_bits=<num> - Width of a reference count entry in bits
692
+ size=<size> - Virtual disk size
693
694
Testing: convert -O qcow2 -o ?,cluster_size=4k TEST_DIR/t.qcow2 TEST_DIR/t.qcow2.base
695
Supported options:
696
-size Virtual disk size
697
-compat Compatibility level (0.10 or 1.1)
698
-backing_file File name of a base image
699
-backing_fmt Image format of the base image
700
-encryption Encrypt the image with format 'aes'. (Deprecated in favor of encrypt.format=aes)
701
-encrypt.format Encrypt the image, format choices: 'aes', 'luks'
702
-encrypt.key-secret ID of secret providing qcow AES key or LUKS passphrase
703
-encrypt.cipher-alg Name of encryption cipher algorithm
704
-encrypt.cipher-mode Name of encryption cipher mode
705
-encrypt.ivgen-alg Name of IV generator algorithm
706
-encrypt.ivgen-hash-alg Name of IV generator hash algorithm
707
-encrypt.hash-alg Name of encryption hash algorithm
708
-encrypt.iter-time Time to spend in PBKDF in milliseconds
709
-cluster_size qcow2 cluster size
710
-preallocation Preallocation mode (allowed values: off, metadata, falloc, full)
711
-lazy_refcounts Postpone refcount updates
712
-refcount_bits Width of a reference count entry in bits
713
-nocow Turn off copy-on-write (valid only on btrfs)
714
+ backing_file=<str> - File name of a base image
715
+ backing_fmt=<str> - Image format of the base image
716
+ cluster_size=<size> - qcow2 cluster size
717
+ compat=<str> - Compatibility level (0.10 or 1.1)
718
+ encrypt.cipher-alg=<str> - Name of encryption cipher algorithm
719
+ encrypt.cipher-mode=<str> - Name of encryption cipher mode
720
+ encrypt.format=<str> - Encrypt the image, format choices: 'aes', 'luks'
721
+ encrypt.hash-alg=<str> - Name of encryption hash algorithm
722
+ encrypt.iter-time=<num> - Time to spend in PBKDF in milliseconds
723
+ encrypt.ivgen-alg=<str> - Name of IV generator algorithm
724
+ encrypt.ivgen-hash-alg=<str> - Name of IV generator hash algorithm
725
+ encrypt.key-secret=<str> - ID of secret providing qcow AES key or LUKS passphrase
726
+ encryption=<bool (on/off)> - Encrypt the image with format 'aes'. (Deprecated in favor of encrypt.format=aes)
727
+ lazy_refcounts=<bool (on/off)> - Postpone refcount updates
728
+ nocow=<bool (on/off)> - Turn off copy-on-write (valid only on btrfs)
729
+ preallocation=<str> - Preallocation mode (allowed values: off, metadata, falloc, full)
730
+ refcount_bits=<num> - Width of a reference count entry in bits
731
+ size=<size> - Virtual disk size
732
733
Testing: convert -O qcow2 -o cluster_size=4k -o help TEST_DIR/t.qcow2 TEST_DIR/t.qcow2.base
734
Supported options:
735
-size Virtual disk size
736
-compat Compatibility level (0.10 or 1.1)
737
-backing_file File name of a base image
738
-backing_fmt Image format of the base image
739
-encryption Encrypt the image with format 'aes'. (Deprecated in favor of encrypt.format=aes)
740
-encrypt.format Encrypt the image, format choices: 'aes', 'luks'
741
-encrypt.key-secret ID of secret providing qcow AES key or LUKS passphrase
742
-encrypt.cipher-alg Name of encryption cipher algorithm
743
-encrypt.cipher-mode Name of encryption cipher mode
744
-encrypt.ivgen-alg Name of IV generator algorithm
745
-encrypt.ivgen-hash-alg Name of IV generator hash algorithm
746
-encrypt.hash-alg Name of encryption hash algorithm
747
-encrypt.iter-time Time to spend in PBKDF in milliseconds
748
-cluster_size qcow2 cluster size
749
-preallocation Preallocation mode (allowed values: off, metadata, falloc, full)
750
-lazy_refcounts Postpone refcount updates
751
-refcount_bits Width of a reference count entry in bits
752
-nocow Turn off copy-on-write (valid only on btrfs)
753
+ backing_file=<str> - File name of a base image
754
+ backing_fmt=<str> - Image format of the base image
755
+ cluster_size=<size> - qcow2 cluster size
756
+ compat=<str> - Compatibility level (0.10 or 1.1)
757
+ encrypt.cipher-alg=<str> - Name of encryption cipher algorithm
758
+ encrypt.cipher-mode=<str> - Name of encryption cipher mode
759
+ encrypt.format=<str> - Encrypt the image, format choices: 'aes', 'luks'
760
+ encrypt.hash-alg=<str> - Name of encryption hash algorithm
761
+ encrypt.iter-time=<num> - Time to spend in PBKDF in milliseconds
762
+ encrypt.ivgen-alg=<str> - Name of IV generator algorithm
763
+ encrypt.ivgen-hash-alg=<str> - Name of IV generator hash algorithm
764
+ encrypt.key-secret=<str> - ID of secret providing qcow AES key or LUKS passphrase
765
+ encryption=<bool (on/off)> - Encrypt the image with format 'aes'. (Deprecated in favor of encrypt.format=aes)
766
+ lazy_refcounts=<bool (on/off)> - Postpone refcount updates
767
+ nocow=<bool (on/off)> - Turn off copy-on-write (valid only on btrfs)
768
+ preallocation=<str> - Preallocation mode (allowed values: off, metadata, falloc, full)
769
+ refcount_bits=<num> - Width of a reference count entry in bits
770
+ size=<size> - Virtual disk size
771
772
Testing: convert -O qcow2 -o cluster_size=4k -o ? TEST_DIR/t.qcow2 TEST_DIR/t.qcow2.base
773
Supported options:
774
-size Virtual disk size
775
-compat Compatibility level (0.10 or 1.1)
776
-backing_file File name of a base image
777
-backing_fmt Image format of the base image
778
-encryption Encrypt the image with format 'aes'. (Deprecated in favor of encrypt.format=aes)
779
-encrypt.format Encrypt the image, format choices: 'aes', 'luks'
780
-encrypt.key-secret ID of secret providing qcow AES key or LUKS passphrase
781
-encrypt.cipher-alg Name of encryption cipher algorithm
782
-encrypt.cipher-mode Name of encryption cipher mode
783
-encrypt.ivgen-alg Name of IV generator algorithm
784
-encrypt.ivgen-hash-alg Name of IV generator hash algorithm
785
-encrypt.hash-alg Name of encryption hash algorithm
786
-encrypt.iter-time Time to spend in PBKDF in milliseconds
787
-cluster_size qcow2 cluster size
788
-preallocation Preallocation mode (allowed values: off, metadata, falloc, full)
789
-lazy_refcounts Postpone refcount updates
790
-refcount_bits Width of a reference count entry in bits
791
-nocow Turn off copy-on-write (valid only on btrfs)
792
+ backing_file=<str> - File name of a base image
793
+ backing_fmt=<str> - Image format of the base image
794
+ cluster_size=<size> - qcow2 cluster size
795
+ compat=<str> - Compatibility level (0.10 or 1.1)
796
+ encrypt.cipher-alg=<str> - Name of encryption cipher algorithm
797
+ encrypt.cipher-mode=<str> - Name of encryption cipher mode
798
+ encrypt.format=<str> - Encrypt the image, format choices: 'aes', 'luks'
799
+ encrypt.hash-alg=<str> - Name of encryption hash algorithm
800
+ encrypt.iter-time=<num> - Time to spend in PBKDF in milliseconds
801
+ encrypt.ivgen-alg=<str> - Name of IV generator algorithm
802
+ encrypt.ivgen-hash-alg=<str> - Name of IV generator hash algorithm
803
+ encrypt.key-secret=<str> - ID of secret providing qcow AES key or LUKS passphrase
804
+ encryption=<bool (on/off)> - Encrypt the image with format 'aes'. (Deprecated in favor of encrypt.format=aes)
805
+ lazy_refcounts=<bool (on/off)> - Postpone refcount updates
806
+ nocow=<bool (on/off)> - Turn off copy-on-write (valid only on btrfs)
807
+ preallocation=<str> - Preallocation mode (allowed values: off, metadata, falloc, full)
808
+ refcount_bits=<num> - Width of a reference count entry in bits
809
+ size=<size> - Virtual disk size
810
811
Testing: convert -O qcow2 -o backing_file=TEST_DIR/t.qcow2,,help TEST_DIR/t.qcow2 TEST_DIR/t.qcow2.base
812
qemu-img: Could not open 'TEST_DIR/t.qcow2.base': Could not open backing file: Could not open 'TEST_DIR/t.qcow2,help': No such file or directory
813
@@ -XXX,XX +XXX,XX @@ qemu-img: Invalid option list: ,,
814
815
Testing: convert -O qcow2 -o help
816
Supported options:
817
-size Virtual disk size
818
-compat Compatibility level (0.10 or 1.1)
819
-backing_file File name of a base image
820
-backing_fmt Image format of the base image
821
-encryption Encrypt the image with format 'aes'. (Deprecated in favor of encrypt.format=aes)
822
-encrypt.format Encrypt the image, format choices: 'aes', 'luks'
823
-encrypt.key-secret ID of secret providing qcow AES key or LUKS passphrase
824
-encrypt.cipher-alg Name of encryption cipher algorithm
825
-encrypt.cipher-mode Name of encryption cipher mode
826
-encrypt.ivgen-alg Name of IV generator algorithm
827
-encrypt.ivgen-hash-alg Name of IV generator hash algorithm
828
-encrypt.hash-alg Name of encryption hash algorithm
829
-encrypt.iter-time Time to spend in PBKDF in milliseconds
830
-cluster_size qcow2 cluster size
831
-preallocation Preallocation mode (allowed values: off, metadata, falloc, full)
832
-lazy_refcounts Postpone refcount updates
833
-refcount_bits Width of a reference count entry in bits
834
+ backing_file=<str> - File name of a base image
835
+ backing_fmt=<str> - Image format of the base image
836
+ cluster_size=<size> - qcow2 cluster size
837
+ compat=<str> - Compatibility level (0.10 or 1.1)
838
+ encrypt.cipher-alg=<str> - Name of encryption cipher algorithm
839
+ encrypt.cipher-mode=<str> - Name of encryption cipher mode
840
+ encrypt.format=<str> - Encrypt the image, format choices: 'aes', 'luks'
841
+ encrypt.hash-alg=<str> - Name of encryption hash algorithm
842
+ encrypt.iter-time=<num> - Time to spend in PBKDF in milliseconds
843
+ encrypt.ivgen-alg=<str> - Name of IV generator algorithm
844
+ encrypt.ivgen-hash-alg=<str> - Name of IV generator hash algorithm
845
+ encrypt.key-secret=<str> - ID of secret providing qcow AES key or LUKS passphrase
846
+ encryption=<bool (on/off)> - Encrypt the image with format 'aes'. (Deprecated in favor of encrypt.format=aes)
847
+ lazy_refcounts=<bool (on/off)> - Postpone refcount updates
848
+ preallocation=<str> - Preallocation mode (allowed values: off, metadata, falloc, full)
849
+ refcount_bits=<num> - Width of a reference count entry in bits
850
+ size=<size> - Virtual disk size
851
852
Testing: convert -o help
853
Supported options:
854
-size Virtual disk size
855
+ size=<size> - Virtual disk size
856
857
Testing: convert -O bochs -o help
858
qemu-img: Format driver 'bochs' does not support image creation
859
@@ -XXX,XX +XXX,XX @@ cluster_size: 65536
860
861
Testing: amend -f qcow2 -o help TEST_DIR/t.qcow2
862
Creation options for 'qcow2':
863
-size Virtual disk size
864
-compat Compatibility level (0.10 or 1.1)
865
-backing_file File name of a base image
866
-backing_fmt Image format of the base image
867
-encryption Encrypt the image with format 'aes'. (Deprecated in favor of encrypt.format=aes)
868
-encrypt.format Encrypt the image, format choices: 'aes', 'luks'
869
-encrypt.key-secret ID of secret providing qcow AES key or LUKS passphrase
870
-encrypt.cipher-alg Name of encryption cipher algorithm
871
-encrypt.cipher-mode Name of encryption cipher mode
872
-encrypt.ivgen-alg Name of IV generator algorithm
873
-encrypt.ivgen-hash-alg Name of IV generator hash algorithm
874
-encrypt.hash-alg Name of encryption hash algorithm
875
-encrypt.iter-time Time to spend in PBKDF in milliseconds
876
-cluster_size qcow2 cluster size
877
-preallocation Preallocation mode (allowed values: off, metadata, falloc, full)
878
-lazy_refcounts Postpone refcount updates
879
-refcount_bits Width of a reference count entry in bits
880
+ backing_file=<str> - File name of a base image
881
+ backing_fmt=<str> - Image format of the base image
882
+ cluster_size=<size> - qcow2 cluster size
883
+ compat=<str> - Compatibility level (0.10 or 1.1)
884
+ encrypt.cipher-alg=<str> - Name of encryption cipher algorithm
885
+ encrypt.cipher-mode=<str> - Name of encryption cipher mode
886
+ encrypt.format=<str> - Encrypt the image, format choices: 'aes', 'luks'
887
+ encrypt.hash-alg=<str> - Name of encryption hash algorithm
888
+ encrypt.iter-time=<num> - Time to spend in PBKDF in milliseconds
889
+ encrypt.ivgen-alg=<str> - Name of IV generator algorithm
890
+ encrypt.ivgen-hash-alg=<str> - Name of IV generator hash algorithm
891
+ encrypt.key-secret=<str> - ID of secret providing qcow AES key or LUKS passphrase
892
+ encryption=<bool (on/off)> - Encrypt the image with format 'aes'. (Deprecated in favor of encrypt.format=aes)
893
+ lazy_refcounts=<bool (on/off)> - Postpone refcount updates
894
+ preallocation=<str> - Preallocation mode (allowed values: off, metadata, falloc, full)
895
+ refcount_bits=<num> - Width of a reference count entry in bits
896
+ size=<size> - Virtual disk size
897
898
Note that not all of these options may be amendable.
899
900
Testing: amend -f qcow2 -o ? TEST_DIR/t.qcow2
901
Creation options for 'qcow2':
902
-size Virtual disk size
903
-compat Compatibility level (0.10 or 1.1)
904
-backing_file File name of a base image
905
-backing_fmt Image format of the base image
906
-encryption Encrypt the image with format 'aes'. (Deprecated in favor of encrypt.format=aes)
907
-encrypt.format Encrypt the image, format choices: 'aes', 'luks'
908
-encrypt.key-secret ID of secret providing qcow AES key or LUKS passphrase
909
-encrypt.cipher-alg Name of encryption cipher algorithm
910
-encrypt.cipher-mode Name of encryption cipher mode
911
-encrypt.ivgen-alg Name of IV generator algorithm
912
-encrypt.ivgen-hash-alg Name of IV generator hash algorithm
913
-encrypt.hash-alg Name of encryption hash algorithm
914
-encrypt.iter-time Time to spend in PBKDF in milliseconds
915
-cluster_size qcow2 cluster size
916
-preallocation Preallocation mode (allowed values: off, metadata, falloc, full)
917
-lazy_refcounts Postpone refcount updates
918
-refcount_bits Width of a reference count entry in bits
919
+ backing_file=<str> - File name of a base image
920
+ backing_fmt=<str> - Image format of the base image
921
+ cluster_size=<size> - qcow2 cluster size
922
+ compat=<str> - Compatibility level (0.10 or 1.1)
923
+ encrypt.cipher-alg=<str> - Name of encryption cipher algorithm
924
+ encrypt.cipher-mode=<str> - Name of encryption cipher mode
925
+ encrypt.format=<str> - Encrypt the image, format choices: 'aes', 'luks'
926
+ encrypt.hash-alg=<str> - Name of encryption hash algorithm
927
+ encrypt.iter-time=<num> - Time to spend in PBKDF in milliseconds
928
+ encrypt.ivgen-alg=<str> - Name of IV generator algorithm
929
+ encrypt.ivgen-hash-alg=<str> - Name of IV generator hash algorithm
930
+ encrypt.key-secret=<str> - ID of secret providing qcow AES key or LUKS passphrase
931
+ encryption=<bool (on/off)> - Encrypt the image with format 'aes'. (Deprecated in favor of encrypt.format=aes)
932
+ lazy_refcounts=<bool (on/off)> - Postpone refcount updates
933
+ preallocation=<str> - Preallocation mode (allowed values: off, metadata, falloc, full)
934
+ refcount_bits=<num> - Width of a reference count entry in bits
935
+ size=<size> - Virtual disk size
936
937
Note that not all of these options may be amendable.
938
939
Testing: amend -f qcow2 -o cluster_size=4k,help TEST_DIR/t.qcow2
940
Creation options for 'qcow2':
941
-size Virtual disk size
942
-compat Compatibility level (0.10 or 1.1)
943
-backing_file File name of a base image
944
-backing_fmt Image format of the base image
945
-encryption Encrypt the image with format 'aes'. (Deprecated in favor of encrypt.format=aes)
946
-encrypt.format Encrypt the image, format choices: 'aes', 'luks'
947
-encrypt.key-secret ID of secret providing qcow AES key or LUKS passphrase
948
-encrypt.cipher-alg Name of encryption cipher algorithm
949
-encrypt.cipher-mode Name of encryption cipher mode
950
-encrypt.ivgen-alg Name of IV generator algorithm
951
-encrypt.ivgen-hash-alg Name of IV generator hash algorithm
952
-encrypt.hash-alg Name of encryption hash algorithm
953
-encrypt.iter-time Time to spend in PBKDF in milliseconds
954
-cluster_size qcow2 cluster size
955
-preallocation Preallocation mode (allowed values: off, metadata, falloc, full)
956
-lazy_refcounts Postpone refcount updates
957
-refcount_bits Width of a reference count entry in bits
958
+ backing_file=<str> - File name of a base image
959
+ backing_fmt=<str> - Image format of the base image
960
+ cluster_size=<size> - qcow2 cluster size
961
+ compat=<str> - Compatibility level (0.10 or 1.1)
962
+ encrypt.cipher-alg=<str> - Name of encryption cipher algorithm
963
+ encrypt.cipher-mode=<str> - Name of encryption cipher mode
964
+ encrypt.format=<str> - Encrypt the image, format choices: 'aes', 'luks'
965
+ encrypt.hash-alg=<str> - Name of encryption hash algorithm
966
+ encrypt.iter-time=<num> - Time to spend in PBKDF in milliseconds
967
+ encrypt.ivgen-alg=<str> - Name of IV generator algorithm
968
+ encrypt.ivgen-hash-alg=<str> - Name of IV generator hash algorithm
969
+ encrypt.key-secret=<str> - ID of secret providing qcow AES key or LUKS passphrase
970
+ encryption=<bool (on/off)> - Encrypt the image with format 'aes'. (Deprecated in favor of encrypt.format=aes)
971
+ lazy_refcounts=<bool (on/off)> - Postpone refcount updates
972
+ preallocation=<str> - Preallocation mode (allowed values: off, metadata, falloc, full)
973
+ refcount_bits=<num> - Width of a reference count entry in bits
974
+ size=<size> - Virtual disk size
975
976
Note that not all of these options may be amendable.
977
978
Testing: amend -f qcow2 -o cluster_size=4k,? TEST_DIR/t.qcow2
979
Creation options for 'qcow2':
980
-size Virtual disk size
981
-compat Compatibility level (0.10 or 1.1)
982
-backing_file File name of a base image
983
-backing_fmt Image format of the base image
984
-encryption Encrypt the image with format 'aes'. (Deprecated in favor of encrypt.format=aes)
985
-encrypt.format Encrypt the image, format choices: 'aes', 'luks'
986
-encrypt.key-secret ID of secret providing qcow AES key or LUKS passphrase
987
-encrypt.cipher-alg Name of encryption cipher algorithm
988
-encrypt.cipher-mode Name of encryption cipher mode
989
-encrypt.ivgen-alg Name of IV generator algorithm
990
-encrypt.ivgen-hash-alg Name of IV generator hash algorithm
991
-encrypt.hash-alg Name of encryption hash algorithm
992
-encrypt.iter-time Time to spend in PBKDF in milliseconds
993
-cluster_size qcow2 cluster size
994
-preallocation Preallocation mode (allowed values: off, metadata, falloc, full)
995
-lazy_refcounts Postpone refcount updates
996
-refcount_bits Width of a reference count entry in bits
997
+ backing_file=<str> - File name of a base image
998
+ backing_fmt=<str> - Image format of the base image
999
+ cluster_size=<size> - qcow2 cluster size
1000
+ compat=<str> - Compatibility level (0.10 or 1.1)
1001
+ encrypt.cipher-alg=<str> - Name of encryption cipher algorithm
1002
+ encrypt.cipher-mode=<str> - Name of encryption cipher mode
1003
+ encrypt.format=<str> - Encrypt the image, format choices: 'aes', 'luks'
1004
+ encrypt.hash-alg=<str> - Name of encryption hash algorithm
1005
+ encrypt.iter-time=<num> - Time to spend in PBKDF in milliseconds
1006
+ encrypt.ivgen-alg=<str> - Name of IV generator algorithm
1007
+ encrypt.ivgen-hash-alg=<str> - Name of IV generator hash algorithm
1008
+ encrypt.key-secret=<str> - ID of secret providing qcow AES key or LUKS passphrase
1009
+ encryption=<bool (on/off)> - Encrypt the image with format 'aes'. (Deprecated in favor of encrypt.format=aes)
1010
+ lazy_refcounts=<bool (on/off)> - Postpone refcount updates
1011
+ preallocation=<str> - Preallocation mode (allowed values: off, metadata, falloc, full)
1012
+ refcount_bits=<num> - Width of a reference count entry in bits
1013
+ size=<size> - Virtual disk size
1014
1015
Note that not all of these options may be amendable.
1016
1017
Testing: amend -f qcow2 -o help,cluster_size=4k TEST_DIR/t.qcow2
1018
Creation options for 'qcow2':
1019
-size Virtual disk size
1020
-compat Compatibility level (0.10 or 1.1)
1021
-backing_file File name of a base image
1022
-backing_fmt Image format of the base image
1023
-encryption Encrypt the image with format 'aes'. (Deprecated in favor of encrypt.format=aes)
1024
-encrypt.format Encrypt the image, format choices: 'aes', 'luks'
1025
-encrypt.key-secret ID of secret providing qcow AES key or LUKS passphrase
1026
-encrypt.cipher-alg Name of encryption cipher algorithm
1027
-encrypt.cipher-mode Name of encryption cipher mode
1028
-encrypt.ivgen-alg Name of IV generator algorithm
1029
-encrypt.ivgen-hash-alg Name of IV generator hash algorithm
1030
-encrypt.hash-alg Name of encryption hash algorithm
1031
-encrypt.iter-time Time to spend in PBKDF in milliseconds
1032
-cluster_size qcow2 cluster size
1033
-preallocation Preallocation mode (allowed values: off, metadata, falloc, full)
1034
-lazy_refcounts Postpone refcount updates
1035
-refcount_bits Width of a reference count entry in bits
1036
+ backing_file=<str> - File name of a base image
1037
+ backing_fmt=<str> - Image format of the base image
1038
+ cluster_size=<size> - qcow2 cluster size
1039
+ compat=<str> - Compatibility level (0.10 or 1.1)
1040
+ encrypt.cipher-alg=<str> - Name of encryption cipher algorithm
1041
+ encrypt.cipher-mode=<str> - Name of encryption cipher mode
1042
+ encrypt.format=<str> - Encrypt the image, format choices: 'aes', 'luks'
1043
+ encrypt.hash-alg=<str> - Name of encryption hash algorithm
1044
+ encrypt.iter-time=<num> - Time to spend in PBKDF in milliseconds
1045
+ encrypt.ivgen-alg=<str> - Name of IV generator algorithm
1046
+ encrypt.ivgen-hash-alg=<str> - Name of IV generator hash algorithm
1047
+ encrypt.key-secret=<str> - ID of secret providing qcow AES key or LUKS passphrase
1048
+ encryption=<bool (on/off)> - Encrypt the image with format 'aes'. (Deprecated in favor of encrypt.format=aes)
1049
+ lazy_refcounts=<bool (on/off)> - Postpone refcount updates
1050
+ preallocation=<str> - Preallocation mode (allowed values: off, metadata, falloc, full)
1051
+ refcount_bits=<num> - Width of a reference count entry in bits
1052
+ size=<size> - Virtual disk size
1053
1054
Note that not all of these options may be amendable.
1055
1056
Testing: amend -f qcow2 -o ?,cluster_size=4k TEST_DIR/t.qcow2
1057
Creation options for 'qcow2':
1058
-size Virtual disk size
1059
-compat Compatibility level (0.10 or 1.1)
1060
-backing_file File name of a base image
1061
-backing_fmt Image format of the base image
1062
-encryption Encrypt the image with format 'aes'. (Deprecated in favor of encrypt.format=aes)
1063
-encrypt.format Encrypt the image, format choices: 'aes', 'luks'
1064
-encrypt.key-secret ID of secret providing qcow AES key or LUKS passphrase
1065
-encrypt.cipher-alg Name of encryption cipher algorithm
1066
-encrypt.cipher-mode Name of encryption cipher mode
1067
-encrypt.ivgen-alg Name of IV generator algorithm
1068
-encrypt.ivgen-hash-alg Name of IV generator hash algorithm
1069
-encrypt.hash-alg Name of encryption hash algorithm
1070
-encrypt.iter-time Time to spend in PBKDF in milliseconds
1071
-cluster_size qcow2 cluster size
1072
-preallocation Preallocation mode (allowed values: off, metadata, falloc, full)
1073
-lazy_refcounts Postpone refcount updates
1074
-refcount_bits Width of a reference count entry in bits
1075
+ backing_file=<str> - File name of a base image
1076
+ backing_fmt=<str> - Image format of the base image
1077
+ cluster_size=<size> - qcow2 cluster size
1078
+ compat=<str> - Compatibility level (0.10 or 1.1)
1079
+ encrypt.cipher-alg=<str> - Name of encryption cipher algorithm
1080
+ encrypt.cipher-mode=<str> - Name of encryption cipher mode
1081
+ encrypt.format=<str> - Encrypt the image, format choices: 'aes', 'luks'
1082
+ encrypt.hash-alg=<str> - Name of encryption hash algorithm
1083
+ encrypt.iter-time=<num> - Time to spend in PBKDF in milliseconds
1084
+ encrypt.ivgen-alg=<str> - Name of IV generator algorithm
1085
+ encrypt.ivgen-hash-alg=<str> - Name of IV generator hash algorithm
1086
+ encrypt.key-secret=<str> - ID of secret providing qcow AES key or LUKS passphrase
1087
+ encryption=<bool (on/off)> - Encrypt the image with format 'aes'. (Deprecated in favor of encrypt.format=aes)
1088
+ lazy_refcounts=<bool (on/off)> - Postpone refcount updates
1089
+ preallocation=<str> - Preallocation mode (allowed values: off, metadata, falloc, full)
1090
+ refcount_bits=<num> - Width of a reference count entry in bits
1091
+ size=<size> - Virtual disk size
1092
1093
Note that not all of these options may be amendable.
1094
1095
Testing: amend -f qcow2 -o cluster_size=4k -o help TEST_DIR/t.qcow2
1096
Creation options for 'qcow2':
1097
-size Virtual disk size
1098
-compat Compatibility level (0.10 or 1.1)
1099
-backing_file File name of a base image
1100
-backing_fmt Image format of the base image
1101
-encryption Encrypt the image with format 'aes'. (Deprecated in favor of encrypt.format=aes)
1102
-encrypt.format Encrypt the image, format choices: 'aes', 'luks'
1103
-encrypt.key-secret ID of secret providing qcow AES key or LUKS passphrase
1104
-encrypt.cipher-alg Name of encryption cipher algorithm
1105
-encrypt.cipher-mode Name of encryption cipher mode
1106
-encrypt.ivgen-alg Name of IV generator algorithm
1107
-encrypt.ivgen-hash-alg Name of IV generator hash algorithm
1108
-encrypt.hash-alg Name of encryption hash algorithm
1109
-encrypt.iter-time Time to spend in PBKDF in milliseconds
1110
-cluster_size qcow2 cluster size
1111
-preallocation Preallocation mode (allowed values: off, metadata, falloc, full)
1112
-lazy_refcounts Postpone refcount updates
1113
-refcount_bits Width of a reference count entry in bits
1114
+ backing_file=<str> - File name of a base image
1115
+ backing_fmt=<str> - Image format of the base image
1116
+ cluster_size=<size> - qcow2 cluster size
1117
+ compat=<str> - Compatibility level (0.10 or 1.1)
1118
+ encrypt.cipher-alg=<str> - Name of encryption cipher algorithm
1119
+ encrypt.cipher-mode=<str> - Name of encryption cipher mode
1120
+ encrypt.format=<str> - Encrypt the image, format choices: 'aes', 'luks'
1121
+ encrypt.hash-alg=<str> - Name of encryption hash algorithm
1122
+ encrypt.iter-time=<num> - Time to spend in PBKDF in milliseconds
1123
+ encrypt.ivgen-alg=<str> - Name of IV generator algorithm
1124
+ encrypt.ivgen-hash-alg=<str> - Name of IV generator hash algorithm
1125
+ encrypt.key-secret=<str> - ID of secret providing qcow AES key or LUKS passphrase
1126
+ encryption=<bool (on/off)> - Encrypt the image with format 'aes'. (Deprecated in favor of encrypt.format=aes)
1127
+ lazy_refcounts=<bool (on/off)> - Postpone refcount updates
1128
+ preallocation=<str> - Preallocation mode (allowed values: off, metadata, falloc, full)
1129
+ refcount_bits=<num> - Width of a reference count entry in bits
1130
+ size=<size> - Virtual disk size
1131
1132
Note that not all of these options may be amendable.
1133
1134
Testing: amend -f qcow2 -o cluster_size=4k -o ? TEST_DIR/t.qcow2
1135
Creation options for 'qcow2':
1136
-size Virtual disk size
1137
-compat Compatibility level (0.10 or 1.1)
1138
-backing_file File name of a base image
1139
-backing_fmt Image format of the base image
1140
-encryption Encrypt the image with format 'aes'. (Deprecated in favor of encrypt.format=aes)
1141
-encrypt.format Encrypt the image, format choices: 'aes', 'luks'
1142
-encrypt.key-secret ID of secret providing qcow AES key or LUKS passphrase
1143
-encrypt.cipher-alg Name of encryption cipher algorithm
1144
-encrypt.cipher-mode Name of encryption cipher mode
1145
-encrypt.ivgen-alg Name of IV generator algorithm
1146
-encrypt.ivgen-hash-alg Name of IV generator hash algorithm
1147
-encrypt.hash-alg Name of encryption hash algorithm
1148
-encrypt.iter-time Time to spend in PBKDF in milliseconds
1149
-cluster_size qcow2 cluster size
1150
-preallocation Preallocation mode (allowed values: off, metadata, falloc, full)
1151
-lazy_refcounts Postpone refcount updates
1152
-refcount_bits Width of a reference count entry in bits
1153
+ backing_file=<str> - File name of a base image
1154
+ backing_fmt=<str> - Image format of the base image
1155
+ cluster_size=<size> - qcow2 cluster size
1156
+ compat=<str> - Compatibility level (0.10 or 1.1)
1157
+ encrypt.cipher-alg=<str> - Name of encryption cipher algorithm
1158
+ encrypt.cipher-mode=<str> - Name of encryption cipher mode
1159
+ encrypt.format=<str> - Encrypt the image, format choices: 'aes', 'luks'
1160
+ encrypt.hash-alg=<str> - Name of encryption hash algorithm
1161
+ encrypt.iter-time=<num> - Time to spend in PBKDF in milliseconds
1162
+ encrypt.ivgen-alg=<str> - Name of IV generator algorithm
1163
+ encrypt.ivgen-hash-alg=<str> - Name of IV generator hash algorithm
1164
+ encrypt.key-secret=<str> - ID of secret providing qcow AES key or LUKS passphrase
1165
+ encryption=<bool (on/off)> - Encrypt the image with format 'aes'. (Deprecated in favor of encrypt.format=aes)
1166
+ lazy_refcounts=<bool (on/off)> - Postpone refcount updates
1167
+ preallocation=<str> - Preallocation mode (allowed values: off, metadata, falloc, full)
1168
+ refcount_bits=<num> - Width of a reference count entry in bits
1169
+ size=<size> - Virtual disk size
1170
1171
Note that not all of these options may be amendable.
1172
1173
@@ -XXX,XX +XXX,XX @@ qemu-img: Invalid option list: ,,
1174
1175
Testing: amend -f qcow2 -o help
1176
Creation options for 'qcow2':
1177
-size Virtual disk size
1178
-compat Compatibility level (0.10 or 1.1)
1179
-backing_file File name of a base image
1180
-backing_fmt Image format of the base image
1181
-encryption Encrypt the image with format 'aes'. (Deprecated in favor of encrypt.format=aes)
1182
-encrypt.format Encrypt the image, format choices: 'aes', 'luks'
1183
-encrypt.key-secret ID of secret providing qcow AES key or LUKS passphrase
1184
-encrypt.cipher-alg Name of encryption cipher algorithm
1185
-encrypt.cipher-mode Name of encryption cipher mode
1186
-encrypt.ivgen-alg Name of IV generator algorithm
1187
-encrypt.ivgen-hash-alg Name of IV generator hash algorithm
1188
-encrypt.hash-alg Name of encryption hash algorithm
1189
-encrypt.iter-time Time to spend in PBKDF in milliseconds
1190
-cluster_size qcow2 cluster size
1191
-preallocation Preallocation mode (allowed values: off, metadata, falloc, full)
1192
-lazy_refcounts Postpone refcount updates
1193
-refcount_bits Width of a reference count entry in bits
1194
+ backing_file=<str> - File name of a base image
1195
+ backing_fmt=<str> - Image format of the base image
1196
+ cluster_size=<size> - qcow2 cluster size
1197
+ compat=<str> - Compatibility level (0.10 or 1.1)
1198
+ encrypt.cipher-alg=<str> - Name of encryption cipher algorithm
1199
+ encrypt.cipher-mode=<str> - Name of encryption cipher mode
1200
+ encrypt.format=<str> - Encrypt the image, format choices: 'aes', 'luks'
1201
+ encrypt.hash-alg=<str> - Name of encryption hash algorithm
1202
+ encrypt.iter-time=<num> - Time to spend in PBKDF in milliseconds
1203
+ encrypt.ivgen-alg=<str> - Name of IV generator algorithm
1204
+ encrypt.ivgen-hash-alg=<str> - Name of IV generator hash algorithm
1205
+ encrypt.key-secret=<str> - ID of secret providing qcow AES key or LUKS passphrase
1206
+ encryption=<bool (on/off)> - Encrypt the image with format 'aes'. (Deprecated in favor of encrypt.format=aes)
1207
+ lazy_refcounts=<bool (on/off)> - Postpone refcount updates
1208
+ preallocation=<str> - Preallocation mode (allowed values: off, metadata, falloc, full)
1209
+ refcount_bits=<num> - Width of a reference count entry in bits
1210
+ size=<size> - Virtual disk size
1211
1212
Note that not all of these options may be amendable.
1213
1214
Testing: convert -o help
1215
Supported options:
1216
-size Virtual disk size
1217
+ size=<size> - Virtual disk size
1218
1219
Testing: amend -f bochs -o help
1220
qemu-img: Format driver 'bochs' does not support option amendment
1221
--
97
--
1222
2.19.1
98
2.20.1
1223
99
1224
100
diff view generated by jsdifflib
Deleted patch
1
From: Leonid Bloch <lbloch@janustech.com>
2
1
3
If an expression is used to define DEFAULT_CLUSTER_SIZE, when compiled,
4
it will be embedded as a literal expression in the binary (as the
5
default value) because it is stringified to mark the size of the default
6
value. Now this is fixed by using a defined number to define this value.
7
8
Signed-off-by: Leonid Bloch <lbloch@janustech.com>
9
Reviewed-by: Stefan Weil <sw@weilnetz.de>
10
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
11
---
12
block/vdi.c | 4 ++--
13
1 file changed, 2 insertions(+), 2 deletions(-)
14
15
diff --git a/block/vdi.c b/block/vdi.c
16
index XXXXXXX..XXXXXXX 100644
17
--- a/block/vdi.c
18
+++ b/block/vdi.c
19
@@ -XXX,XX +XXX,XX @@
20
#define BLOCK_OPT_STATIC "static"
21
22
#define SECTOR_SIZE 512
23
-#define DEFAULT_CLUSTER_SIZE (1 * MiB)
24
+#define DEFAULT_CLUSTER_SIZE S_1MiB
25
26
#if defined(CONFIG_VDI_DEBUG)
27
#define VDI_DEBUG 1
28
@@ -XXX,XX +XXX,XX @@ static int vdi_open(BlockDriverState *bs, QDict *options, int flags,
29
goto fail;
30
} else if (header.block_size != DEFAULT_CLUSTER_SIZE) {
31
error_setg(errp, "unsupported VDI image (block size %" PRIu32
32
- " is not %" PRIu64 ")",
33
+ " is not %" PRIu32 ")",
34
header.block_size, DEFAULT_CLUSTER_SIZE);
35
ret = -ENOTSUP;
36
goto fail;
37
--
38
2.19.1
39
40
diff view generated by jsdifflib