1
The following changes since commit f17783e706ab9c7b3a2b69cf48e4f0ba40664f54:
1
The following changes since commit 75ee62ac606bfc9eb59310b9446df3434bf6e8c2:
2
2
3
Merge remote-tracking branch 'remotes/pmaydell/tags/pull-target-arm-20191220' into staging (2020-01-03 18:50:33 +0000)
3
Merge remote-tracking branch 'remotes/ehabkost-gl/tags/x86-next-pull-request' into staging (2020-12-17 18:53:36 +0000)
4
4
5
are available in the Git repository at:
5
are available in the Git repository at:
6
6
7
https://github.com/XanClic/qemu.git tags/pull-block-2020-01-06
7
https://github.com/XanClic/qemu.git tags/pull-block-2020-12-18
8
8
9
for you to fetch changes up to 503ca1262bab2c11c533a4816d1ff4297d4f58a6:
9
for you to fetch changes up to 0e72078128229bf9efb542e396ab44bf91b91340:
10
10
11
backup-top: Begin drain earlier (2020-01-06 14:26:23 +0100)
11
iotests: Fix _send_qemu_cmd with bash 5.1 (2020-12-18 12:47:38 +0100)
12
12
13
----------------------------------------------------------------
13
----------------------------------------------------------------
14
Block patches:
14
Block patches:
15
- Minor fixes and tests from the freeze period (too minor to be included
15
- New block filter: preallocate (which, on writes beyond an image file's
16
in 4.2)
16
end, allocates big chunks of data so that such post-EOF writes will
17
- Allow many bash iotests to test qcow2's external data file feature
17
occur less frequently)
18
- Add compress filter driver
18
- write-zeroes and block-status support for Quorum
19
- Fix Python iotests after 6f6e1698a6
19
- Implementation of truncate for the nvme block driver similarly to the
20
- Fix for the backup job
20
existing implementations for host block devices and iscsi devices
21
- Block layer refactoring: Drop the tighten_restrictions concept in the
22
block permission functions
23
- iotest fixes
21
24
22
----------------------------------------------------------------
25
----------------------------------------------------------------
23
Andrey Shinkevich (3):
26
Alberto Garcia (2):
24
block: introduce compress filter driver
27
quorum: Implement bdrv_co_block_status()
25
qcow2: Allow writing compressed data of multiple clusters
28
quorum: Implement bdrv_co_pwrite_zeroes()
26
tests/qemu-iotests: add case to write compressed data of multiple
27
clusters
28
29
29
Max Reitz (28):
30
Max Reitz (2):
30
block: Add bdrv_qapi_perm_to_blk_perm()
31
iotests/102: Pass $QEMU_HANDLE to _send_qemu_cmd
31
block: Use bdrv_qapi_perm_to_blk_perm()
32
iotests: Fix _send_qemu_cmd with bash 5.1
32
blkdebug: Allow taking/unsharing permissions
33
iotests: Add @error to wait_until_completed
34
iotests: Add test for failing mirror complete
35
iotests: s/qocw2/qcow2/
36
iotests/qcow2.py: Add dump-header-exts
37
iotests/qcow2.py: Split feature fields into bits
38
iotests: Add _filter_json_filename
39
iotests: Filter refcount_order in 036
40
iotests: Replace IMGOPTS by _unsupported_imgopts
41
iotests: Drop compat=1.1 in 050
42
iotests: Let _make_test_img parse its parameters
43
iotests: Add -o and --no-opts to _make_test_img
44
iotests: Inject space into -ocompat=0.10 in 051
45
iotests: Replace IMGOPTS= by -o
46
iotests: Replace IMGOPTS='' by --no-opts
47
iotests: Drop IMGOPTS use in 267
48
iotests: Avoid qemu-img create
49
iotests: Use _rm_test_img for deleting test images
50
iotests: Avoid cp/mv of test images
51
iotests: Make 091 work with data_file
52
iotests: Make 110 work with data_file
53
iotests: Make 137 work with data_file
54
iotests: Make 198 work with data_file
55
iotests: Disable data_file where it cannot be used
56
iotests: Allow check -o data_file
57
backup-top: Begin drain earlier
58
59
PanNengyuan (1):
60
throttle-groups: fix memory leak in throttle_group_set_limit:
61
33
62
Philippe Mathieu-Daudé (1):
34
Philippe Mathieu-Daudé (1):
63
tests/qemu-iotests: Update tests to recent desugarized -accel option
35
block/nvme: Implement fake truncate() coroutine
64
36
65
Vladimir Sementsov-Ogievskiy (1):
37
Vladimir Sementsov-Ogievskiy (25):
66
qcow2-bitmaps: fix qcow2_can_store_new_dirty_bitmap
38
block: add bdrv_refresh_perms() helper
39
block: bdrv_set_perm() drop redundant parameters.
40
block: bdrv_child_set_perm() drop redundant parameters.
41
block: drop tighten_restrictions
42
block: simplify comment to BDRV_REQ_SERIALISING
43
block/io.c: drop assertion on double waiting for request serialisation
44
block/io: split out bdrv_find_conflicting_request
45
block/io: bdrv_wait_serialising_requests_locked: drop extra bs arg
46
block: bdrv_mark_request_serialising: split non-waiting function
47
block: introduce BDRV_REQ_NO_WAIT flag
48
block: bdrv_check_perm(): process children anyway
49
block: introduce preallocate filter
50
qemu-io: add preallocate mode parameter for truncate command
51
iotests: qemu_io_silent: support --image-opts
52
iotests.py: execute_setup_common(): add required_fmts argument
53
iotests: add 298 to test new preallocate filter driver
54
scripts/simplebench: fix grammar: s/successed/succeeded/
55
scripts/simplebench: support iops
56
scripts/simplebench: use standard deviation for +- error
57
simplebench: rename ascii() to results_to_text()
58
simplebench: move results_to_text() into separate file
59
simplebench/results_to_text: improve view of the table
60
simplebench/results_to_text: add difference line to the table
61
simplebench/results_to_text: make executable
62
scripts/simplebench: add bench_prealloc.py
67
63
68
block.c | 47 +++++----
64
docs/system/qemu-block-drivers.rst.inc | 26 ++
69
block/Makefile.objs | 1 +
65
qapi/block-core.json | 20 +-
70
block/backup-top.c | 4 +-
66
include/block/block.h | 20 +-
71
block/blkdebug.c | 93 ++++++++++++++++-
67
include/block/block_int.h | 3 +-
72
block/filter-compress.c | 168 +++++++++++++++++++++++++++++++
68
block.c | 185 +++-----
73
block/qcow2-bitmap.c | 41 ++++----
69
block/file-posix.c | 2 +-
74
block/qcow2.c | 102 ++++++++++++++-----
70
block/io.c | 130 +++---
75
block/throttle-groups.c | 4 +-
71
block/nvme.c | 24 ++
76
include/block/block.h | 1 +
72
block/preallocate.c | 559 +++++++++++++++++++++++++
77
qapi/block-core.json | 24 ++++-
73
block/quorum.c | 88 +++-
78
tests/qemu-iotests/007 | 5 +-
74
qemu-io-cmds.c | 46 +-
79
tests/qemu-iotests/014 | 2 +
75
block/meson.build | 1 +
80
tests/qemu-iotests/015 | 5 +-
76
scripts/simplebench/bench-example.py | 3 +-
81
tests/qemu-iotests/019 | 6 +-
77
scripts/simplebench/bench_prealloc.py | 132 ++++++
82
tests/qemu-iotests/020 | 6 +-
78
scripts/simplebench/bench_write_req.py | 3 +-
83
tests/qemu-iotests/024 | 10 +-
79
scripts/simplebench/results_to_text.py | 126 ++++++
84
tests/qemu-iotests/026 | 5 +-
80
scripts/simplebench/simplebench.py | 66 ++-
85
tests/qemu-iotests/028 | 2 +-
81
tests/qemu-iotests/085.out | 167 ++++++--
86
tests/qemu-iotests/029 | 7 +-
82
tests/qemu-iotests/094.out | 10 +-
87
tests/qemu-iotests/031 | 9 +-
83
tests/qemu-iotests/095.out | 4 +-
88
tests/qemu-iotests/031.out | 36 +++----
84
tests/qemu-iotests/102 | 2 +-
89
tests/qemu-iotests/036 | 15 +--
85
tests/qemu-iotests/102.out | 2 +-
90
tests/qemu-iotests/036.out | 66 ++----------
86
tests/qemu-iotests/109.out | 88 +++-
91
tests/qemu-iotests/039 | 27 ++---
87
tests/qemu-iotests/117.out | 13 +-
92
tests/qemu-iotests/039.out | 22 ++--
88
tests/qemu-iotests/127.out | 12 +-
93
tests/qemu-iotests/041 | 44 ++++++++
89
tests/qemu-iotests/140.out | 10 +-
94
tests/qemu-iotests/041.out | 4 +-
90
tests/qemu-iotests/141.out | 128 ++++--
95
tests/qemu-iotests/043 | 4 +-
91
tests/qemu-iotests/143.out | 4 +-
96
tests/qemu-iotests/046 | 2 +
92
tests/qemu-iotests/144.out | 28 +-
97
tests/qemu-iotests/048 | 4 +-
93
tests/qemu-iotests/153.out | 18 +-
98
tests/qemu-iotests/050 | 8 +-
94
tests/qemu-iotests/156.out | 39 +-
99
tests/qemu-iotests/051 | 7 +-
95
tests/qemu-iotests/161.out | 18 +-
100
tests/qemu-iotests/053 | 4 +-
96
tests/qemu-iotests/173.out | 25 +-
101
tests/qemu-iotests/058 | 7 +-
97
tests/qemu-iotests/182.out | 42 +-
102
tests/qemu-iotests/059 | 20 ++--
98
tests/qemu-iotests/183.out | 19 +-
103
tests/qemu-iotests/060 | 14 +--
99
tests/qemu-iotests/185.out | 45 +-
104
tests/qemu-iotests/060.out | 20 ++--
100
tests/qemu-iotests/191.out | 12 +-
105
tests/qemu-iotests/061 | 63 ++++++------
101
tests/qemu-iotests/223.out | 92 ++--
106
tests/qemu-iotests/061.out | 72 ++++++-------
102
tests/qemu-iotests/229.out | 13 +-
107
tests/qemu-iotests/062 | 5 +-
103
tests/qemu-iotests/249.out | 16 +-
108
tests/qemu-iotests/063 | 18 ++--
104
tests/qemu-iotests/298 | 186 ++++++++
109
tests/qemu-iotests/063.out | 3 +-
105
tests/qemu-iotests/298.out | 5 +
110
tests/qemu-iotests/066 | 7 +-
106
tests/qemu-iotests/308.out | 103 ++++-
111
tests/qemu-iotests/067 | 6 +-
107
tests/qemu-iotests/312 | 159 +++++++
112
tests/qemu-iotests/068 | 6 +-
108
tests/qemu-iotests/312.out | 81 ++++
113
tests/qemu-iotests/069 | 2 +-
109
tests/qemu-iotests/common.qemu | 11 +-
114
tests/qemu-iotests/071 | 7 +-
110
tests/qemu-iotests/group | 2 +
115
tests/qemu-iotests/073 | 4 +
111
tests/qemu-iotests/iotests.py | 16 +-
116
tests/qemu-iotests/074 | 4 +-
112
48 files changed, 2357 insertions(+), 447 deletions(-)
117
tests/qemu-iotests/079 | 3 +-
113
create mode 100644 block/preallocate.c
118
tests/qemu-iotests/080 | 7 +-
114
create mode 100755 scripts/simplebench/bench_prealloc.py
119
tests/qemu-iotests/081 | 6 +-
115
create mode 100755 scripts/simplebench/results_to_text.py
120
tests/qemu-iotests/085 | 18 ++--
116
create mode 100644 tests/qemu-iotests/298
121
tests/qemu-iotests/085.out | 8 +-
117
create mode 100644 tests/qemu-iotests/298.out
122
tests/qemu-iotests/088 | 2 +-
118
create mode 100755 tests/qemu-iotests/312
123
tests/qemu-iotests/090 | 2 +
119
create mode 100644 tests/qemu-iotests/312.out
124
tests/qemu-iotests/091 | 2 +-
125
tests/qemu-iotests/091.out | 2 -
126
tests/qemu-iotests/092 | 2 +-
127
tests/qemu-iotests/094 | 4 +-
128
tests/qemu-iotests/095 | 5 +-
129
tests/qemu-iotests/098 | 6 +-
130
tests/qemu-iotests/099 | 10 +-
131
tests/qemu-iotests/103 | 5 +-
132
tests/qemu-iotests/106 | 2 +-
133
tests/qemu-iotests/108 | 10 +-
134
tests/qemu-iotests/109 | 4 +-
135
tests/qemu-iotests/110 | 11 +-
136
tests/qemu-iotests/110.out | 4 +-
137
tests/qemu-iotests/111 | 3 +-
138
tests/qemu-iotests/112 | 37 +++----
139
tests/qemu-iotests/114 | 2 +
140
tests/qemu-iotests/115 | 3 +-
141
tests/qemu-iotests/121 | 9 +-
142
tests/qemu-iotests/122 | 6 +-
143
tests/qemu-iotests/123 | 4 +-
144
tests/qemu-iotests/125 | 2 +-
145
tests/qemu-iotests/137 | 17 +++-
146
tests/qemu-iotests/137.out | 6 +-
147
tests/qemu-iotests/138 | 8 +-
148
tests/qemu-iotests/141 | 4 +-
149
tests/qemu-iotests/142 | 2 +-
150
tests/qemu-iotests/144 | 4 +-
151
tests/qemu-iotests/153 | 12 +--
152
tests/qemu-iotests/156 | 10 +-
153
tests/qemu-iotests/159 | 2 +-
154
tests/qemu-iotests/160 | 3 +-
155
tests/qemu-iotests/161 | 4 +-
156
tests/qemu-iotests/170 | 2 +-
157
tests/qemu-iotests/172 | 6 +-
158
tests/qemu-iotests/173 | 3 +-
159
tests/qemu-iotests/174 | 2 +-
160
tests/qemu-iotests/175 | 2 +-
161
tests/qemu-iotests/176 | 7 +-
162
tests/qemu-iotests/178 | 6 +-
163
tests/qemu-iotests/182 | 2 +-
164
tests/qemu-iotests/183 | 2 +-
165
tests/qemu-iotests/185 | 4 +-
166
tests/qemu-iotests/187 | 6 +-
167
tests/qemu-iotests/190 | 4 +-
168
tests/qemu-iotests/191 | 11 +-
169
tests/qemu-iotests/195 | 2 +-
170
tests/qemu-iotests/197 | 6 +-
171
tests/qemu-iotests/198 | 6 +-
172
tests/qemu-iotests/198.out | 4 +-
173
tests/qemu-iotests/200 | 7 +-
174
tests/qemu-iotests/201 | 6 +-
175
tests/qemu-iotests/214 | 46 ++++++++-
176
tests/qemu-iotests/214.out | 14 +++
177
tests/qemu-iotests/215 | 6 +-
178
tests/qemu-iotests/217 | 3 +-
179
tests/qemu-iotests/220 | 5 +-
180
tests/qemu-iotests/225 | 2 +-
181
tests/qemu-iotests/229 | 3 +-
182
tests/qemu-iotests/232 | 4 +-
183
tests/qemu-iotests/235 | 2 +-
184
tests/qemu-iotests/243 | 10 +-
185
tests/qemu-iotests/244 | 15 +--
186
tests/qemu-iotests/247 | 4 +-
187
tests/qemu-iotests/249 | 4 +-
188
tests/qemu-iotests/250 | 5 +-
189
tests/qemu-iotests/252 | 2 +-
190
tests/qemu-iotests/261 | 5 +-
191
tests/qemu-iotests/265 | 2 +-
192
tests/qemu-iotests/267 | 17 ++--
193
tests/qemu-iotests/273 | 3 +
194
tests/qemu-iotests/check | 6 +-
195
tests/qemu-iotests/common.filter | 47 ++++++++-
196
tests/qemu-iotests/common.rc | 63 ++++++++++--
197
tests/qemu-iotests/iotests.py | 18 ++--
198
tests/qemu-iotests/qcow2.py | 23 ++++-
199
131 files changed, 1139 insertions(+), 552 deletions(-)
200
create mode 100644 block/filter-compress.c
201
120
202
--
121
--
203
2.24.1
122
2.29.2
204
123
205
124
diff view generated by jsdifflib
1
Sometimes it is useful to be able to add a node to the block graph that
1
From: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
2
takes or unshare a certain set of permissions for debugging purposes.
3
This patch adds this capability to blkdebug.
4
2
5
(Note that you cannot make blkdebug release or share permissions that it
3
Make separate function for common pattern.
6
needs to take or cannot share, because this might result in assertion
7
failures in the block layer. But if the blkdebug node has no parents,
8
it will not take any permissions and share everything by default, so you
9
can then freely choose what permissions to take and share.)
10
4
11
Signed-off-by: Max Reitz <mreitz@redhat.com>
5
Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
12
Message-id: 20191108123455.39445-4-mreitz@redhat.com
6
Message-Id: <20201106124241.16950-5-vsementsov@virtuozzo.com>
13
Reviewed-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
7
[mreitz: Squashed in
8
https://lists.nongnu.org/archive/html/qemu-block/2020-11/msg00299.html]
14
Signed-off-by: Max Reitz <mreitz@redhat.com>
9
Signed-off-by: Max Reitz <mreitz@redhat.com>
15
---
10
---
16
block/blkdebug.c | 93 +++++++++++++++++++++++++++++++++++++++++++-
11
block.c | 61 +++++++++++++++++++++++++++++----------------------------
17
qapi/block-core.json | 14 ++++++-
12
1 file changed, 31 insertions(+), 30 deletions(-)
18
2 files changed, 105 insertions(+), 2 deletions(-)
19
13
20
diff --git a/block/blkdebug.c b/block/blkdebug.c
14
diff --git a/block.c b/block.c
21
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
22
--- a/block/blkdebug.c
16
--- a/block.c
23
+++ b/block/blkdebug.c
17
+++ b/block.c
24
@@ -XXX,XX +XXX,XX @@
18
@@ -XXX,XX +XXX,XX @@ static void bdrv_child_abort_perm_update(BdrvChild *c)
25
#include "qemu/cutils.h"
19
bdrv_abort_perm_update(c->bs);
26
#include "qemu/config-file.h"
27
#include "block/block_int.h"
28
+#include "block/qdict.h"
29
#include "qemu/module.h"
30
#include "qemu/option.h"
31
+#include "qapi/qapi-visit-block-core.h"
32
#include "qapi/qmp/qdict.h"
33
+#include "qapi/qmp/qlist.h"
34
#include "qapi/qmp/qstring.h"
35
+#include "qapi/qobject-input-visitor.h"
36
#include "sysemu/qtest.h"
37
38
typedef struct BDRVBlkdebugState {
39
@@ -XXX,XX +XXX,XX @@ typedef struct BDRVBlkdebugState {
40
uint64_t opt_discard;
41
uint64_t max_discard;
42
43
+ uint64_t take_child_perms;
44
+ uint64_t unshare_child_perms;
45
+
46
/* For blkdebug_refresh_filename() */
47
char *config_file;
48
49
@@ -XXX,XX +XXX,XX @@ static void blkdebug_parse_filename(const char *filename, QDict *options,
50
qdict_put_str(options, "x-image", filename);
51
}
20
}
52
21
53
+static int blkdebug_parse_perm_list(uint64_t *dest, QDict *options,
22
+static int bdrv_refresh_perms(BlockDriverState *bs, bool *tighten_restrictions,
54
+ const char *prefix, Error **errp)
23
+ Error **errp)
55
+{
56
+ int ret = 0;
57
+ QDict *subqdict = NULL;
58
+ QObject *crumpled_subqdict = NULL;
59
+ Visitor *v = NULL;
60
+ BlockPermissionList *perm_list = NULL, *element;
61
+ Error *local_err = NULL;
62
+
63
+ *dest = 0;
64
+
65
+ qdict_extract_subqdict(options, &subqdict, prefix);
66
+ if (!qdict_size(subqdict)) {
67
+ goto out;
68
+ }
69
+
70
+ crumpled_subqdict = qdict_crumple(subqdict, errp);
71
+ if (!crumpled_subqdict) {
72
+ ret = -EINVAL;
73
+ goto out;
74
+ }
75
+
76
+ v = qobject_input_visitor_new(crumpled_subqdict);
77
+ visit_type_BlockPermissionList(v, NULL, &perm_list, &local_err);
78
+ if (local_err) {
79
+ error_propagate(errp, local_err);
80
+ ret = -EINVAL;
81
+ goto out;
82
+ }
83
+
84
+ for (element = perm_list; element; element = element->next) {
85
+ *dest |= bdrv_qapi_perm_to_blk_perm(element->value);
86
+ }
87
+
88
+out:
89
+ qapi_free_BlockPermissionList(perm_list);
90
+ visit_free(v);
91
+ qobject_unref(subqdict);
92
+ qobject_unref(crumpled_subqdict);
93
+ return ret;
94
+}
95
+
96
+static int blkdebug_parse_perms(BDRVBlkdebugState *s, QDict *options,
97
+ Error **errp)
98
+{
24
+{
99
+ int ret;
25
+ int ret;
26
+ uint64_t perm, shared_perm;
100
+
27
+
101
+ ret = blkdebug_parse_perm_list(&s->take_child_perms, options,
28
+ bdrv_get_cumulative_perm(bs, &perm, &shared_perm);
102
+ "take-child-perms.", errp);
29
+ ret = bdrv_check_perm(bs, NULL, perm, shared_perm, NULL,
30
+ tighten_restrictions, errp);
103
+ if (ret < 0) {
31
+ if (ret < 0) {
32
+ bdrv_abort_perm_update(bs);
104
+ return ret;
33
+ return ret;
105
+ }
34
+ }
106
+
35
+ bdrv_set_perm(bs, perm, shared_perm);
107
+ ret = blkdebug_parse_perm_list(&s->unshare_child_perms, options,
108
+ "unshare-child-perms.", errp);
109
+ if (ret < 0) {
110
+ return ret;
111
+ }
112
+
36
+
113
+ return 0;
37
+ return 0;
114
+}
38
+}
115
+
39
+
116
static QemuOptsList runtime_opts = {
40
int bdrv_child_try_set_perm(BdrvChild *c, uint64_t perm, uint64_t shared,
117
.name = "blkdebug",
41
Error **errp)
118
.head = QTAILQ_HEAD_INITIALIZER(runtime_opts.head),
42
{
119
@@ -XXX,XX +XXX,XX @@ static int blkdebug_open(BlockDriverState *bs, QDict *options, int flags,
43
@@ -XXX,XX +XXX,XX @@ static void bdrv_replace_child(BdrvChild *child, BlockDriverState *new_bs)
120
/* Set initial state */
44
}
121
s->state = 1;
45
122
46
if (old_bs) {
123
+ /* Parse permissions modifiers before opening the image file */
47
- /* Update permissions for old node. This is guaranteed to succeed
124
+ ret = blkdebug_parse_perms(s, options, errp);
48
- * because we're just taking a parent away, so we're loosening
125
+ if (ret < 0) {
49
- * restrictions. */
126
+ goto out;
50
bool tighten_restrictions;
127
+ }
51
- int ret;
128
+
52
129
/* Open the image file */
53
- bdrv_get_cumulative_perm(old_bs, &perm, &shared_perm);
130
bs->file = bdrv_open_child(qemu_opt_get(opts, "x-image"), options, "image",
54
- ret = bdrv_check_perm(old_bs, NULL, perm, shared_perm, NULL,
131
bs, &child_file, false, &local_err);
55
- &tighten_restrictions, NULL);
132
@@ -XXX,XX +XXX,XX @@ static int blkdebug_reopen_prepare(BDRVReopenState *reopen_state,
56
+ /*
133
return 0;
57
+ * Update permissions for old node. We're just taking a parent away, so
134
}
58
+ * we're loosening restrictions. Errors of permission update are not
135
59
+ * fatal in this case, ignore them.
136
+static void blkdebug_child_perm(BlockDriverState *bs, BdrvChild *c,
60
+ */
137
+ const BdrvChildRole *role,
61
+ bdrv_refresh_perms(old_bs, &tighten_restrictions, NULL);
138
+ BlockReopenQueue *reopen_queue,
62
assert(tighten_restrictions == false);
139
+ uint64_t perm, uint64_t shared,
63
- if (ret < 0) {
140
+ uint64_t *nperm, uint64_t *nshared)
64
- /* We only tried to loosen restrictions, so errors are not fatal */
141
+{
65
- bdrv_abort_perm_update(old_bs);
142
+ BDRVBlkdebugState *s = bs->opaque;
66
- } else {
143
+
67
- bdrv_set_perm(old_bs, perm, shared_perm);
144
+ bdrv_filter_default_perms(bs, c, role, reopen_queue, perm, shared,
68
- }
145
+ nperm, nshared);
69
146
+
70
/* When the parent requiring a non-default AioContext is removed, the
147
+ *nperm |= s->take_child_perms;
71
* node moves back to the main AioContext */
148
+ *nshared &= ~s->unshare_child_perms;
72
@@ -XXX,XX +XXX,XX @@ void bdrv_init_with_whitelist(void)
149
+}
73
int coroutine_fn bdrv_co_invalidate_cache(BlockDriverState *bs, Error **errp)
150
+
74
{
151
static const char *const blkdebug_strong_runtime_opts[] = {
75
BdrvChild *child, *parent;
152
"config",
76
- uint64_t perm, shared_perm;
153
"inject-error.",
77
Error *local_err = NULL;
154
@@ -XXX,XX +XXX,XX @@ static BlockDriver bdrv_blkdebug = {
78
int ret;
155
.bdrv_file_open = blkdebug_open,
79
BdrvDirtyBitmap *bm;
156
.bdrv_close = blkdebug_close,
80
@@ -XXX,XX +XXX,XX @@ int coroutine_fn bdrv_co_invalidate_cache(BlockDriverState *bs, Error **errp)
157
.bdrv_reopen_prepare = blkdebug_reopen_prepare,
81
*/
158
- .bdrv_child_perm = bdrv_filter_default_perms,
82
if (bs->open_flags & BDRV_O_INACTIVE) {
159
+ .bdrv_child_perm = blkdebug_child_perm,
83
bs->open_flags &= ~BDRV_O_INACTIVE;
160
84
- bdrv_get_cumulative_perm(bs, &perm, &shared_perm);
161
.bdrv_getlength = blkdebug_getlength,
85
- ret = bdrv_check_perm(bs, NULL, perm, shared_perm, NULL, NULL, errp);
162
.bdrv_refresh_filename = blkdebug_refresh_filename,
86
+ ret = bdrv_refresh_perms(bs, NULL, errp);
163
diff --git a/qapi/block-core.json b/qapi/block-core.json
87
if (ret < 0) {
164
index XXXXXXX..XXXXXXX 100644
88
- bdrv_abort_perm_update(bs);
165
--- a/qapi/block-core.json
89
bs->open_flags |= BDRV_O_INACTIVE;
166
+++ b/qapi/block-core.json
90
return ret;
167
@@ -XXX,XX +XXX,XX @@
91
}
168
#
92
- bdrv_set_perm(bs, perm, shared_perm);
169
# @set-state: array of state-change descriptions
93
170
#
94
if (bs->drv->bdrv_co_invalidate_cache) {
171
+# @take-child-perms: Permissions to take on @image in addition to what
95
bs->drv->bdrv_co_invalidate_cache(bs, &local_err);
172
+# is necessary anyway (which depends on how the
96
@@ -XXX,XX +XXX,XX @@ static int bdrv_inactivate_recurse(BlockDriverState *bs)
173
+# blkdebug node is used). Defaults to none.
97
{
174
+# (since 5.0)
98
BdrvChild *child, *parent;
175
+#
99
bool tighten_restrictions;
176
+# @unshare-child-perms: Permissions not to share on @image in addition
100
- uint64_t perm, shared_perm;
177
+# to what cannot be shared anyway (which depends
101
int ret;
178
+# on how the blkdebug node is used). Defaults
102
179
+# to none. (since 5.0)
103
if (!bs->drv) {
180
+#
104
@@ -XXX,XX +XXX,XX @@ static int bdrv_inactivate_recurse(BlockDriverState *bs)
181
# Since: 2.9
105
182
##
106
bs->open_flags |= BDRV_O_INACTIVE;
183
{ 'struct': 'BlockdevOptionsBlkdebug',
107
184
@@ -XXX,XX +XXX,XX @@
108
- /* Update permissions, they may differ for inactive nodes */
185
'*opt-write-zero': 'int32', '*max-write-zero': 'int32',
109
- bdrv_get_cumulative_perm(bs, &perm, &shared_perm);
186
'*opt-discard': 'int32', '*max-discard': 'int32',
110
- ret = bdrv_check_perm(bs, NULL, perm, shared_perm, NULL,
187
'*inject-error': ['BlkdebugInjectErrorOptions'],
111
- &tighten_restrictions, NULL);
188
- '*set-state': ['BlkdebugSetStateOptions'] } }
112
+ /*
189
+ '*set-state': ['BlkdebugSetStateOptions'],
113
+ * Update permissions, they may differ for inactive nodes.
190
+ '*take-child-perms': ['BlockPermission'],
114
+ * We only tried to loosen restrictions, so errors are not fatal, ignore
191
+ '*unshare-child-perms': ['BlockPermission'] } }
115
+ * them.
192
116
+ */
193
##
117
+ bdrv_refresh_perms(bs, &tighten_restrictions, NULL);
194
# @BlockdevOptionsBlklogwrites:
118
assert(tighten_restrictions == false);
119
- if (ret < 0) {
120
- /* We only tried to loosen restrictions, so errors are not fatal */
121
- bdrv_abort_perm_update(bs);
122
- } else {
123
- bdrv_set_perm(bs, perm, shared_perm);
124
- }
125
-
126
127
/* Recursively inactivate children */
128
QLIST_FOREACH(child, &bs->children, next) {
195
--
129
--
196
2.24.1
130
2.29.2
197
131
198
132
diff view generated by jsdifflib
1
Overwriting IMGOPTS means ignoring all user-supplied options, which is
1
From: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
2
not what we want. Replace the current IMGOPTS use by a new BACKING_FILE
3
variable.
4
2
5
Signed-off-by: Max Reitz <mreitz@redhat.com>
3
We should never set permissions other than cumulative permissions of
6
Reviewed-by: Maxim Levitsky <mlevitsk@redhat.com>
4
parents. During bdrv_reopen_multiple() we _check_ for synthetic
7
Message-id: 20191107163708.833192-14-mreitz@redhat.com
5
permissions but when we do _set_ the graph is already updated.
6
Add an assertion to bdrv_reopen_multiple(), other cases are more
7
obvious.
8
9
Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
10
Message-Id: <20201106124241.16950-6-vsementsov@virtuozzo.com>
11
Reviewed-by: Max Reitz <mreitz@redhat.com>
8
Signed-off-by: Max Reitz <mreitz@redhat.com>
12
Signed-off-by: Max Reitz <mreitz@redhat.com>
9
---
13
---
10
tests/qemu-iotests/267 | 12 ++++++++----
14
block.c | 29 +++++++++++++++--------------
11
1 file changed, 8 insertions(+), 4 deletions(-)
15
1 file changed, 15 insertions(+), 14 deletions(-)
12
16
13
diff --git a/tests/qemu-iotests/267 b/tests/qemu-iotests/267
17
diff --git a/block.c b/block.c
14
index XXXXXXX..XXXXXXX 100755
18
index XXXXXXX..XXXXXXX 100644
15
--- a/tests/qemu-iotests/267
19
--- a/block.c
16
+++ b/tests/qemu-iotests/267
20
+++ b/block.c
17
@@ -XXX,XX +XXX,XX @@ size=128M
21
@@ -XXX,XX +XXX,XX @@ static void bdrv_abort_perm_update(BlockDriverState *bs)
18
22
}
19
run_test()
23
}
24
25
-static void bdrv_set_perm(BlockDriverState *bs, uint64_t cumulative_perms,
26
- uint64_t cumulative_shared_perms)
27
+static void bdrv_set_perm(BlockDriverState *bs)
20
{
28
{
21
- _make_test_img $size
29
+ uint64_t cumulative_perms, cumulative_shared_perms;
22
+ if [ -n "$BACKING_FILE" ]; then
30
BlockDriver *drv = bs->drv;
23
+ _make_test_img -b "$BACKING_FILE" $size
31
BdrvChild *c;
24
+ else
32
25
+ _make_test_img $size
33
@@ -XXX,XX +XXX,XX @@ static void bdrv_set_perm(BlockDriverState *bs, uint64_t cumulative_perms,
26
+ fi
34
return;
27
printf "savevm snap0\ninfo snapshots\nloadvm snap0\n" | run_qemu "$@" | _filter_date
35
}
36
37
+ bdrv_get_cumulative_perm(bs, &cumulative_perms, &cumulative_shared_perms);
38
+
39
/* Update this node */
40
if (drv->bdrv_set_perm) {
41
drv->bdrv_set_perm(bs, cumulative_perms, cumulative_shared_perms);
42
@@ -XXX,XX +XXX,XX @@ static int bdrv_child_check_perm(BdrvChild *c, BlockReopenQueue *q,
43
44
static void bdrv_child_set_perm(BdrvChild *c, uint64_t perm, uint64_t shared)
45
{
46
- uint64_t cumulative_perms, cumulative_shared_perms;
47
-
48
c->has_backup_perm = false;
49
50
c->perm = perm;
51
c->shared_perm = shared;
52
53
- bdrv_get_cumulative_perm(c->bs, &cumulative_perms,
54
- &cumulative_shared_perms);
55
- bdrv_set_perm(c->bs, cumulative_perms, cumulative_shared_perms);
56
+ bdrv_set_perm(c->bs);
28
}
57
}
29
58
30
@@ -XXX,XX +XXX,XX @@ echo
59
static void bdrv_child_abort_perm_update(BdrvChild *c)
31
60
@@ -XXX,XX +XXX,XX @@ static int bdrv_refresh_perms(BlockDriverState *bs, bool *tighten_restrictions,
32
TEST_IMG="$TEST_IMG.base" _make_test_img $size
61
bdrv_abort_perm_update(bs);
33
62
return ret;
34
-IMGOPTS="backing_file=$TEST_IMG.base" \
63
}
35
+BACKING_FILE="$TEST_IMG.base" \
64
- bdrv_set_perm(bs, perm, shared_perm);
36
run_test -blockdev driver=file,filename="$TEST_IMG.base",node-name=backing-file \
65
+ bdrv_set_perm(bs);
37
-blockdev driver=file,filename="$TEST_IMG",node-name=file \
66
38
-blockdev driver=$IMGFMT,file=file,backing=backing-file,node-name=fmt
67
return 0;
39
68
}
40
-IMGOPTS="backing_file=$TEST_IMG.base" \
69
@@ -XXX,XX +XXX,XX @@ static void bdrv_replace_child_noperm(BdrvChild *child,
41
+BACKING_FILE="$TEST_IMG.base" \
70
static void bdrv_replace_child(BdrvChild *child, BlockDriverState *new_bs)
42
run_test -blockdev driver=file,filename="$TEST_IMG.base",node-name=backing-file \
71
{
43
-blockdev driver=$IMGFMT,file=backing-file,node-name=backing-fmt \
72
BlockDriverState *old_bs = child->bs;
44
-blockdev driver=file,filename="$TEST_IMG",node-name=file \
73
- uint64_t perm, shared_perm;
45
@@ -XXX,XX +XXX,XX @@ echo
74
46
echo "=== -blockdev with NBD server on the backing file ==="
75
/* Asserts that child->frozen == false */
47
echo
76
bdrv_replace_child_noperm(child, new_bs);
48
77
@@ -XXX,XX +XXX,XX @@ static void bdrv_replace_child(BdrvChild *child, BlockDriverState *new_bs)
49
-IMGOPTS="backing_file=$TEST_IMG.base" _make_test_img $size
78
* restrictions.
50
+_make_test_img -b "$TEST_IMG.base" $size
79
*/
51
cat <<EOF |
80
if (new_bs) {
52
nbd_server_start unix:$SOCK_DIR/nbd
81
- bdrv_get_cumulative_perm(new_bs, &perm, &shared_perm);
53
nbd_server_add -w backing-fmt
82
- bdrv_set_perm(new_bs, perm, shared_perm);
83
+ bdrv_set_perm(new_bs);
84
}
85
86
if (old_bs) {
87
@@ -XXX,XX +XXX,XX @@ cleanup_perm:
88
}
89
90
if (ret == 0) {
91
- bdrv_set_perm(state->bs, state->perm, state->shared_perm);
92
+ uint64_t perm, shared;
93
+
94
+ bdrv_get_cumulative_perm(state->bs, &perm, &shared);
95
+ assert(perm == state->perm);
96
+ assert(shared == state->shared_perm);
97
+
98
+ bdrv_set_perm(state->bs);
99
} else {
100
bdrv_abort_perm_update(state->bs);
101
if (state->replace_backing_bs && state->new_backing_bs) {
102
@@ -XXX,XX +XXX,XX @@ static void bdrv_replace_node_common(BlockDriverState *from,
103
bdrv_unref(from);
104
}
105
106
- bdrv_get_cumulative_perm(to, &perm, &shared);
107
- bdrv_set_perm(to, perm, shared);
108
+ bdrv_set_perm(to);
109
110
out:
111
g_slist_free(list);
54
--
112
--
55
2.24.1
113
2.29.2
56
114
57
115
diff view generated by jsdifflib
1
The problem with allowing the data_file option is that you want to use a
1
From: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
2
different data file per image used in the test. Therefore, we need to
3
allow patterns like -o data_file='$TEST_IMG.data_file'.
4
2
5
Then, we need to filter it out from qemu-img map, qemu-img create, and
3
We must set the permission used for _check_. Assert that we have
6
remove the data file in _rm_test_img.
4
backup and drop extra arguments.
7
5
8
Signed-off-by: Max Reitz <mreitz@redhat.com>
6
Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
9
Reviewed-by: Maxim Levitsky <mlevitsk@redhat.com>
7
Message-Id: <20201106124241.16950-7-vsementsov@virtuozzo.com>
10
Message-id: 20191107163708.833192-23-mreitz@redhat.com
8
Reviewed-by: Max Reitz <mreitz@redhat.com>
11
Signed-off-by: Max Reitz <mreitz@redhat.com>
9
Signed-off-by: Max Reitz <mreitz@redhat.com>
12
---
10
---
13
tests/qemu-iotests/common.filter | 23 +++++++++++++++++++++--
11
block.c | 15 ++++-----------
14
tests/qemu-iotests/common.rc | 22 +++++++++++++++++++++-
12
1 file changed, 4 insertions(+), 11 deletions(-)
15
2 files changed, 42 insertions(+), 3 deletions(-)
16
13
17
diff --git a/tests/qemu-iotests/common.filter b/tests/qemu-iotests/common.filter
14
diff --git a/block.c b/block.c
18
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
19
--- a/tests/qemu-iotests/common.filter
16
--- a/block.c
20
+++ b/tests/qemu-iotests/common.filter
17
+++ b/block.c
21
@@ -XXX,XX +XXX,XX @@ _filter_actual_image_size()
18
@@ -XXX,XX +XXX,XX @@ static int bdrv_child_check_perm(BdrvChild *c, BlockReopenQueue *q,
22
# replace driver-specific options in the "Formatting..." line
19
GSList *ignore_children,
23
_filter_img_create()
20
bool *tighten_restrictions, Error **errp);
21
static void bdrv_child_abort_perm_update(BdrvChild *c);
22
-static void bdrv_child_set_perm(BdrvChild *c, uint64_t perm, uint64_t shared);
23
+static void bdrv_child_set_perm(BdrvChild *c);
24
25
typedef struct BlockReopenQueueEntry {
26
bool prepared;
27
@@ -XXX,XX +XXX,XX @@ static void bdrv_set_perm(BlockDriverState *bs)
28
29
/* Update all children */
30
QLIST_FOREACH(c, &bs->children, next) {
31
- uint64_t cur_perm, cur_shared;
32
- bdrv_child_perm(bs, c->bs, c, c->role, NULL,
33
- cumulative_perms, cumulative_shared_perms,
34
- &cur_perm, &cur_shared);
35
- bdrv_child_set_perm(c, cur_perm, cur_shared);
36
+ bdrv_child_set_perm(c);
37
}
38
}
39
40
@@ -XXX,XX +XXX,XX @@ static int bdrv_child_check_perm(BdrvChild *c, BlockReopenQueue *q,
41
return 0;
42
}
43
44
-static void bdrv_child_set_perm(BdrvChild *c, uint64_t perm, uint64_t shared)
45
+static void bdrv_child_set_perm(BdrvChild *c)
24
{
46
{
25
- $SED -e "s#$REMOTE_TEST_DIR#TEST_DIR#g" \
47
c->has_backup_perm = false;
26
+ data_file_filter=()
48
27
+ if data_file=$(_get_data_file "$TEST_IMG"); then
49
- c->perm = perm;
28
+ data_file_filter=(-e "s# data_file=$data_file##")
50
- c->shared_perm = shared;
29
+ fi
51
-
30
+
52
bdrv_set_perm(c->bs);
31
+ $SED "${data_file_filter[@]}" \
32
+ -e "s#$REMOTE_TEST_DIR#TEST_DIR#g" \
33
-e "s#$IMGPROTO:$TEST_DIR#TEST_DIR#g" \
34
-e "s#$TEST_DIR#TEST_DIR#g" \
35
-e "s#$SOCK_DIR#SOCK_DIR#g" \
36
@@ -XXX,XX +XXX,XX @@ _filter_img_info()
37
# human and json output
38
_filter_qemu_img_map()
39
{
40
+ # Assuming the data_file value in $IMGOPTS contains a '$TEST_IMG',
41
+ # create a filter that replaces the data file name by $TEST_IMG.
42
+ # Example:
43
+ # In $IMGOPTS: 'data_file=$TEST_IMG.data_file'
44
+ # Then data_file_pattern == '\(.*\).data_file'
45
+ # And data_file_filter == -e 's#\(.*\).data_file#\1#
46
+ data_file_filter=()
47
+ if data_file_pattern=$(_get_data_file '\\(.*\\)'); then
48
+ data_file_filter=(-e "s#$data_file_pattern#\\1#")
49
+ fi
50
+
51
$SED -e 's/\([0-9a-fx]* *[0-9a-fx]* *\)[0-9a-fx]* */\1/g' \
52
-e 's/"offset": [0-9]\+/"offset": OFFSET/g' \
53
- -e 's/Mapped to *//' | _filter_testdir | _filter_imgfmt
54
+ -e 's/Mapped to *//' \
55
+ "${data_file_filter[@]}" \
56
+ | _filter_testdir | _filter_imgfmt
57
}
53
}
58
54
59
_filter_nbd()
55
@@ -XXX,XX +XXX,XX @@ int bdrv_child_try_set_perm(BdrvChild *c, uint64_t perm, uint64_t shared,
60
diff --git a/tests/qemu-iotests/common.rc b/tests/qemu-iotests/common.rc
56
return ret;
61
index XXXXXXX..XXXXXXX 100644
57
}
62
--- a/tests/qemu-iotests/common.rc
58
63
+++ b/tests/qemu-iotests/common.rc
59
- bdrv_child_set_perm(c, perm, shared);
64
@@ -XXX,XX +XXX,XX @@ _stop_nbd_server()
60
+ bdrv_child_set_perm(c);
65
fi
61
66
}
62
return 0;
67
68
+# Gets the data_file value from IMGOPTS and replaces the '$TEST_IMG'
69
+# pattern by '$1'
70
+# Caution: The replacement is done with sed, so $1 must be escaped
71
+# properly. (The delimiter is '#'.)
72
+_get_data_file()
73
+{
74
+ if ! echo "$IMGOPTS" | grep -q 'data_file='; then
75
+ return 1
76
+ fi
77
+
78
+ echo "$IMGOPTS" | sed -e 's/.*data_file=\([^,]*\).*/\1/' \
79
+ | sed -e "s#\\\$TEST_IMG#$1#"
80
+}
81
+
82
_make_test_img()
83
{
84
# extra qemu-img options can be added by tests
85
@@ -XXX,XX +XXX,XX @@ _make_test_img()
86
fi
87
88
if [ -n "$IMGOPTS" ]; then
89
- optstr=$(_optstr_add "$optstr" "$IMGOPTS")
90
+ imgopts_expanded=$(echo "$IMGOPTS" | sed -e "s#\\\$TEST_IMG#$img_name#")
91
+ optstr=$(_optstr_add "$optstr" "$imgopts_expanded")
92
fi
93
if [ -n "$IMGKEYSECRET" ]; then
94
object_options="--object secret,id=keysec0,data=$IMGKEYSECRET"
95
@@ -XXX,XX +XXX,XX @@ _rm_test_img()
96
# Remove all the extents for vmdk
97
"$QEMU_IMG" info "$img" 2>/dev/null | grep 'filename:' | cut -f 2 -d: \
98
| xargs -I {} rm -f "{}"
99
+ elif [ "$IMGFMT" = "qcow2" ]; then
100
+ # Remove external data file
101
+ if data_file=$(_get_data_file "$img"); then
102
+ rm -f "$data_file"
103
+ fi
104
fi
105
rm -f "$img"
106
}
63
}
107
--
64
--
108
2.24.1
65
2.29.2
109
66
110
67
diff view generated by jsdifflib
1
We need some way to correlate QAPI BlockPermission values with
1
From: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
2
BLK_PERM_* flags. We could:
2
3
3
The only users of this thing are:
4
(1) have the same order in the QAPI definition as the the BLK_PERM_*
4
1. bdrv_child_try_set_perm, to ignore failures on loosen restrictions
5
flags are in LSb-first order. However, then there is no guarantee
5
2. assertion in bdrv_replace_child
6
that they actually match (e.g. when someone modifies the QAPI schema
6
3. assertion in bdrv_inactivate_recurse
7
without thinking of the BLK_PERM_* definitions).
7
8
We could add static assertions, but these would break what’s good
8
Assertions are not enough reason for overcomplication the permission
9
about this solution, namely its simplicity.
9
update system. So, look at bdrv_child_try_set_perm.
10
10
11
(2) define the BLK_PERM_* flags based on the BlockPermission values.
11
We are interested in tighten_restrictions only on failure. But on
12
But this way whenever someone were to modify the QAPI order
12
failure this field is not reliable: we may fail in the middle of
13
(perfectly sensible in theory), the BLK_PERM_* values would change.
13
permission update, some nodes are not touched and we don't know should
14
Because these values are used for file locking, this might break
14
their permissions be tighten or not. So, we rely on the fact that if we
15
file locking between different qemu versions.
15
loose restrictions on some node (or BdrvChild), we'll not tighten
16
16
restriction in the whole subtree as part of this update (assertions 2
17
Therefore, go the slightly more cumbersome way: Add a function to
17
and 3 rely on this fact as well). And, if we rely on this fact anyway,
18
translate from the QAPI constants to the BLK_PERM_* flags.
18
we can just check it on top, and don't pass additional pointer through
19
19
the whole recursive infrastructure.
20
Signed-off-by: Max Reitz <mreitz@redhat.com>
20
21
Message-id: 20191108123455.39445-2-mreitz@redhat.com
21
Note also, that further patches will fix real bugs in permission update
22
Reviewed-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
22
system, so now is good time to simplify it, as a help for further
23
refactorings.
24
25
Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
26
Message-Id: <20201106124241.16950-8-vsementsov@virtuozzo.com>
27
[mreitz: Fixed rebase conflict]
23
Signed-off-by: Max Reitz <mreitz@redhat.com>
28
Signed-off-by: Max Reitz <mreitz@redhat.com>
24
---
29
---
25
block.c | 18 ++++++++++++++++++
30
block.c | 89 +++++++++++----------------------------------------------
26
include/block/block.h | 1 +
31
1 file changed, 17 insertions(+), 72 deletions(-)
27
2 files changed, 19 insertions(+)
28
32
29
diff --git a/block.c b/block.c
33
diff --git a/block.c b/block.c
30
index XXXXXXX..XXXXXXX 100644
34
index XXXXXXX..XXXXXXX 100644
31
--- a/block.c
35
--- a/block.c
32
+++ b/block.c
36
+++ b/block.c
33
@@ -XXX,XX +XXX,XX @@ void bdrv_format_default_perms(BlockDriverState *bs, BdrvChild *c,
37
@@ -XXX,XX +XXX,XX @@ static int bdrv_fill_options(QDict **options, const char *filename,
34
*nshared = shared;
38
39
static int bdrv_child_check_perm(BdrvChild *c, BlockReopenQueue *q,
40
uint64_t perm, uint64_t shared,
41
- GSList *ignore_children,
42
- bool *tighten_restrictions, Error **errp);
43
+ GSList *ignore_children, Error **errp);
44
static void bdrv_child_abort_perm_update(BdrvChild *c);
45
static void bdrv_child_set_perm(BdrvChild *c);
46
47
@@ -XXX,XX +XXX,XX @@ static void bdrv_child_perm(BlockDriverState *bs, BlockDriverState *child_bs,
48
* permissions of all its parents. This involves checking whether all necessary
49
* permission changes to child nodes can be performed.
50
*
51
- * Will set *tighten_restrictions to true if and only if new permissions have to
52
- * be taken or currently shared permissions are to be unshared. Otherwise,
53
- * errors are not fatal as long as the caller accepts that the restrictions
54
- * remain tighter than they need to be. The caller still has to abort the
55
- * transaction.
56
- * @tighten_restrictions cannot be used together with @q: When reopening, we may
57
- * encounter fatal errors even though no restrictions are to be tightened. For
58
- * example, changing a node from RW to RO will fail if the WRITE permission is
59
- * to be kept.
60
- *
61
* A call to this function must always be followed by a call to bdrv_set_perm()
62
* or bdrv_abort_perm_update().
63
*/
64
static int bdrv_check_perm(BlockDriverState *bs, BlockReopenQueue *q,
65
uint64_t cumulative_perms,
66
uint64_t cumulative_shared_perms,
67
- GSList *ignore_children,
68
- bool *tighten_restrictions, Error **errp)
69
+ GSList *ignore_children, Error **errp)
70
{
71
BlockDriver *drv = bs->drv;
72
BdrvChild *c;
73
int ret;
74
75
- assert(!q || !tighten_restrictions);
76
-
77
- if (tighten_restrictions) {
78
- uint64_t current_perms, current_shared;
79
- uint64_t added_perms, removed_shared_perms;
80
-
81
- bdrv_get_cumulative_perm(bs, &current_perms, &current_shared);
82
-
83
- added_perms = cumulative_perms & ~current_perms;
84
- removed_shared_perms = current_shared & ~cumulative_shared_perms;
85
-
86
- *tighten_restrictions = added_perms || removed_shared_perms;
87
- }
88
-
89
/* Write permissions never work with read-only images */
90
if ((cumulative_perms & (BLK_PERM_WRITE | BLK_PERM_WRITE_UNCHANGED)) &&
91
!bdrv_is_writable_after_reopen(bs, q))
92
@@ -XXX,XX +XXX,XX @@ static int bdrv_check_perm(BlockDriverState *bs, BlockReopenQueue *q,
93
/* Check all children */
94
QLIST_FOREACH(c, &bs->children, next) {
95
uint64_t cur_perm, cur_shared;
96
- bool child_tighten_restr;
97
98
bdrv_child_perm(bs, c->bs, c, c->role, q,
99
cumulative_perms, cumulative_shared_perms,
100
&cur_perm, &cur_shared);
101
ret = bdrv_child_check_perm(c, q, cur_perm, cur_shared, ignore_children,
102
- tighten_restrictions ? &child_tighten_restr
103
- : NULL,
104
errp);
105
- if (tighten_restrictions) {
106
- *tighten_restrictions |= child_tighten_restr;
107
- }
108
if (ret < 0) {
109
return ret;
110
}
111
@@ -XXX,XX +XXX,XX @@ char *bdrv_perm_names(uint64_t perm)
112
* set, the BdrvChild objects in this list are ignored in the calculations;
113
* this allows checking permission updates for an existing reference.
114
*
115
- * See bdrv_check_perm() for the semantics of @tighten_restrictions.
116
- *
117
* Needs to be followed by a call to either bdrv_set_perm() or
118
* bdrv_abort_perm_update(). */
119
static int bdrv_check_update_perm(BlockDriverState *bs, BlockReopenQueue *q,
120
uint64_t new_used_perm,
121
uint64_t new_shared_perm,
122
GSList *ignore_children,
123
- bool *tighten_restrictions,
124
Error **errp)
125
{
126
BdrvChild *c;
127
uint64_t cumulative_perms = new_used_perm;
128
uint64_t cumulative_shared_perms = new_shared_perm;
129
130
- assert(!q || !tighten_restrictions);
131
132
/* There is no reason why anyone couldn't tolerate write_unchanged */
133
assert(new_shared_perm & BLK_PERM_WRITE_UNCHANGED);
134
@@ -XXX,XX +XXX,XX @@ static int bdrv_check_update_perm(BlockDriverState *bs, BlockReopenQueue *q,
135
char *user = bdrv_child_user_desc(c);
136
char *perm_names = bdrv_perm_names(new_used_perm & ~c->shared_perm);
137
138
- if (tighten_restrictions) {
139
- *tighten_restrictions = true;
140
- }
141
-
142
error_setg(errp, "Conflicts with use by %s as '%s', which does not "
143
"allow '%s' on %s",
144
user, c->name, perm_names, bdrv_get_node_name(c->bs));
145
@@ -XXX,XX +XXX,XX @@ static int bdrv_check_update_perm(BlockDriverState *bs, BlockReopenQueue *q,
146
char *user = bdrv_child_user_desc(c);
147
char *perm_names = bdrv_perm_names(c->perm & ~new_shared_perm);
148
149
- if (tighten_restrictions) {
150
- *tighten_restrictions = true;
151
- }
152
-
153
error_setg(errp, "Conflicts with use by %s as '%s', which uses "
154
"'%s' on %s",
155
user, c->name, perm_names, bdrv_get_node_name(c->bs));
156
@@ -XXX,XX +XXX,XX @@ static int bdrv_check_update_perm(BlockDriverState *bs, BlockReopenQueue *q,
157
}
158
159
return bdrv_check_perm(bs, q, cumulative_perms, cumulative_shared_perms,
160
- ignore_children, tighten_restrictions, errp);
161
+ ignore_children, errp);
35
}
162
}
36
163
37
+uint64_t bdrv_qapi_perm_to_blk_perm(BlockPermission qapi_perm)
164
/* Needs to be followed by a call to either bdrv_child_set_perm() or
38
+{
165
* bdrv_child_abort_perm_update(). */
39
+ static const uint64_t permissions[] = {
166
static int bdrv_child_check_perm(BdrvChild *c, BlockReopenQueue *q,
40
+ [BLOCK_PERMISSION_CONSISTENT_READ] = BLK_PERM_CONSISTENT_READ,
167
uint64_t perm, uint64_t shared,
41
+ [BLOCK_PERMISSION_WRITE] = BLK_PERM_WRITE,
168
- GSList *ignore_children,
42
+ [BLOCK_PERMISSION_WRITE_UNCHANGED] = BLK_PERM_WRITE_UNCHANGED,
169
- bool *tighten_restrictions, Error **errp)
43
+ [BLOCK_PERMISSION_RESIZE] = BLK_PERM_RESIZE,
170
+ GSList *ignore_children, Error **errp)
44
+ [BLOCK_PERMISSION_GRAPH_MOD] = BLK_PERM_GRAPH_MOD,
171
{
45
+ };
172
int ret;
46
+
173
47
+ QEMU_BUILD_BUG_ON(ARRAY_SIZE(permissions) != BLOCK_PERMISSION__MAX);
174
ignore_children = g_slist_prepend(g_slist_copy(ignore_children), c);
48
+ QEMU_BUILD_BUG_ON(1UL << ARRAY_SIZE(permissions) != BLK_PERM_ALL + 1);
175
- ret = bdrv_check_update_perm(c->bs, q, perm, shared, ignore_children,
49
+
176
- tighten_restrictions, errp);
50
+ assert(qapi_perm < BLOCK_PERMISSION__MAX);
177
+ ret = bdrv_check_update_perm(c->bs, q, perm, shared, ignore_children, errp);
51
+
178
g_slist_free(ignore_children);
52
+ return permissions[qapi_perm];
179
53
+}
180
if (ret < 0) {
54
+
181
@@ -XXX,XX +XXX,XX @@ static void bdrv_child_abort_perm_update(BdrvChild *c)
55
static void bdrv_replace_child_noperm(BdrvChild *child,
182
bdrv_abort_perm_update(c->bs);
56
BlockDriverState *new_bs)
183
}
57
{
184
58
diff --git a/include/block/block.h b/include/block/block.h
185
-static int bdrv_refresh_perms(BlockDriverState *bs, bool *tighten_restrictions,
59
index XXXXXXX..XXXXXXX 100644
186
- Error **errp)
60
--- a/include/block/block.h
187
+static int bdrv_refresh_perms(BlockDriverState *bs, Error **errp)
61
+++ b/include/block/block.h
188
{
62
@@ -XXX,XX +XXX,XX @@ enum {
189
int ret;
63
};
190
uint64_t perm, shared_perm;
64
191
65
char *bdrv_perm_names(uint64_t perm);
192
bdrv_get_cumulative_perm(bs, &perm, &shared_perm);
66
+uint64_t bdrv_qapi_perm_to_blk_perm(BlockPermission qapi_perm);
193
- ret = bdrv_check_perm(bs, NULL, perm, shared_perm, NULL,
67
194
- tighten_restrictions, errp);
68
/* disk I/O throttling */
195
+ ret = bdrv_check_perm(bs, NULL, perm, shared_perm, NULL, errp);
69
void bdrv_init(void);
196
if (ret < 0) {
197
bdrv_abort_perm_update(bs);
198
return ret;
199
@@ -XXX,XX +XXX,XX @@ int bdrv_child_try_set_perm(BdrvChild *c, uint64_t perm, uint64_t shared,
200
{
201
Error *local_err = NULL;
202
int ret;
203
- bool tighten_restrictions;
204
205
- ret = bdrv_child_check_perm(c, NULL, perm, shared, NULL,
206
- &tighten_restrictions, &local_err);
207
+ ret = bdrv_child_check_perm(c, NULL, perm, shared, NULL, &local_err);
208
if (ret < 0) {
209
bdrv_child_abort_perm_update(c);
210
- if (tighten_restrictions) {
211
+ if ((perm & ~c->perm) || (c->shared_perm & ~shared)) {
212
+ /* tighten permissions */
213
error_propagate(errp, local_err);
214
} else {
215
/*
216
@@ -XXX,XX +XXX,XX @@ static void bdrv_replace_child(BdrvChild *child, BlockDriverState *new_bs)
217
}
218
219
if (old_bs) {
220
- bool tighten_restrictions;
221
-
222
/*
223
* Update permissions for old node. We're just taking a parent away, so
224
* we're loosening restrictions. Errors of permission update are not
225
* fatal in this case, ignore them.
226
*/
227
- bdrv_refresh_perms(old_bs, &tighten_restrictions, NULL);
228
- assert(tighten_restrictions == false);
229
+ bdrv_refresh_perms(old_bs, NULL);
230
231
/* When the parent requiring a non-default AioContext is removed, the
232
* node moves back to the main AioContext */
233
@@ -XXX,XX +XXX,XX @@ BdrvChild *bdrv_root_attach_child(BlockDriverState *child_bs,
234
Error *local_err = NULL;
235
int ret;
236
237
- ret = bdrv_check_update_perm(child_bs, NULL, perm, shared_perm, NULL, NULL,
238
- errp);
239
+ ret = bdrv_check_update_perm(child_bs, NULL, perm, shared_perm, NULL, errp);
240
if (ret < 0) {
241
bdrv_abort_perm_update(child_bs);
242
bdrv_unref(child_bs);
243
@@ -XXX,XX +XXX,XX @@ int bdrv_reopen_multiple(BlockReopenQueue *bs_queue, Error **errp)
244
QTAILQ_FOREACH(bs_entry, bs_queue, entry) {
245
BDRVReopenState *state = &bs_entry->state;
246
ret = bdrv_check_perm(state->bs, bs_queue, state->perm,
247
- state->shared_perm, NULL, NULL, errp);
248
+ state->shared_perm, NULL, errp);
249
if (ret < 0) {
250
goto cleanup_perm;
251
}
252
@@ -XXX,XX +XXX,XX @@ int bdrv_reopen_multiple(BlockReopenQueue *bs_queue, Error **errp)
253
bs_queue, state->perm, state->shared_perm,
254
&nperm, &nshared);
255
ret = bdrv_check_update_perm(state->new_backing_bs, NULL,
256
- nperm, nshared, NULL, NULL, errp);
257
+ nperm, nshared, NULL, errp);
258
if (ret < 0) {
259
goto cleanup_perm;
260
}
261
@@ -XXX,XX +XXX,XX @@ static void bdrv_replace_node_common(BlockDriverState *from,
262
263
/* Check whether the required permissions can be granted on @to, ignoring
264
* all BdrvChild in @list so that they can't block themselves. */
265
- ret = bdrv_check_update_perm(to, NULL, perm, shared, list, NULL, errp);
266
+ ret = bdrv_check_update_perm(to, NULL, perm, shared, list, errp);
267
if (ret < 0) {
268
bdrv_abort_perm_update(to);
269
goto out;
270
@@ -XXX,XX +XXX,XX @@ int coroutine_fn bdrv_co_invalidate_cache(BlockDriverState *bs, Error **errp)
271
*/
272
if (bs->open_flags & BDRV_O_INACTIVE) {
273
bs->open_flags &= ~BDRV_O_INACTIVE;
274
- ret = bdrv_refresh_perms(bs, NULL, errp);
275
+ ret = bdrv_refresh_perms(bs, errp);
276
if (ret < 0) {
277
bs->open_flags |= BDRV_O_INACTIVE;
278
return ret;
279
@@ -XXX,XX +XXX,XX @@ static bool bdrv_has_bds_parent(BlockDriverState *bs, bool only_active)
280
static int bdrv_inactivate_recurse(BlockDriverState *bs)
281
{
282
BdrvChild *child, *parent;
283
- bool tighten_restrictions;
284
int ret;
285
286
if (!bs->drv) {
287
@@ -XXX,XX +XXX,XX @@ static int bdrv_inactivate_recurse(BlockDriverState *bs)
288
* We only tried to loosen restrictions, so errors are not fatal, ignore
289
* them.
290
*/
291
- bdrv_refresh_perms(bs, &tighten_restrictions, NULL);
292
- assert(tighten_restrictions == false);
293
+ bdrv_refresh_perms(bs, NULL);
294
295
/* Recursively inactivate children */
296
QLIST_FOREACH(child, &bs->children, next) {
70
--
297
--
71
2.24.1
298
2.29.2
72
299
73
300
diff view generated by jsdifflib
1
When dropping backup-top, we need to drain the node before freeing the
1
From: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
2
BlockCopyState. Otherwise, requests may still be in flight and then the
3
assertion in shres_destroy() will fail.
4
2
5
(This becomes visible in intermittent failure of 056.)
3
1. BDRV_REQ_NO_SERIALISING doesn't exist already, don't mention it.
6
4
7
Cc: qemu-stable@nongnu.org
5
2. We are going to add one more user of BDRV_REQ_SERIALISING, so
8
Signed-off-by: Max Reitz <mreitz@redhat.com>
6
comment about backup becomes a bit confusing here. The use case in
9
Message-id: 20191219182638.104621-1-mreitz@redhat.com
7
backup is documented in block/backup.c, so let's just drop
8
duplication here.
9
10
3. The fact that BDRV_REQ_SERIALISING is only for write requests is
11
omitted. Add a note.
12
13
Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
14
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
15
Reviewed-by: Alberto Garcia <berto@igalia.com>
16
Message-Id: <20201021145859.11201-2-vsementsov@virtuozzo.com>
10
Signed-off-by: Max Reitz <mreitz@redhat.com>
17
Signed-off-by: Max Reitz <mreitz@redhat.com>
11
---
18
---
12
block/backup-top.c | 4 ++--
19
include/block/block.h | 11 +----------
13
1 file changed, 2 insertions(+), 2 deletions(-)
20
1 file changed, 1 insertion(+), 10 deletions(-)
14
21
15
diff --git a/block/backup-top.c b/block/backup-top.c
22
diff --git a/include/block/block.h b/include/block/block.h
16
index XXXXXXX..XXXXXXX 100644
23
index XXXXXXX..XXXXXXX 100644
17
--- a/block/backup-top.c
24
--- a/include/block/block.h
18
+++ b/block/backup-top.c
25
+++ b/include/block/block.h
19
@@ -XXX,XX +XXX,XX @@ void bdrv_backup_top_drop(BlockDriverState *bs)
26
@@ -XXX,XX +XXX,XX @@ typedef enum {
20
BDRVBackupTopState *s = bs->opaque;
27
* content. */
21
AioContext *aio_context = bdrv_get_aio_context(bs);
28
BDRV_REQ_WRITE_UNCHANGED = 0x40,
22
29
23
- block_copy_state_free(s->bcs);
30
- /*
24
-
31
- * BDRV_REQ_SERIALISING forces request serialisation for writes.
25
aio_context_acquire(aio_context);
32
- * It is used to ensure that writes to the backing file of a backup process
26
33
- * target cannot race with a read of the backup target that defers to the
27
bdrv_drained_begin(bs);
34
- * backing file.
28
35
- *
29
+ block_copy_state_free(s->bcs);
36
- * Note, that BDRV_REQ_SERIALISING is _not_ opposite in meaning to
30
+
37
- * BDRV_REQ_NO_SERIALISING. A more descriptive name for the latter might be
31
s->active = false;
38
- * _DO_NOT_WAIT_FOR_SERIALISING, except that is too long.
32
bdrv_child_refresh_perms(bs, bs->backing, &error_abort);
39
- */
33
bdrv_replace_node(bs, backing_bs(bs), &error_abort);
40
+ /* Forces request serialisation. Use only with write requests. */
41
BDRV_REQ_SERIALISING = 0x80,
42
43
/* Execute the request only if the operation can be offloaded or otherwise
34
--
44
--
35
2.24.1
45
2.29.2
36
46
37
47
diff view generated by jsdifflib
1
From: Andrey Shinkevich <andrey.shinkevich@virtuozzo.com>
1
From: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
2
2
3
Add the case to the iotest #214 that checks possibility of writing
3
The comments states, that on misaligned request we should have already
4
compressed data of more than one cluster size. The test case involves
4
been waiting. But for bdrv_padding_rmw_read, we called
5
the compress filter driver showing a sample usage of that.
5
bdrv_mark_request_serialising with align = request_alignment, and now
6
we serialise with align = cluster_size. So we may have to wait again
7
with larger alignment.
6
8
7
Signed-off-by: Andrey Shinkevich <andrey.shinkevich@virtuozzo.com>
9
Note, that the only user of BDRV_REQ_SERIALISING is backup which issues
8
Reviewed-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
10
cluster-aligned requests, so seems the assertion should not fire for
9
Reviewed-by: Max Reitz <mreitz@redhat.com>
11
now. But it's wrong anyway.
10
Message-id: 1575288906-551879-4-git-send-email-andrey.shinkevich@virtuozzo.com
12
13
Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
14
Reviewed-by: Paolo Bonzini <pbonzini@redhat.com>
15
Message-Id: <20201021145859.11201-3-vsementsov@virtuozzo.com>
11
Signed-off-by: Max Reitz <mreitz@redhat.com>
16
Signed-off-by: Max Reitz <mreitz@redhat.com>
12
---
17
---
13
tests/qemu-iotests/214 | 43 ++++++++++++++++++++++++++++++++++++++
18
block/io.c | 11 +----------
14
tests/qemu-iotests/214.out | 14 +++++++++++++
19
1 file changed, 1 insertion(+), 10 deletions(-)
15
2 files changed, 57 insertions(+)
16
20
17
diff --git a/tests/qemu-iotests/214 b/tests/qemu-iotests/214
21
diff --git a/block/io.c b/block/io.c
18
index XXXXXXX..XXXXXXX 100755
19
--- a/tests/qemu-iotests/214
20
+++ b/tests/qemu-iotests/214
21
@@ -XXX,XX +XXX,XX @@ _check_test_img -r all
22
$QEMU_IO -c "read -P 0x11 0 4M" "$TEST_IMG" 2>&1 | _filter_qemu_io | _filter_testdir
23
$QEMU_IO -c "read -P 0x22 4M 4M" "$TEST_IMG" 2>&1 | _filter_qemu_io | _filter_testdir
24
25
+echo
26
+echo "=== Write compressed data of multiple clusters ==="
27
+echo
28
+cluster_size=0x10000
29
+_make_test_img 2M -o cluster_size=$cluster_size
30
+
31
+echo "Write uncompressed data:"
32
+let data_size="8 * $cluster_size"
33
+$QEMU_IO -c "write -P 0xaa 0 $data_size" "$TEST_IMG" \
34
+ 2>&1 | _filter_qemu_io | _filter_testdir
35
+sizeA=$($QEMU_IMG info --output=json "$TEST_IMG" |
36
+ sed -n '/"actual-size":/ s/[^0-9]//gp')
37
+
38
+_make_test_img 2M -o cluster_size=$cluster_size
39
+echo "Write compressed data:"
40
+let data_size="3 * $cluster_size + $cluster_size / 2"
41
+# Set compress on. That will align the written data
42
+# by the cluster size and will write them compressed.
43
+QEMU_IO_OPTIONS=$QEMU_IO_OPTIONS_NO_FMT \
44
+$QEMU_IO -c "write -P 0xbb 0 $data_size" --image-opts \
45
+ "driver=compress,file.driver=$IMGFMT,file.file.driver=file,file.file.filename=$TEST_IMG" \
46
+ 2>&1 | _filter_qemu_io | _filter_testdir
47
+
48
+let offset="4 * $cluster_size + $cluster_size / 4"
49
+QEMU_IO_OPTIONS=$QEMU_IO_OPTIONS_NO_FMT \
50
+$QEMU_IO -c "write -P 0xcc $offset $data_size" "json:{\
51
+ 'driver': 'compress',
52
+ 'file': {'driver': '$IMGFMT',
53
+ 'file': {'driver': 'file',
54
+ 'filename': '$TEST_IMG'}}}" | \
55
+ _filter_qemu_io | _filter_testdir
56
+
57
+sizeB=$($QEMU_IMG info --output=json "$TEST_IMG" |
58
+ sed -n '/"actual-size":/ s/[^0-9]//gp')
59
+
60
+if [ $sizeA -le $sizeB ]
61
+then
62
+ echo "Compression ERROR"
63
+fi
64
+
65
+$QEMU_IMG check --output=json "$TEST_IMG" |
66
+ sed -n 's/,$//; /"compressed-clusters":/ s/^ *//p'
67
+
68
# success, all done
69
echo '*** done'
70
rm -f $seq.full
71
diff --git a/tests/qemu-iotests/214.out b/tests/qemu-iotests/214.out
72
index XXXXXXX..XXXXXXX 100644
22
index XXXXXXX..XXXXXXX 100644
73
--- a/tests/qemu-iotests/214.out
23
--- a/block/io.c
74
+++ b/tests/qemu-iotests/214.out
24
+++ b/block/io.c
75
@@ -XXX,XX +XXX,XX @@ read 4194304/4194304 bytes at offset 0
25
@@ -XXX,XX +XXX,XX @@ bdrv_co_write_req_prepare(BdrvChild *child, int64_t offset, uint64_t bytes,
76
4 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
26
BdrvTrackedRequest *req, int flags)
77
read 4194304/4194304 bytes at offset 4194304
27
{
78
4 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
28
BlockDriverState *bs = child->bs;
79
+
29
- bool waited;
80
+=== Write compressed data of multiple clusters ===
30
int64_t end_sector = DIV_ROUND_UP(offset + bytes, BDRV_SECTOR_SIZE);
81
+
31
82
+Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=2097152
32
if (bs->read_only) {
83
+Write uncompressed data:
33
@@ -XXX,XX +XXX,XX @@ bdrv_co_write_req_prepare(BdrvChild *child, int64_t offset, uint64_t bytes,
84
+wrote 524288/524288 bytes at offset 0
34
assert(!(flags & ~BDRV_REQ_MASK));
85
+512 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
35
86
+Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=2097152
36
if (flags & BDRV_REQ_SERIALISING) {
87
+Write compressed data:
37
- waited = bdrv_mark_request_serialising(req, bdrv_get_cluster_size(bs));
88
+wrote 229376/229376 bytes at offset 0
38
- /*
89
+224 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
39
- * For a misaligned request we should have already waited earlier,
90
+wrote 229376/229376 bytes at offset 278528
40
- * because we come after bdrv_padding_rmw_read which must be called
91
+224 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
41
- * with the request already marked as serialising.
92
+"compressed-clusters": 8
42
- */
93
*** done
43
- assert(!waited ||
44
- (req->offset == req->overlap_offset &&
45
- req->bytes == req->overlap_bytes));
46
+ bdrv_mark_request_serialising(req, bdrv_get_cluster_size(bs));
47
} else {
48
bdrv_wait_serialising_requests(req);
49
}
94
--
50
--
95
2.24.1
51
2.29.2
96
52
97
53
diff view generated by jsdifflib
1
This will allow us to add more options than just -b.
1
From: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
2
2
3
Signed-off-by: Max Reitz <mreitz@redhat.com>
3
To be reused in separate.
4
Reviewed-by: Maxim Levitsky <mlevitsk@redhat.com>
4
5
Message-id: 20191107163708.833192-9-mreitz@redhat.com
5
Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
6
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
7
Message-Id: <20201021145859.11201-4-vsementsov@virtuozzo.com>
6
Signed-off-by: Max Reitz <mreitz@redhat.com>
8
Signed-off-by: Max Reitz <mreitz@redhat.com>
7
---
9
---
8
tests/qemu-iotests/common.rc | 28 ++++++++++++++++++++--------
10
block/io.c | 71 +++++++++++++++++++++++++++++++-----------------------
9
1 file changed, 20 insertions(+), 8 deletions(-)
11
1 file changed, 41 insertions(+), 30 deletions(-)
10
12
11
diff --git a/tests/qemu-iotests/common.rc b/tests/qemu-iotests/common.rc
13
diff --git a/block/io.c b/block/io.c
12
index XXXXXXX..XXXXXXX 100644
14
index XXXXXXX..XXXXXXX 100644
13
--- a/tests/qemu-iotests/common.rc
15
--- a/block/io.c
14
+++ b/tests/qemu-iotests/common.rc
16
+++ b/block/io.c
15
@@ -XXX,XX +XXX,XX @@ _make_test_img()
17
@@ -XXX,XX +XXX,XX @@ static bool tracked_request_overlaps(BdrvTrackedRequest *req,
16
# extra qemu-img options can be added by tests
18
return true;
17
# at least one argument (the image size) needs to be added
19
}
18
local extra_img_options=""
20
19
- local image_size=$*
21
+/* Called with self->bs->reqs_lock held */
20
local optstr=""
22
+static BdrvTrackedRequest *
21
local img_name=""
23
+bdrv_find_conflicting_request(BdrvTrackedRequest *self)
22
local use_backing=0
24
+{
23
local backing_file=""
25
+ BdrvTrackedRequest *req;
24
local object_options=""
25
+ local misc_params=()
26
27
if [ -n "$TEST_IMG_FILE" ]; then
28
img_name=$TEST_IMG_FILE
29
@@ -XXX,XX +XXX,XX @@ _make_test_img()
30
optstr=$(_optstr_add "$optstr" "key-secret=keysec0")
31
fi
32
33
- if [ "$1" = "-b" ]; then
34
- use_backing=1
35
- backing_file=$2
36
- image_size=$3
37
- fi
38
+ for param; do
39
+ if [ "$use_backing" = "1" -a -z "$backing_file" ]; then
40
+ backing_file=$param
41
+ continue
42
+ fi
43
+
26
+
44
+ case "$param" in
27
+ QLIST_FOREACH(req, &self->bs->tracked_requests, list) {
45
+ -b)
28
+ if (req == self || (!req->serialising && !self->serialising)) {
46
+ use_backing=1
29
+ continue;
47
+ ;;
30
+ }
31
+ if (tracked_request_overlaps(req, self->overlap_offset,
32
+ self->overlap_bytes))
33
+ {
34
+ /*
35
+ * Hitting this means there was a reentrant request, for
36
+ * example, a block driver issuing nested requests. This must
37
+ * never happen since it means deadlock.
38
+ */
39
+ assert(qemu_coroutine_self() != req->co);
48
+
40
+
49
+ *)
41
+ /*
50
+ misc_params=("${misc_params[@]}" "$param")
42
+ * If the request is already (indirectly) waiting for us, or
51
+ ;;
43
+ * will wait for us as soon as it wakes up, then just go on
52
+ esac
44
+ * (instead of producing a deadlock in the former case).
53
+ done
45
+ */
46
+ if (!req->waiting_for) {
47
+ return req;
48
+ }
49
+ }
50
+ }
54
+
51
+
55
if [ \( "$IMGFMT" = "qcow2" -o "$IMGFMT" = "qed" \) -a -n "$CLUSTER_SIZE" ]; then
52
+ return NULL;
56
optstr=$(_optstr_add "$optstr" "cluster_size=$CLUSTER_SIZE")
53
+}
57
fi
54
+
58
@@ -XXX,XX +XXX,XX @@ _make_test_img()
55
static bool coroutine_fn
59
# XXX(hch): have global image options?
56
bdrv_wait_serialising_requests_locked(BlockDriverState *bs,
60
(
57
BdrvTrackedRequest *self)
61
if [ $use_backing = 1 ]; then
58
{
62
- $QEMU_IMG create $object_options -f $IMGFMT $extra_img_options -b "$backing_file" "$img_name" $image_size 2>&1
59
BdrvTrackedRequest *req;
63
+ $QEMU_IMG create $object_options -f $IMGFMT $extra_img_options -b "$backing_file" "$img_name" "${misc_params[@]}" 2>&1
60
- bool retry;
64
else
61
bool waited = false;
65
- $QEMU_IMG create $object_options -f $IMGFMT $extra_img_options "$img_name" $image_size 2>&1
62
66
+ $QEMU_IMG create $object_options -f $IMGFMT $extra_img_options "$img_name" "${misc_params[@]}" 2>&1
63
- do {
67
fi
64
- retry = false;
68
) | _filter_img_create
65
- QLIST_FOREACH(req, &bs->tracked_requests, list) {
66
- if (req == self || (!req->serialising && !self->serialising)) {
67
- continue;
68
- }
69
- if (tracked_request_overlaps(req, self->overlap_offset,
70
- self->overlap_bytes))
71
- {
72
- /* Hitting this means there was a reentrant request, for
73
- * example, a block driver issuing nested requests. This must
74
- * never happen since it means deadlock.
75
- */
76
- assert(qemu_coroutine_self() != req->co);
77
-
78
- /* If the request is already (indirectly) waiting for us, or
79
- * will wait for us as soon as it wakes up, then just go on
80
- * (instead of producing a deadlock in the former case). */
81
- if (!req->waiting_for) {
82
- self->waiting_for = req;
83
- qemu_co_queue_wait(&req->wait_queue, &bs->reqs_lock);
84
- self->waiting_for = NULL;
85
- retry = true;
86
- waited = true;
87
- break;
88
- }
89
- }
90
- }
91
- } while (retry);
92
+ while ((req = bdrv_find_conflicting_request(self))) {
93
+ self->waiting_for = req;
94
+ qemu_co_queue_wait(&req->wait_queue, &bs->reqs_lock);
95
+ self->waiting_for = NULL;
96
+ waited = true;
97
+ }
98
+
99
return waited;
100
}
69
101
70
--
102
--
71
2.24.1
103
2.29.2
72
104
73
105
diff view generated by jsdifflib
1
Signed-off-by: Max Reitz <mreitz@redhat.com>
1
From: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
2
Reviewed-by: Maxim Levitsky <mlevitsk@redhat.com>
2
3
Message-id: 20191107163708.833192-13-mreitz@redhat.com
3
bs is linked in req, so no needs to pass it separately. Most of
4
tracked-requests API doesn't have bs argument. Actually, after this
5
patch only tracked_request_begin has it, but it's for purpose.
6
7
While being here, also add a comment about what "_locked" is.
8
9
Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
10
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
11
Message-Id: <20201021145859.11201-5-vsementsov@virtuozzo.com>
4
Signed-off-by: Max Reitz <mreitz@redhat.com>
12
Signed-off-by: Max Reitz <mreitz@redhat.com>
5
---
13
---
6
tests/qemu-iotests/071 | 4 ++--
14
block/io.c | 10 +++++-----
7
tests/qemu-iotests/174 | 2 +-
15
1 file changed, 5 insertions(+), 5 deletions(-)
8
tests/qemu-iotests/178 | 4 ++--
9
tests/qemu-iotests/197 | 4 ++--
10
tests/qemu-iotests/215 | 4 ++--
11
5 files changed, 9 insertions(+), 9 deletions(-)
12
16
13
diff --git a/tests/qemu-iotests/071 b/tests/qemu-iotests/071
17
diff --git a/block/io.c b/block/io.c
14
index XXXXXXX..XXXXXXX 100755
18
index XXXXXXX..XXXXXXX 100644
15
--- a/tests/qemu-iotests/071
19
--- a/block/io.c
16
+++ b/tests/qemu-iotests/071
20
+++ b/block/io.c
17
@@ -XXX,XX +XXX,XX @@ echo
21
@@ -XXX,XX +XXX,XX @@ bdrv_find_conflicting_request(BdrvTrackedRequest *self)
18
echo "=== Testing blkverify through filename ==="
22
return NULL;
19
echo
20
21
-TEST_IMG="$TEST_IMG.base" IMGOPTS="" IMGFMT="raw" _make_test_img $IMG_SIZE |\
22
+TEST_IMG="$TEST_IMG.base" IMGFMT="raw" _make_test_img --no-opts $IMG_SIZE |\
23
_filter_imgfmt
24
_make_test_img $IMG_SIZE
25
$QEMU_IO -c "open -o driver=raw,file.driver=blkverify,file.raw.filename=$TEST_IMG.base $TEST_IMG" \
26
@@ -XXX,XX +XXX,XX @@ echo
27
echo "=== Testing blkverify through file blockref ==="
28
echo
29
30
-TEST_IMG="$TEST_IMG.base" IMGOPTS="" IMGFMT="raw" _make_test_img $IMG_SIZE |\
31
+TEST_IMG="$TEST_IMG.base" IMGFMT="raw" _make_test_img --no-opts $IMG_SIZE |\
32
_filter_imgfmt
33
_make_test_img $IMG_SIZE
34
$QEMU_IO -c "open -o driver=raw,file.driver=blkverify,file.raw.filename=$TEST_IMG.base,file.test.driver=$IMGFMT,file.test.file.filename=$TEST_IMG" \
35
diff --git a/tests/qemu-iotests/174 b/tests/qemu-iotests/174
36
index XXXXXXX..XXXXXXX 100755
37
--- a/tests/qemu-iotests/174
38
+++ b/tests/qemu-iotests/174
39
@@ -XXX,XX +XXX,XX @@ _unsupported_fmt raw
40
41
42
size=256K
43
-IMGFMT=raw IMGKEYSECRET= IMGOPTS= _make_test_img $size | _filter_imgfmt
44
+IMGFMT=raw IMGKEYSECRET= _make_test_img --no-opts $size | _filter_imgfmt
45
46
echo
47
echo "== reading wrong format should fail =="
48
diff --git a/tests/qemu-iotests/178 b/tests/qemu-iotests/178
49
index XXXXXXX..XXXXXXX 100755
50
--- a/tests/qemu-iotests/178
51
+++ b/tests/qemu-iotests/178
52
@@ -XXX,XX +XXX,XX @@ $QEMU_IMG measure -O foo "$TEST_IMG" # unknown image file format
53
54
make_test_img_with_fmt() {
55
# Shadow global variables within this function
56
- local IMGFMT="$1" IMGOPTS=""
57
- _make_test_img "$2"
58
+ local IMGFMT="$1"
59
+ _make_test_img --no-opts "$2"
60
}
23
}
61
24
62
qemu_io_with_fmt() {
25
+/* Called with self->bs->reqs_lock held */
63
diff --git a/tests/qemu-iotests/197 b/tests/qemu-iotests/197
26
static bool coroutine_fn
64
index XXXXXXX..XXXXXXX 100755
27
-bdrv_wait_serialising_requests_locked(BlockDriverState *bs,
65
--- a/tests/qemu-iotests/197
28
- BdrvTrackedRequest *self)
66
+++ b/tests/qemu-iotests/197
29
+bdrv_wait_serialising_requests_locked(BdrvTrackedRequest *self)
67
@@ -XXX,XX +XXX,XX @@ if [ "$IMGFMT" = "vpc" ]; then
30
{
68
fi
31
BdrvTrackedRequest *req;
69
_make_test_img 4G
32
bool waited = false;
70
$QEMU_IO -c "write -P 55 3G 1k" "$TEST_IMG" | _filter_qemu_io
33
71
-IMGPROTO=file IMGFMT=qcow2 IMGOPTS= TEST_IMG_FILE="$TEST_WRAP" \
34
while ((req = bdrv_find_conflicting_request(self))) {
72
- _make_test_img -F "$IMGFMT" -b "$TEST_IMG" | _filter_img_create
35
self->waiting_for = req;
73
+IMGPROTO=file IMGFMT=qcow2 TEST_IMG_FILE="$TEST_WRAP" \
36
- qemu_co_queue_wait(&req->wait_queue, &bs->reqs_lock);
74
+ _make_test_img --no-opts -F "$IMGFMT" -b "$TEST_IMG" | _filter_img_create
37
+ qemu_co_queue_wait(&req->wait_queue, &self->bs->reqs_lock);
75
$QEMU_IO -f qcow2 -c "write -z -u 1M 64k" "$TEST_WRAP" | _filter_qemu_io
38
self->waiting_for = NULL;
76
39
waited = true;
77
# Ensure that a read of two clusters, but where one is already allocated,
40
}
78
diff --git a/tests/qemu-iotests/215 b/tests/qemu-iotests/215
41
@@ -XXX,XX +XXX,XX @@ bool bdrv_mark_request_serialising(BdrvTrackedRequest *req, uint64_t align)
79
index XXXXXXX..XXXXXXX 100755
42
80
--- a/tests/qemu-iotests/215
43
req->overlap_offset = MIN(req->overlap_offset, overlap_offset);
81
+++ b/tests/qemu-iotests/215
44
req->overlap_bytes = MAX(req->overlap_bytes, overlap_bytes);
82
@@ -XXX,XX +XXX,XX @@ if [ "$IMGFMT" = "vpc" ]; then
45
- waited = bdrv_wait_serialising_requests_locked(bs, req);
83
fi
46
+ waited = bdrv_wait_serialising_requests_locked(req);
84
_make_test_img 4G
47
qemu_co_mutex_unlock(&bs->reqs_lock);
85
$QEMU_IO -c "write -P 55 3G 1k" "$TEST_IMG" | _filter_qemu_io
48
return waited;
86
-IMGPROTO=file IMGFMT=qcow2 IMGOPTS= TEST_IMG_FILE="$TEST_WRAP" \
49
}
87
- _make_test_img -F "$IMGFMT" -b "$TEST_IMG" | _filter_img_create
50
@@ -XXX,XX +XXX,XX @@ static bool coroutine_fn bdrv_wait_serialising_requests(BdrvTrackedRequest *self
88
+IMGPROTO=file IMGFMT=qcow2 TEST_IMG_FILE="$TEST_WRAP" \
51
}
89
+ _make_test_img --no-opts -F "$IMGFMT" -b "$TEST_IMG" | _filter_img_create
52
90
$QEMU_IO -f qcow2 -c "write -z -u 1M 64k" "$TEST_WRAP" | _filter_qemu_io
53
qemu_co_mutex_lock(&bs->reqs_lock);
91
54
- waited = bdrv_wait_serialising_requests_locked(bs, self);
92
# Ensure that a read of two clusters, but where one is already allocated,
55
+ waited = bdrv_wait_serialising_requests_locked(self);
56
qemu_co_mutex_unlock(&bs->reqs_lock);
57
58
return waited;
93
--
59
--
94
2.24.1
60
2.29.2
95
61
96
62
diff view generated by jsdifflib
1
From: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
1
From: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
2
2
3
qcow2_can_store_new_dirty_bitmap works wrong, as it considers only
3
We'll need a separate function, which will only "mark" request
4
bitmaps already stored in the qcow2 image and ignores persistent
4
serialising with specified align but not wait for conflicting
5
BdrvDirtyBitmap objects.
5
requests. So, it will be like old bdrv_mark_request_serialising(),
6
before merging bdrv_wait_serialising_requests_locked() into it.
6
7
7
So, let's instead count persistent BdrvDirtyBitmaps. We load all qcow2
8
To reduce the possible mess, let's do the following:
8
bitmaps on open, so there should not be any bitmap in the image for
9
9
which we don't have BdrvDirtyBitmaps version. If it is - it's a kind of
10
Public function that does both marking and waiting will be called
10
corruption, and no reason to check for corruptions here (open() and
11
bdrv_make_request_serialising, and private function which will only
11
close() are better places for it).
12
"mark" will be called tracked_request_set_serialising().
12
13
13
Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
14
Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
14
Message-id: 20191014115126.15360-2-vsementsov@virtuozzo.com
15
Reviewed-by: Max Reitz <mreitz@redhat.com>
15
Reviewed-by: Max Reitz <mreitz@redhat.com>
16
Cc: qemu-stable@nongnu.org
16
Message-Id: <20201021145859.11201-6-vsementsov@virtuozzo.com>
17
Signed-off-by: Max Reitz <mreitz@redhat.com>
17
Signed-off-by: Max Reitz <mreitz@redhat.com>
18
---
18
---
19
block/qcow2-bitmap.c | 41 ++++++++++++++++++-----------------------
19
include/block/block_int.h | 3 ++-
20
1 file changed, 18 insertions(+), 23 deletions(-)
20
block/file-posix.c | 2 +-
21
block/io.c | 35 +++++++++++++++++++++++------------
22
3 files changed, 26 insertions(+), 14 deletions(-)
21
23
22
diff --git a/block/qcow2-bitmap.c b/block/qcow2-bitmap.c
24
diff --git a/include/block/block_int.h b/include/block/block_int.h
23
index XXXXXXX..XXXXXXX 100644
25
index XXXXXXX..XXXXXXX 100644
24
--- a/block/qcow2-bitmap.c
26
--- a/include/block/block_int.h
25
+++ b/block/qcow2-bitmap.c
27
+++ b/include/block/block_int.h
26
@@ -XXX,XX +XXX,XX @@ bool coroutine_fn qcow2_co_can_store_new_dirty_bitmap(BlockDriverState *bs,
28
@@ -XXX,XX +XXX,XX @@ extern unsigned int bdrv_drain_all_count;
27
Error **errp)
29
void bdrv_apply_subtree_drain(BdrvChild *child, BlockDriverState *new_parent);
30
void bdrv_unapply_subtree_drain(BdrvChild *child, BlockDriverState *old_parent);
31
32
-bool coroutine_fn bdrv_mark_request_serialising(BdrvTrackedRequest *req, uint64_t align);
33
+bool coroutine_fn bdrv_make_request_serialising(BdrvTrackedRequest *req,
34
+ uint64_t align);
35
BdrvTrackedRequest *coroutine_fn bdrv_co_get_self_request(BlockDriverState *bs);
36
37
int get_tmp_filename(char *filename, int size);
38
diff --git a/block/file-posix.c b/block/file-posix.c
39
index XXXXXXX..XXXXXXX 100644
40
--- a/block/file-posix.c
41
+++ b/block/file-posix.c
42
@@ -XXX,XX +XXX,XX @@ raw_do_pwrite_zeroes(BlockDriverState *bs, int64_t offset, int bytes,
43
44
assert(bdrv_check_request(req->offset, req->bytes) == 0);
45
46
- bdrv_mark_request_serialising(req, bs->bl.request_alignment);
47
+ bdrv_make_request_serialising(req, bs->bl.request_alignment);
48
}
49
#endif
50
51
diff --git a/block/io.c b/block/io.c
52
index XXXXXXX..XXXXXXX 100644
53
--- a/block/io.c
54
+++ b/block/io.c
55
@@ -XXX,XX +XXX,XX @@ bdrv_wait_serialising_requests_locked(BdrvTrackedRequest *self)
56
return waited;
57
}
58
59
-bool bdrv_mark_request_serialising(BdrvTrackedRequest *req, uint64_t align)
60
+/* Called with req->bs->reqs_lock held */
61
+static void tracked_request_set_serialising(BdrvTrackedRequest *req,
62
+ uint64_t align)
28
{
63
{
29
BDRVQcow2State *s = bs->opaque;
64
- BlockDriverState *bs = req->bs;
30
- bool found;
65
int64_t overlap_offset = req->offset & ~(align - 1);
31
- Qcow2BitmapList *bm_list;
66
uint64_t overlap_bytes = ROUND_UP(req->offset + req->bytes, align)
32
+ BdrvDirtyBitmap *bitmap;
67
- overlap_offset;
33
+ uint64_t bitmap_directory_size = 0;
68
- bool waited;
34
+ uint32_t nb_bitmaps = 0;
69
70
- qemu_co_mutex_lock(&bs->reqs_lock);
71
if (!req->serialising) {
72
qatomic_inc(&req->bs->serialising_in_flight);
73
req->serialising = true;
74
@@ -XXX,XX +XXX,XX @@ bool bdrv_mark_request_serialising(BdrvTrackedRequest *req, uint64_t align)
75
76
req->overlap_offset = MIN(req->overlap_offset, overlap_offset);
77
req->overlap_bytes = MAX(req->overlap_bytes, overlap_bytes);
78
- waited = bdrv_wait_serialising_requests_locked(req);
79
- qemu_co_mutex_unlock(&bs->reqs_lock);
80
- return waited;
81
}
82
83
/**
84
@@ -XXX,XX +XXX,XX @@ static bool coroutine_fn bdrv_wait_serialising_requests(BdrvTrackedRequest *self
85
return waited;
86
}
87
88
+bool coroutine_fn bdrv_make_request_serialising(BdrvTrackedRequest *req,
89
+ uint64_t align)
90
+{
91
+ bool waited;
35
+
92
+
36
+ if (bdrv_find_dirty_bitmap(bs, name)) {
93
+ qemu_co_mutex_lock(&req->bs->reqs_lock);
37
+ error_setg(errp, "Bitmap already exists: %s", name);
94
+
38
+ return false;
95
+ tracked_request_set_serialising(req, align);
39
+ }
96
+ waited = bdrv_wait_serialising_requests_locked(req);
40
97
+
41
if (s->qcow_version < 3) {
98
+ qemu_co_mutex_unlock(&req->bs->reqs_lock);
42
/* Without autoclear_features, we would always have to assume
99
+
43
@@ -XXX,XX +XXX,XX @@ bool coroutine_fn qcow2_co_can_store_new_dirty_bitmap(BlockDriverState *bs,
100
+ return waited;
44
goto fail;
101
+}
102
+
103
int bdrv_check_request(int64_t offset, int64_t bytes)
104
{
105
if (offset < 0 || bytes < 0) {
106
@@ -XXX,XX +XXX,XX @@ static int coroutine_fn bdrv_aligned_preadv(BdrvChild *child,
107
* with each other for the same cluster. For example, in copy-on-read
108
* it ensures that the CoR read and write operations are atomic and
109
* guest writes cannot interleave between them. */
110
- bdrv_mark_request_serialising(req, bdrv_get_cluster_size(bs));
111
+ bdrv_make_request_serialising(req, bdrv_get_cluster_size(bs));
112
} else {
113
bdrv_wait_serialising_requests(req);
45
}
114
}
46
115
@@ -XXX,XX +XXX,XX @@ bdrv_co_write_req_prepare(BdrvChild *child, int64_t offset, uint64_t bytes,
47
- if (s->nb_bitmaps == 0) {
116
assert(!(flags & ~BDRV_REQ_MASK));
48
- return true;
117
49
+ FOR_EACH_DIRTY_BITMAP(bs, bitmap) {
118
if (flags & BDRV_REQ_SERIALISING) {
50
+ if (bdrv_dirty_bitmap_get_persistence(bitmap)) {
119
- bdrv_mark_request_serialising(req, bdrv_get_cluster_size(bs));
51
+ nb_bitmaps++;
120
+ bdrv_make_request_serialising(req, bdrv_get_cluster_size(bs));
52
+ bitmap_directory_size +=
121
} else {
53
+ calc_dir_entry_size(strlen(bdrv_dirty_bitmap_name(bitmap)), 0);
122
bdrv_wait_serialising_requests(req);
54
+ }
55
}
123
}
56
+ nb_bitmaps++;
124
@@ -XXX,XX +XXX,XX @@ static int coroutine_fn bdrv_co_do_zero_pwritev(BdrvChild *child,
57
+ bitmap_directory_size += calc_dir_entry_size(strlen(name), 0);
125
58
126
padding = bdrv_init_padding(bs, offset, bytes, &pad);
59
- if (s->nb_bitmaps >= QCOW2_MAX_BITMAPS) {
127
if (padding) {
60
+ if (nb_bitmaps > QCOW2_MAX_BITMAPS) {
128
- bdrv_mark_request_serialising(req, align);
61
error_setg(errp,
129
+ bdrv_make_request_serialising(req, align);
62
"Maximum number of persistent bitmaps is already reached");
130
63
goto fail;
131
bdrv_padding_rmw_read(child, req, &pad, true);
132
133
@@ -XXX,XX +XXX,XX @@ int coroutine_fn bdrv_co_pwritev_part(BdrvChild *child,
64
}
134
}
65
135
66
- if (s->bitmap_directory_size + calc_dir_entry_size(strlen(name), 0) >
136
if (bdrv_pad_request(bs, &qiov, &qiov_offset, &offset, &bytes, &pad)) {
67
- QCOW2_MAX_BITMAP_DIRECTORY_SIZE)
137
- bdrv_mark_request_serialising(&req, align);
68
- {
138
+ bdrv_make_request_serialising(&req, align);
69
+ if (bitmap_directory_size > QCOW2_MAX_BITMAP_DIRECTORY_SIZE) {
139
bdrv_padding_rmw_read(child, &req, &pad, false);
70
error_setg(errp, "Not enough space in the bitmap directory");
71
goto fail;
72
}
140
}
73
141
74
- qemu_co_mutex_lock(&s->lock);
142
@@ -XXX,XX +XXX,XX @@ int coroutine_fn bdrv_co_truncate(BdrvChild *child, int64_t offset, bool exact,
75
- bm_list = bitmap_list_load(bs, s->bitmap_directory_offset,
143
* new area, we need to make sure that no write requests are made to it
76
- s->bitmap_directory_size, errp);
144
* concurrently or they might be overwritten by preallocation. */
77
- qemu_co_mutex_unlock(&s->lock);
145
if (new_bytes) {
78
- if (bm_list == NULL) {
146
- bdrv_mark_request_serialising(&req, 1);
79
- goto fail;
147
+ bdrv_make_request_serialising(&req, 1);
80
- }
148
}
81
-
149
if (bs->read_only) {
82
- found = find_bitmap_by_name(bm_list, name);
150
error_setg(errp, "Image is read-only");
83
- bitmap_list_free(bm_list);
84
- if (found) {
85
- error_setg(errp, "Bitmap with the same name is already stored");
86
- goto fail;
87
- }
88
-
89
return true;
90
91
fail:
92
--
151
--
93
2.24.1
152
2.29.2
94
153
95
154
diff view generated by jsdifflib
1
Signed-off-by: Max Reitz <mreitz@redhat.com>
1
From: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
2
Message-id: 20191107163708.833192-22-mreitz@redhat.com
2
3
[mreitz: Also disable 273]
3
Add flag to make serialising request no wait: if there are conflicting
4
requests, just return error immediately. It's will be used in upcoming
5
preallocate filter.
6
7
Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
8
Reviewed-by: Max Reitz <mreitz@redhat.com>
9
Message-Id: <20201021145859.11201-7-vsementsov@virtuozzo.com>
4
Signed-off-by: Max Reitz <mreitz@redhat.com>
10
Signed-off-by: Max Reitz <mreitz@redhat.com>
5
---
11
---
6
tests/qemu-iotests/007 | 5 +++--
12
include/block/block.h | 9 ++++++++-
7
tests/qemu-iotests/014 | 2 ++
13
block/io.c | 11 ++++++++++-
8
tests/qemu-iotests/015 | 5 +++--
14
2 files changed, 18 insertions(+), 2 deletions(-)
9
tests/qemu-iotests/026 | 5 ++++-
10
tests/qemu-iotests/029 | 5 +++--
11
tests/qemu-iotests/031 | 6 +++---
12
tests/qemu-iotests/036 | 5 +++--
13
tests/qemu-iotests/039 | 3 +++
14
tests/qemu-iotests/046 | 2 ++
15
tests/qemu-iotests/048 | 2 ++
16
tests/qemu-iotests/051 | 5 +++--
17
tests/qemu-iotests/058 | 5 +++--
18
tests/qemu-iotests/060 | 6 ++++--
19
tests/qemu-iotests/061 | 6 ++++--
20
tests/qemu-iotests/062 | 2 +-
21
tests/qemu-iotests/066 | 4 +++-
22
tests/qemu-iotests/067 | 6 ++++--
23
tests/qemu-iotests/068 | 5 +++--
24
tests/qemu-iotests/071 | 3 +++
25
tests/qemu-iotests/073 | 4 ++++
26
tests/qemu-iotests/074 | 2 ++
27
tests/qemu-iotests/080 | 5 +++--
28
tests/qemu-iotests/090 | 2 ++
29
tests/qemu-iotests/098 | 6 ++++--
30
tests/qemu-iotests/099 | 3 ++-
31
tests/qemu-iotests/103 | 5 +++--
32
tests/qemu-iotests/108 | 6 ++++--
33
tests/qemu-iotests/112 | 5 +++--
34
tests/qemu-iotests/114 | 2 ++
35
tests/qemu-iotests/121 | 3 +++
36
tests/qemu-iotests/138 | 3 +++
37
tests/qemu-iotests/156 | 2 ++
38
tests/qemu-iotests/176 | 7 +++++--
39
tests/qemu-iotests/191 | 2 ++
40
tests/qemu-iotests/201 | 6 +++---
41
tests/qemu-iotests/214 | 3 ++-
42
tests/qemu-iotests/217 | 3 ++-
43
tests/qemu-iotests/220 | 5 +++--
44
tests/qemu-iotests/243 | 6 ++++--
45
tests/qemu-iotests/244 | 5 +++--
46
tests/qemu-iotests/250 | 2 ++
47
tests/qemu-iotests/261 | 3 ++-
48
tests/qemu-iotests/267 | 5 +++--
49
tests/qemu-iotests/273 | 3 +++
50
44 files changed, 127 insertions(+), 53 deletions(-)
51
15
52
diff --git a/tests/qemu-iotests/007 b/tests/qemu-iotests/007
16
diff --git a/include/block/block.h b/include/block/block.h
53
index XXXXXXX..XXXXXXX 100755
17
index XXXXXXX..XXXXXXX 100644
54
--- a/tests/qemu-iotests/007
18
--- a/include/block/block.h
55
+++ b/tests/qemu-iotests/007
19
+++ b/include/block/block.h
56
@@ -XXX,XX +XXX,XX @@ trap "_cleanup; exit \$status" 0 1 2 3 15
20
@@ -XXX,XX +XXX,XX @@ typedef enum {
57
_supported_fmt qcow2
21
* written to qiov parameter which may be NULL.
58
_supported_proto generic
22
*/
59
# refcount_bits must be at least 4 so we can create ten internal snapshots
23
BDRV_REQ_PREFETCH = 0x200,
60
-# (1 bit supports none, 2 bits support two, 4 bits support 14)
24
+
61
-_unsupported_imgopts 'refcount_bits=\(1\|2\)[^0-9]'
25
+ /*
62
+# (1 bit supports none, 2 bits support two, 4 bits support 14);
26
+ * If we need to wait for other requests, just fail immediately. Used
63
+# snapshot are generally impossible with external data files
27
+ * only together with BDRV_REQ_SERIALISING.
64
+_unsupported_imgopts 'refcount_bits=\(1\|2\)[^0-9]' data_file
28
+ */
65
29
+ BDRV_REQ_NO_WAIT = 0x400,
66
echo
30
+
67
echo "creating image"
31
/* Mask of valid flags */
68
diff --git a/tests/qemu-iotests/014 b/tests/qemu-iotests/014
32
- BDRV_REQ_MASK = 0x3ff,
69
index XXXXXXX..XXXXXXX 100755
33
+ BDRV_REQ_MASK = 0x7ff,
70
--- a/tests/qemu-iotests/014
34
} BdrvRequestFlags;
71
+++ b/tests/qemu-iotests/014
35
72
@@ -XXX,XX +XXX,XX @@ trap "_cleanup; exit \$status" 0 1 2 3 15
36
typedef struct BlockSizes {
73
_supported_fmt qcow2
37
diff --git a/block/io.c b/block/io.c
74
_supported_proto file
38
index XXXXXXX..XXXXXXX 100644
75
_supported_os Linux
39
--- a/block/io.c
76
+# Compression and snapshots do not work with external data files
40
+++ b/block/io.c
77
+_unsupported_imgopts data_file
41
@@ -XXX,XX +XXX,XX @@ bdrv_co_write_req_prepare(BdrvChild *child, int64_t offset, uint64_t bytes,
78
42
assert(!(bs->open_flags & BDRV_O_INACTIVE));
79
TEST_OFFSETS="0 4294967296"
43
assert((bs->open_flags & BDRV_O_NO_IO) == 0);
80
TEST_OPS="writev read write readv"
44
assert(!(flags & ~BDRV_REQ_MASK));
81
diff --git a/tests/qemu-iotests/015 b/tests/qemu-iotests/015
45
+ assert(!((flags & BDRV_REQ_NO_WAIT) && !(flags & BDRV_REQ_SERIALISING)));
82
index XXXXXXX..XXXXXXX 100755
46
83
--- a/tests/qemu-iotests/015
47
if (flags & BDRV_REQ_SERIALISING) {
84
+++ b/tests/qemu-iotests/015
48
- bdrv_make_request_serialising(req, bdrv_get_cluster_size(bs));
85
@@ -XXX,XX +XXX,XX @@ trap "_cleanup; exit \$status" 0 1 2 3 15
49
+ QEMU_LOCK_GUARD(&bs->reqs_lock);
86
# actually any format that supports snapshots
50
+
87
_supported_fmt qcow2
51
+ tracked_request_set_serialising(req, bdrv_get_cluster_size(bs));
88
_supported_proto generic
52
+
89
-# Internal snapshots are (currently) impossible with refcount_bits=1
53
+ if ((flags & BDRV_REQ_NO_WAIT) && bdrv_find_conflicting_request(req)) {
90
-_unsupported_imgopts 'refcount_bits=1[^0-9]'
54
+ return -EBUSY;
91
+# Internal snapshots are (currently) impossible with refcount_bits=1,
55
+ }
92
+# and generally impossible with external data files
56
+
93
+_unsupported_imgopts 'refcount_bits=1[^0-9]' data_file
57
+ bdrv_wait_serialising_requests_locked(req);
94
58
} else {
95
echo
59
bdrv_wait_serialising_requests(req);
96
echo "creating image"
60
}
97
diff --git a/tests/qemu-iotests/026 b/tests/qemu-iotests/026
98
index XXXXXXX..XXXXXXX 100755
99
--- a/tests/qemu-iotests/026
100
+++ b/tests/qemu-iotests/026
101
@@ -XXX,XX +XXX,XX @@ _supported_cache_modes writethrough none
102
# 32 and 64 bits do not work either, however, due to different leaked cluster
103
# count on error.
104
# Thus, the only remaining option is refcount_bits=16.
105
-_unsupported_imgopts 'refcount_bits=\([^1]\|.\([^6]\|$\)\)'
106
+#
107
+# As for data_file, none of the refcount tests can work for it.
108
+_unsupported_imgopts 'refcount_bits=\([^1]\|.\([^6]\|$\)\)' \
109
+ data_file
110
111
echo "Errors while writing 128 kB"
112
echo
113
diff --git a/tests/qemu-iotests/029 b/tests/qemu-iotests/029
114
index XXXXXXX..XXXXXXX 100755
115
--- a/tests/qemu-iotests/029
116
+++ b/tests/qemu-iotests/029
117
@@ -XXX,XX +XXX,XX @@ trap "_cleanup; exit \$status" 0 1 2 3 15
118
_supported_fmt qcow2
119
_supported_proto generic
120
_unsupported_proto vxhs
121
-# Internal snapshots are (currently) impossible with refcount_bits=1
122
-_unsupported_imgopts 'refcount_bits=1[^0-9]'
123
+# Internal snapshots are (currently) impossible with refcount_bits=1,
124
+# and generally impossible with external data files
125
+_unsupported_imgopts 'refcount_bits=1[^0-9]' data_file
126
127
offset_size=24
128
offset_l1_size=36
129
diff --git a/tests/qemu-iotests/031 b/tests/qemu-iotests/031
130
index XXXXXXX..XXXXXXX 100755
131
--- a/tests/qemu-iotests/031
132
+++ b/tests/qemu-iotests/031
133
@@ -XXX,XX +XXX,XX @@ trap "_cleanup; exit \$status" 0 1 2 3 15
134
# This tests qcow2-specific low-level functionality
135
_supported_fmt qcow2
136
_supported_proto file
137
-# We want to test compat=0.10, which does not support refcount widths
138
-# other than 16
139
-_unsupported_imgopts 'refcount_bits=\([^1]\|.\([^6]\|$\)\)'
140
+# We want to test compat=0.10, which does not support external data
141
+# files or refcount widths other than 16
142
+_unsupported_imgopts data_file 'refcount_bits=\([^1]\|.\([^6]\|$\)\)'
143
144
CLUSTER_SIZE=65536
145
146
diff --git a/tests/qemu-iotests/036 b/tests/qemu-iotests/036
147
index XXXXXXX..XXXXXXX 100755
148
--- a/tests/qemu-iotests/036
149
+++ b/tests/qemu-iotests/036
150
@@ -XXX,XX +XXX,XX @@ trap "_cleanup; exit \$status" 0 1 2 3 15
151
# This tests qcow2-specific low-level functionality
152
_supported_fmt qcow2
153
_supported_proto file
154
-# Only qcow2v3 and later supports feature bits
155
-_unsupported_imgopts 'compat=0.10'
156
+# Only qcow2v3 and later supports feature bits;
157
+# qcow2.py does not support external data files
158
+_unsupported_imgopts 'compat=0.10' data_file
159
160
echo
161
echo === Image with unknown incompatible feature bit ===
162
diff --git a/tests/qemu-iotests/039 b/tests/qemu-iotests/039
163
index XXXXXXX..XXXXXXX 100755
164
--- a/tests/qemu-iotests/039
165
+++ b/tests/qemu-iotests/039
166
@@ -XXX,XX +XXX,XX @@ _supported_proto file
167
_supported_os Linux
168
_default_cache_mode writethrough
169
_supported_cache_modes writethrough
170
+# Some of these test cases expect no external data file so that all
171
+# clusters are part of the qcow2 image and refcounted
172
+_unsupported_imgopts data_file
173
174
size=128M
175
176
diff --git a/tests/qemu-iotests/046 b/tests/qemu-iotests/046
177
index XXXXXXX..XXXXXXX 100755
178
--- a/tests/qemu-iotests/046
179
+++ b/tests/qemu-iotests/046
180
@@ -XXX,XX +XXX,XX @@ trap "_cleanup; exit \$status" 0 1 2 3 15
181
182
_supported_fmt qcow2
183
_supported_proto file
184
+# data_file does not support compressed clusters
185
+_unsupported_imgopts data_file
186
187
CLUSTER_SIZE=64k
188
size=128M
189
diff --git a/tests/qemu-iotests/048 b/tests/qemu-iotests/048
190
index XXXXXXX..XXXXXXX 100755
191
--- a/tests/qemu-iotests/048
192
+++ b/tests/qemu-iotests/048
193
@@ -XXX,XX +XXX,XX @@ _compare()
194
_supported_fmt raw qcow2 qed luks
195
_supported_proto file
196
_supported_os Linux
197
+# Using 'cp' is incompatible with external data files
198
+_unsupported_imgopts data_file
199
200
# Remove once all tests are fixed to use TEST_IMG_FILE
201
# correctly and common.rc sets it unconditionally
202
diff --git a/tests/qemu-iotests/051 b/tests/qemu-iotests/051
203
index XXXXXXX..XXXXXXX 100755
204
--- a/tests/qemu-iotests/051
205
+++ b/tests/qemu-iotests/051
206
@@ -XXX,XX +XXX,XX @@ trap "_cleanup; exit \$status" 0 1 2 3 15
207
_supported_fmt qcow2
208
_supported_proto file
209
# A compat=0.10 image is created in this test which does not support anything
210
-# other than refcount_bits=16
211
-_unsupported_imgopts 'refcount_bits=\([^1]\|.\([^6]\|$\)\)'
212
+# other than refcount_bits=16;
213
+# it also will not support an external data file
214
+_unsupported_imgopts 'refcount_bits=\([^1]\|.\([^6]\|$\)\)' data_file
215
_require_drivers nbd
216
217
do_run_qemu()
218
diff --git a/tests/qemu-iotests/058 b/tests/qemu-iotests/058
219
index XXXXXXX..XXXXXXX 100755
220
--- a/tests/qemu-iotests/058
221
+++ b/tests/qemu-iotests/058
222
@@ -XXX,XX +XXX,XX @@ _supported_fmt qcow2
223
_supported_proto file
224
_supported_os Linux
225
_require_command QEMU_NBD
226
-# Internal snapshots are (currently) impossible with refcount_bits=1
227
-_unsupported_imgopts 'refcount_bits=1[^0-9]'
228
+# Internal snapshots are (currently) impossible with refcount_bits=1,
229
+# and generally impossible with external data files
230
+_unsupported_imgopts 'refcount_bits=1[^0-9]' data_file
231
232
nbd_snapshot_img="nbd:unix:$nbd_unix_socket"
233
234
diff --git a/tests/qemu-iotests/060 b/tests/qemu-iotests/060
235
index XXXXXXX..XXXXXXX 100755
236
--- a/tests/qemu-iotests/060
237
+++ b/tests/qemu-iotests/060
238
@@ -XXX,XX +XXX,XX @@ _filter_io_error()
239
_supported_fmt qcow2
240
_supported_proto file
241
_supported_os Linux
242
-# These tests only work for compat=1.1 images with refcount_bits=16
243
-_unsupported_imgopts 'compat=0.10' 'refcount_bits=\([^1]\|.\([^6]\|$\)\)'
244
+# These tests only work for compat=1.1 images without an external
245
+# data file with refcount_bits=16
246
+_unsupported_imgopts 'compat=0.10' data_file \
247
+ 'refcount_bits=\([^1]\|.\([^6]\|$\)\)'
248
249
# The repair process will create a large file - so check for availability first
250
_require_large_file 64G
251
diff --git a/tests/qemu-iotests/061 b/tests/qemu-iotests/061
252
index XXXXXXX..XXXXXXX 100755
253
--- a/tests/qemu-iotests/061
254
+++ b/tests/qemu-iotests/061
255
@@ -XXX,XX +XXX,XX @@ _supported_fmt qcow2
256
_supported_proto file
257
_supported_os Linux
258
# Conversion between different compat versions can only really work
259
-# with refcount_bits=16
260
-_unsupported_imgopts 'refcount_bits=\([^1]\|.\([^6]\|$\)\)'
261
+# with refcount_bits=16;
262
+# we have explicit tests for data_file here, but the whole test does
263
+# not work with it
264
+_unsupported_imgopts 'refcount_bits=\([^1]\|.\([^6]\|$\)\)' data_file
265
266
echo
267
echo "=== Testing version downgrade with zero expansion ==="
268
diff --git a/tests/qemu-iotests/062 b/tests/qemu-iotests/062
269
index XXXXXXX..XXXXXXX 100755
270
--- a/tests/qemu-iotests/062
271
+++ b/tests/qemu-iotests/062
272
@@ -XXX,XX +XXX,XX @@ trap "_cleanup; exit \$status" 0 1 2 3 15
273
_supported_fmt qcow2
274
_supported_proto generic
275
# We need zero clusters and snapshots
276
-_unsupported_imgopts 'compat=0.10' 'refcount_bits=1[^0-9]'
277
+_unsupported_imgopts 'compat=0.10' 'refcount_bits=1[^0-9]' data_file
278
279
IMG_SIZE=64M
280
281
diff --git a/tests/qemu-iotests/066 b/tests/qemu-iotests/066
282
index XXXXXXX..XXXXXXX 100755
283
--- a/tests/qemu-iotests/066
284
+++ b/tests/qemu-iotests/066
285
@@ -XXX,XX +XXX,XX @@ trap "_cleanup; exit \$status" 0 1 2 3 15
286
_supported_fmt qcow2
287
_supported_proto generic
288
# We need zero clusters and snapshots
289
-_unsupported_imgopts 'compat=0.10' 'refcount_bits=1[^0-9]'
290
+# (TODO: Consider splitting the snapshot part into a separate test
291
+# file, so this one runs with refcount_bits=1 and data_file)
292
+_unsupported_imgopts 'compat=0.10' 'refcount_bits=1[^0-9]' data_file
293
294
# Intentionally create an unaligned image
295
IMG_SIZE=$((64 * 1024 * 1024 + 512))
296
diff --git a/tests/qemu-iotests/067 b/tests/qemu-iotests/067
297
index XXXXXXX..XXXXXXX 100755
298
--- a/tests/qemu-iotests/067
299
+++ b/tests/qemu-iotests/067
300
@@ -XXX,XX +XXX,XX @@ status=1    # failure is the default!
301
302
_supported_fmt qcow2
303
_supported_proto file
304
-# Because anything other than 16 would change the output of query-block
305
-_unsupported_imgopts 'refcount_bits=\([^1]\|.\([^6]\|$\)\)'
306
+# Because anything other than 16 would change the output of query-block,
307
+# and external data files would change the output of
308
+# query-named-block-nodes
309
+_unsupported_imgopts 'refcount_bits=\([^1]\|.\([^6]\|$\)\)' data_file
310
311
do_run_qemu()
312
{
313
diff --git a/tests/qemu-iotests/068 b/tests/qemu-iotests/068
314
index XXXXXXX..XXXXXXX 100755
315
--- a/tests/qemu-iotests/068
316
+++ b/tests/qemu-iotests/068
317
@@ -XXX,XX +XXX,XX @@ trap "_cleanup; exit \$status" 0 1 2 3 15
318
# This tests qcow2-specific low-level functionality
319
_supported_fmt qcow2
320
_supported_proto generic
321
-# Internal snapshots are (currently) impossible with refcount_bits=1
322
-_unsupported_imgopts 'compat=0.10' 'refcount_bits=1[^0-9]'
323
+# Internal snapshots are (currently) impossible with refcount_bits=1,
324
+# and generally impossible with external data files
325
+_unsupported_imgopts 'compat=0.10' 'refcount_bits=1[^0-9]' data_file
326
327
IMG_SIZE=128K
328
329
diff --git a/tests/qemu-iotests/071 b/tests/qemu-iotests/071
330
index XXXXXXX..XXXXXXX 100755
331
--- a/tests/qemu-iotests/071
332
+++ b/tests/qemu-iotests/071
333
@@ -XXX,XX +XXX,XX @@ trap "_cleanup; exit \$status" 0 1 2 3 15
334
_supported_fmt qcow2
335
_supported_proto file
336
_require_drivers blkdebug blkverify
337
+# blkdebug can only inject errors on bs->file, not on the data_file,
338
+# so thie test does not work with external data files
339
+_unsupported_imgopts data_file
340
341
do_run_qemu()
342
{
343
diff --git a/tests/qemu-iotests/073 b/tests/qemu-iotests/073
344
index XXXXXXX..XXXXXXX 100755
345
--- a/tests/qemu-iotests/073
346
+++ b/tests/qemu-iotests/073
347
@@ -XXX,XX +XXX,XX @@ trap "_cleanup; exit \$status" 0 1 2 3 15
348
_supported_fmt qcow2
349
_supported_proto generic
350
_unsupported_proto vxhs
351
+# External data files do not support compressed clusters
352
+# (TODO: Consider writing a version for external data files that does
353
+# not test compressed clusters)
354
+_unsupported_imgopts data_file
355
356
CLUSTER_SIZE=64k
357
size=128M
358
diff --git a/tests/qemu-iotests/074 b/tests/qemu-iotests/074
359
index XXXXXXX..XXXXXXX 100755
360
--- a/tests/qemu-iotests/074
361
+++ b/tests/qemu-iotests/074
362
@@ -XXX,XX +XXX,XX @@ _compare()
363
_supported_fmt qcow2
364
_supported_proto file
365
_supported_os Linux
366
+# blkdebug can only inject errors on bs->file
367
+_unsupported_imgopts data_file
368
369
# Setup test basic parameters
370
TEST_IMG2=$TEST_IMG.2
371
diff --git a/tests/qemu-iotests/080 b/tests/qemu-iotests/080
372
index XXXXXXX..XXXXXXX 100755
373
--- a/tests/qemu-iotests/080
374
+++ b/tests/qemu-iotests/080
375
@@ -XXX,XX +XXX,XX @@ trap "_cleanup; exit \$status" 0 1 2 3 15
376
_supported_fmt qcow2
377
_supported_proto file
378
_supported_os Linux
379
-# - Internal snapshots are (currently) impossible with refcount_bits=1
380
+# - Internal snapshots are (currently) impossible with refcount_bits=1,
381
+# and generally impossible with external data files
382
# - This is generally a test for compat=1.1 images
383
-_unsupported_imgopts 'refcount_bits=1[^0-9]' 'compat=0.10'
384
+_unsupported_imgopts 'refcount_bits=1[^0-9]' data_file 'compat=0.10'
385
386
header_size=104
387
388
diff --git a/tests/qemu-iotests/090 b/tests/qemu-iotests/090
389
index XXXXXXX..XXXXXXX 100755
390
--- a/tests/qemu-iotests/090
391
+++ b/tests/qemu-iotests/090
392
@@ -XXX,XX +XXX,XX @@ trap "_cleanup; exit \$status" 0 1 2 3 15
393
394
_supported_fmt qcow2
395
_supported_proto file nfs
396
+# External data files do not support compressed clusters
397
+_unsupported_imgopts data_file
398
399
IMG_SIZE=128K
400
401
diff --git a/tests/qemu-iotests/098 b/tests/qemu-iotests/098
402
index XXXXXXX..XXXXXXX 100755
403
--- a/tests/qemu-iotests/098
404
+++ b/tests/qemu-iotests/098
405
@@ -XXX,XX +XXX,XX @@ trap "_cleanup; exit \$status" 0 1 2 3 15
406
407
_supported_fmt qcow2
408
_supported_proto file
409
-# The code path we want to test here only works for compat=1.1 images
410
-_unsupported_imgopts 'compat=0.10'
411
+# The code path we want to test here only works for compat=1.1 images;
412
+# blkdebug can only inject errors on bs->file, so external data files
413
+# do not work with this test
414
+_unsupported_imgopts 'compat=0.10' data_file
415
416
for event in l1_update empty_image_prepare reftable_update refblock_alloc; do
417
418
diff --git a/tests/qemu-iotests/099 b/tests/qemu-iotests/099
419
index XXXXXXX..XXXXXXX 100755
420
--- a/tests/qemu-iotests/099
421
+++ b/tests/qemu-iotests/099
422
@@ -XXX,XX +XXX,XX @@ _supported_fmt qcow qcow2 qed vdi vhdx vmdk vpc
423
_supported_proto file
424
_supported_os Linux
425
_require_drivers blkdebug blkverify
426
+# data_file would change the json:{} filenames
427
_unsupported_imgopts "subformat=monolithicFlat" "subformat=twoGbMaxExtentFlat" \
428
- "subformat=twoGbMaxExtentSparse"
429
+ "subformat=twoGbMaxExtentSparse" data_file
430
431
do_run_qemu()
432
{
433
diff --git a/tests/qemu-iotests/103 b/tests/qemu-iotests/103
434
index XXXXXXX..XXXXXXX 100755
435
--- a/tests/qemu-iotests/103
436
+++ b/tests/qemu-iotests/103
437
@@ -XXX,XX +XXX,XX @@ trap "_cleanup; exit \$status" 0 1 2 3 15
438
439
_supported_fmt qcow2
440
_supported_proto file nfs
441
-# Internal snapshots are (currently) impossible with refcount_bits=1
442
-_unsupported_imgopts 'refcount_bits=1[^0-9]'
443
+# Internal snapshots are (currently) impossible with refcount_bits=1,
444
+# and generally impossible with external data files
445
+_unsupported_imgopts 'refcount_bits=1[^0-9]' data_file
446
447
IMG_SIZE=64K
448
449
diff --git a/tests/qemu-iotests/108 b/tests/qemu-iotests/108
450
index XXXXXXX..XXXXXXX 100755
451
--- a/tests/qemu-iotests/108
452
+++ b/tests/qemu-iotests/108
453
@@ -XXX,XX +XXX,XX @@ trap "_cleanup; exit \$status" 0 1 2 3 15
454
_supported_fmt qcow2
455
_supported_proto file
456
_supported_os Linux
457
-# This test directly modifies a refblock so it relies on refcount_bits being 16
458
-_unsupported_imgopts 'refcount_bits=\([^1]\|.\([^6]\|$\)\)'
459
+# This test directly modifies a refblock so it relies on refcount_bits being 16;
460
+# and the low-level modification it performs are not tuned for external data
461
+# files
462
+_unsupported_imgopts 'refcount_bits=\([^1]\|.\([^6]\|$\)\)' data_file
463
464
echo
465
echo '=== Repairing an image without any refcount table ==='
466
diff --git a/tests/qemu-iotests/112 b/tests/qemu-iotests/112
467
index XXXXXXX..XXXXXXX 100755
468
--- a/tests/qemu-iotests/112
469
+++ b/tests/qemu-iotests/112
470
@@ -XXX,XX +XXX,XX @@ trap "_cleanup; exit \$status" 0 1 2 3 15
471
_supported_fmt qcow2
472
_supported_proto file
473
# This test will set refcount_bits on its own which would conflict with the
474
-# manual setting; compat will be overridden as well
475
-_unsupported_imgopts refcount_bits 'compat=0.10'
476
+# manual setting; compat will be overridden as well;
477
+# and external data files do not work well with our refcount testing
478
+_unsupported_imgopts refcount_bits 'compat=0.10' data_file
479
480
print_refcount_bits()
481
{
482
diff --git a/tests/qemu-iotests/114 b/tests/qemu-iotests/114
483
index XXXXXXX..XXXXXXX 100755
484
--- a/tests/qemu-iotests/114
485
+++ b/tests/qemu-iotests/114
486
@@ -XXX,XX +XXX,XX @@ trap "_cleanup; exit \$status" 0 1 2 3 15
487
_supported_fmt qcow2
488
_supported_proto generic
489
_unsupported_proto vxhs
490
+# qcow2.py does not work too well with external data files
491
+_unsupported_imgopts data_file
492
493
494
TEST_IMG="$TEST_IMG.base" _make_test_img 64M
495
diff --git a/tests/qemu-iotests/121 b/tests/qemu-iotests/121
496
index XXXXXXX..XXXXXXX 100755
497
--- a/tests/qemu-iotests/121
498
+++ b/tests/qemu-iotests/121
499
@@ -XXX,XX +XXX,XX @@ trap "_cleanup; exit \$status" 0 1 2 3 15
500
_supported_fmt qcow2
501
_supported_proto file
502
_supported_os Linux
503
+# Refcount structures are used much differently with external data
504
+# files
505
+_unsupported_imgopts data_file
506
507
echo
508
echo '=== New refcount structures may not conflict with existing structures ==='
509
diff --git a/tests/qemu-iotests/138 b/tests/qemu-iotests/138
510
index XXXXXXX..XXXXXXX 100755
511
--- a/tests/qemu-iotests/138
512
+++ b/tests/qemu-iotests/138
513
@@ -XXX,XX +XXX,XX @@ trap "_cleanup; exit \$status" 0 1 2 3 15
514
_supported_fmt qcow2
515
_supported_proto file
516
_supported_os Linux
517
+# With an external data file, data clusters are not refcounted
518
+# (and so qemu-img check does not check their refcount)
519
+_unsupported_imgopts data_file
520
521
echo
522
echo '=== Check on an image with a multiple of 2^32 clusters ==='
523
diff --git a/tests/qemu-iotests/156 b/tests/qemu-iotests/156
524
index XXXXXXX..XXXXXXX 100755
525
--- a/tests/qemu-iotests/156
526
+++ b/tests/qemu-iotests/156
527
@@ -XXX,XX +XXX,XX @@ trap "_cleanup; exit \$status" 0 1 2 3 15
528
_supported_fmt qcow2 qed
529
_supported_proto generic
530
_unsupported_proto vxhs
531
+# Copying files around with cp does not work with external data files
532
+_unsupported_imgopts data_file
533
534
# Create source disk
535
TEST_IMG="$TEST_IMG.backing" _make_test_img 1M
536
diff --git a/tests/qemu-iotests/176 b/tests/qemu-iotests/176
537
index XXXXXXX..XXXXXXX 100755
538
--- a/tests/qemu-iotests/176
539
+++ b/tests/qemu-iotests/176
540
@@ -XXX,XX +XXX,XX @@ trap "_cleanup; exit \$status" 0 1 2 3 15
541
_supported_fmt qcow2
542
_supported_proto file
543
_supported_os Linux
544
-# Persistent dirty bitmaps require compat=1.1
545
-_unsupported_imgopts 'compat=0.10'
546
+# Persistent dirty bitmaps require compat=1.1;
547
+# Internal snapshots forbid using an external data file
548
+# (they work with refcount_bits=1 here, though, because there actually
549
+# is no data when creating the snapshot)
550
+_unsupported_imgopts 'compat=0.10' data_file
551
552
run_qemu()
553
{
554
diff --git a/tests/qemu-iotests/191 b/tests/qemu-iotests/191
555
index XXXXXXX..XXXXXXX 100755
556
--- a/tests/qemu-iotests/191
557
+++ b/tests/qemu-iotests/191
558
@@ -XXX,XX +XXX,XX @@ trap "_cleanup; exit \$status" 0 1 2 3 15
559
560
_supported_fmt qcow2
561
_supported_proto file
562
+# An external data file would change the query-named-block-nodes output
563
+_unsupported_imgopts data_file
564
565
size=64M
566
567
diff --git a/tests/qemu-iotests/201 b/tests/qemu-iotests/201
568
index XXXXXXX..XXXXXXX 100755
569
--- a/tests/qemu-iotests/201
570
+++ b/tests/qemu-iotests/201
571
@@ -XXX,XX +XXX,XX @@ _supported_fmt qcow2
572
_supported_proto generic
573
_supported_os Linux
574
575
-# Internal snapshots are (currently) impossible with refcount_bits=1
576
-# This was taken from test 080
577
-_unsupported_imgopts 'refcount_bits=1[^0-9]'
578
+# Internal snapshots are (currently) impossible with refcount_bits=1,
579
+# and generally impossible with external data files
580
+_unsupported_imgopts 'refcount_bits=1[^0-9]' data_file
581
582
size=64M
583
_make_test_img $size
584
diff --git a/tests/qemu-iotests/214 b/tests/qemu-iotests/214
585
index XXXXXXX..XXXXXXX 100755
586
--- a/tests/qemu-iotests/214
587
+++ b/tests/qemu-iotests/214
588
@@ -XXX,XX +XXX,XX @@ _supported_proto file
589
590
# Repairing the corrupted image requires qemu-img check to store a
591
# refcount up to 3, which requires at least two refcount bits.
592
-_unsupported_imgopts 'refcount_bits=1[^0-9]'
593
+# External data files do not support compressed clusters.
594
+_unsupported_imgopts 'refcount_bits=1[^0-9]' data_file
595
596
597
echo
598
diff --git a/tests/qemu-iotests/217 b/tests/qemu-iotests/217
599
index XXXXXXX..XXXXXXX 100755
600
--- a/tests/qemu-iotests/217
601
+++ b/tests/qemu-iotests/217
602
@@ -XXX,XX +XXX,XX @@ _supported_proto file
603
604
# This test needs clusters with at least a refcount of 2 so that
605
# OFLAG_COPIED is not set. refcount_bits=1 is therefore unsupported.
606
-_unsupported_imgopts 'refcount_bits=1[^0-9]'
607
+# (As are external data files.)
608
+_unsupported_imgopts 'refcount_bits=1[^0-9]' data_file
609
610
echo
611
echo '=== Simulating an I/O error during snapshot deletion ==='
612
diff --git a/tests/qemu-iotests/220 b/tests/qemu-iotests/220
613
index XXXXXXX..XXXXXXX 100755
614
--- a/tests/qemu-iotests/220
615
+++ b/tests/qemu-iotests/220
616
@@ -XXX,XX +XXX,XX @@ trap "_cleanup; exit \$status" 0 1 2 3 15
617
_supported_fmt qcow2
618
_supported_proto file
619
_supported_os Linux
620
-# To use a different refcount width but 16 bits we need compat=1.1
621
-_unsupported_imgopts 'compat=0.10'
622
+# To use a different refcount width but 16 bits we need compat=1.1,
623
+# and external data files do not support compressed clusters.
624
+_unsupported_imgopts 'compat=0.10' data_file
625
626
echo "== Creating huge file =="
627
628
diff --git a/tests/qemu-iotests/243 b/tests/qemu-iotests/243
629
index XXXXXXX..XXXXXXX 100755
630
--- a/tests/qemu-iotests/243
631
+++ b/tests/qemu-iotests/243
632
@@ -XXX,XX +XXX,XX @@ trap "_cleanup; exit \$status" 0 1 2 3 15
633
_supported_fmt qcow2
634
_supported_proto file
635
_supported_os Linux
636
-# External data files do not work with compat=0.10
637
-_unsupported_imgopts 'compat=0.10'
638
+# External data files do not work with compat=0.10, and because there
639
+# is an explicit case for external data files here, we cannot allow
640
+# the user to specify whether to use one
641
+_unsupported_imgopts 'compat=0.10' data_file
642
643
for mode in off metadata falloc full; do
644
645
diff --git a/tests/qemu-iotests/244 b/tests/qemu-iotests/244
646
index XXXXXXX..XXXXXXX 100755
647
--- a/tests/qemu-iotests/244
648
+++ b/tests/qemu-iotests/244
649
@@ -XXX,XX +XXX,XX @@ trap "_cleanup; exit \$status" 0 1 2 3 15
650
_supported_fmt qcow2
651
_supported_proto file
652
_supported_os Linux
653
-# External data files do not work with compat=0.10
654
-_unsupported_imgopts 'compat=0.10'
655
+# External data files do not work with compat=0.10, and because we use
656
+# our own external data file, we cannot let the user specify one
657
+_unsupported_imgopts 'compat=0.10' data_file
658
659
echo
660
echo "=== Create and open image with external data file ==="
661
diff --git a/tests/qemu-iotests/250 b/tests/qemu-iotests/250
662
index XXXXXXX..XXXXXXX 100755
663
--- a/tests/qemu-iotests/250
664
+++ b/tests/qemu-iotests/250
665
@@ -XXX,XX +XXX,XX @@ trap "_cleanup; exit \$status" 0 1 2 3 15
666
_supported_fmt qcow2
667
_supported_proto file
668
_supported_os Linux
669
+# This test does not make much sense with external data files
670
+_unsupported_imgopts data_file
671
672
# This test checks that qcow2_process_discards does not truncate a discard
673
# request > 2G.
674
diff --git a/tests/qemu-iotests/261 b/tests/qemu-iotests/261
675
index XXXXXXX..XXXXXXX 100755
676
--- a/tests/qemu-iotests/261
677
+++ b/tests/qemu-iotests/261
678
@@ -XXX,XX +XXX,XX @@ _supported_os Linux
679
# (1) We create a v2 image that supports nothing but refcount_bits=16
680
# (2) We do some refcount management on our own which expects
681
# refcount_bits=16
682
-_unsupported_imgopts 'refcount_bits=\([^1]\|.\([^6]\|$\)\)'
683
+# As for data files, they do not support snapshots at all.
684
+_unsupported_imgopts 'refcount_bits=\([^1]\|.\([^6]\|$\)\)' data_file
685
686
# Parameters:
687
# $1: image filename
688
diff --git a/tests/qemu-iotests/267 b/tests/qemu-iotests/267
689
index XXXXXXX..XXXXXXX 100755
690
--- a/tests/qemu-iotests/267
691
+++ b/tests/qemu-iotests/267
692
@@ -XXX,XX +XXX,XX @@ _supported_proto file
693
_supported_os Linux
694
_require_drivers copy-on-read
695
696
-# Internal snapshots are (currently) impossible with refcount_bits=1
697
-_unsupported_imgopts 'refcount_bits=1[^0-9]'
698
+# Internal snapshots are (currently) impossible with refcount_bits=1,
699
+# and generally impossible with external data files
700
+_unsupported_imgopts 'refcount_bits=1[^0-9]' data_file
701
702
do_run_qemu()
703
{
704
diff --git a/tests/qemu-iotests/273 b/tests/qemu-iotests/273
705
index XXXXXXX..XXXXXXX 100755
706
--- a/tests/qemu-iotests/273
707
+++ b/tests/qemu-iotests/273
708
@@ -XXX,XX +XXX,XX @@ trap "_cleanup; exit \$status" 0 1 2 3 15
709
_supported_fmt qcow2
710
_supported_proto file
711
_supported_os Linux
712
+# External data files would add nodes to the block graph, so it would
713
+# not match the reference output
714
+_unsupported_imgopts data_file
715
716
do_run_qemu()
717
{
718
--
61
--
719
2.24.1
62
2.29.2
720
63
721
64
diff view generated by jsdifflib
1
We can save some LoC in xdbg_graph_add_edge() by using
1
From: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
2
bdrv_qapi_perm_to_blk_perm().
3
2
4
Signed-off-by: Max Reitz <mreitz@redhat.com>
3
Do generic processing even for drivers which define .bdrv_check_perm
5
Message-id: 20191108123455.39445-3-mreitz@redhat.com
4
handler. It's needed for further preallocate filter: it will need to do
6
Reviewed-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
5
additional action on bdrv_check_perm, but don't want to reimplement
6
generic logic.
7
8
The patch doesn't change existing behaviour: the only driver that
9
implements bdrv_check_perm is file-posix, but it never has any
10
children.
11
12
Also, bdrv_set_perm() don't stop processing if driver has
13
.bdrv_set_perm handler as well.
14
15
Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
16
Message-Id: <20201021145859.11201-8-vsementsov@virtuozzo.com>
17
Reviewed-by: Max Reitz <mreitz@redhat.com>
7
Signed-off-by: Max Reitz <mreitz@redhat.com>
18
Signed-off-by: Max Reitz <mreitz@redhat.com>
8
---
19
---
9
block.c | 29 ++++++++---------------------
20
block.c | 7 +++++--
10
1 file changed, 8 insertions(+), 21 deletions(-)
21
1 file changed, 5 insertions(+), 2 deletions(-)
11
22
12
diff --git a/block.c b/block.c
23
diff --git a/block.c b/block.c
13
index XXXXXXX..XXXXXXX 100644
24
index XXXXXXX..XXXXXXX 100644
14
--- a/block.c
25
--- a/block.c
15
+++ b/block.c
26
+++ b/block.c
16
@@ -XXX,XX +XXX,XX @@ static void xdbg_graph_add_node(XDbgBlockGraphConstructor *gr, void *node,
27
@@ -XXX,XX +XXX,XX @@ static int bdrv_check_perm(BlockDriverState *bs, BlockReopenQueue *q,
17
static void xdbg_graph_add_edge(XDbgBlockGraphConstructor *gr, void *parent,
18
const BdrvChild *child)
19
{
20
- typedef struct {
21
- unsigned int flag;
22
- BlockPermission num;
23
- } PermissionMap;
24
-
25
- static const PermissionMap permissions[] = {
26
- { BLK_PERM_CONSISTENT_READ, BLOCK_PERMISSION_CONSISTENT_READ },
27
- { BLK_PERM_WRITE, BLOCK_PERMISSION_WRITE },
28
- { BLK_PERM_WRITE_UNCHANGED, BLOCK_PERMISSION_WRITE_UNCHANGED },
29
- { BLK_PERM_RESIZE, BLOCK_PERMISSION_RESIZE },
30
- { BLK_PERM_GRAPH_MOD, BLOCK_PERMISSION_GRAPH_MOD },
31
- { 0, 0 }
32
- };
33
- const PermissionMap *p;
34
+ BlockPermission qapi_perm;
35
XDbgBlockGraphEdge *edge;
36
37
- QEMU_BUILD_BUG_ON(1UL << (ARRAY_SIZE(permissions) - 1) != BLK_PERM_ALL + 1);
38
-
39
edge = g_new0(XDbgBlockGraphEdge, 1);
40
41
edge->parent = xdbg_graph_node_num(gr, parent);
42
edge->child = xdbg_graph_node_num(gr, child->bs);
43
edge->name = g_strdup(child->name);
44
45
- for (p = permissions; p->flag; p++) {
46
- if (p->flag & child->perm) {
47
- QAPI_LIST_ADD(edge->perm, p->num);
48
+ for (qapi_perm = 0; qapi_perm < BLOCK_PERMISSION__MAX; qapi_perm++) {
49
+ uint64_t flag = bdrv_qapi_perm_to_blk_perm(qapi_perm);
50
+
51
+ if (flag & child->perm) {
52
+ QAPI_LIST_ADD(edge->perm, qapi_perm);
53
}
54
- if (p->flag & child->shared_perm) {
55
- QAPI_LIST_ADD(edge->shared_perm, p->num);
56
+ if (flag & child->shared_perm) {
57
+ QAPI_LIST_ADD(edge->shared_perm, qapi_perm);
58
}
59
}
28
}
60
29
30
if (drv->bdrv_check_perm) {
31
- return drv->bdrv_check_perm(bs, cumulative_perms,
32
- cumulative_shared_perms, errp);
33
+ ret = drv->bdrv_check_perm(bs, cumulative_perms,
34
+ cumulative_shared_perms, errp);
35
+ if (ret < 0) {
36
+ return ret;
37
+ }
38
}
39
40
/* Drivers that never have children can omit .bdrv_child_perm() */
61
--
41
--
62
2.24.1
42
2.29.2
63
43
64
44
diff view generated by jsdifflib
1
We do not care about the json:{} filenames here, so we can just filter
1
From: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
2
them out and thus make the test work both with and without external data
3
files.
4
2
5
Signed-off-by: Max Reitz <mreitz@redhat.com>
3
It's intended to be inserted between format and protocol nodes to
6
Reviewed-by: Maxim Levitsky <mlevitsk@redhat.com>
4
preallocate additional space (expanding protocol file) on writes
7
Message-id: 20191107163708.833192-21-mreitz@redhat.com
5
crossing EOF. It improves performance for file-systems with slow
6
allocation.
7
8
Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
9
Message-Id: <20201021145859.11201-9-vsementsov@virtuozzo.com>
10
Reviewed-by: Max Reitz <mreitz@redhat.com>
11
[mreitz: Two comment fixes, and bumped the version from 5.2 to 6.0]
8
Signed-off-by: Max Reitz <mreitz@redhat.com>
12
Signed-off-by: Max Reitz <mreitz@redhat.com>
9
---
13
---
10
tests/qemu-iotests/198 | 6 ++++--
14
docs/system/qemu-block-drivers.rst.inc | 26 ++
11
tests/qemu-iotests/198.out | 4 ++--
15
qapi/block-core.json | 20 +-
12
2 files changed, 6 insertions(+), 4 deletions(-)
16
block/preallocate.c | 559 +++++++++++++++++++++++++
17
block/meson.build | 1 +
18
4 files changed, 605 insertions(+), 1 deletion(-)
19
create mode 100644 block/preallocate.c
13
20
14
diff --git a/tests/qemu-iotests/198 b/tests/qemu-iotests/198
21
diff --git a/docs/system/qemu-block-drivers.rst.inc b/docs/system/qemu-block-drivers.rst.inc
15
index XXXXXXX..XXXXXXX 100755
16
--- a/tests/qemu-iotests/198
17
+++ b/tests/qemu-iotests/198
18
@@ -XXX,XX +XXX,XX @@ echo
19
echo "== checking image base =="
20
$QEMU_IMG info --image-opts $IMGSPECBASE | _filter_img_info --format-specific \
21
| sed -e "/^disk size:/ D" -e '/refcount bits:/ D' -e '/compat:/ D' \
22
- -e '/lazy refcounts:/ D' -e '/corrupt:/ D'
23
+ -e '/lazy refcounts:/ D' -e '/corrupt:/ D' -e '/^\s*data file/ D' \
24
+ | _filter_json_filename
25
26
echo
27
echo "== checking image layer =="
28
$QEMU_IMG info --image-opts $IMGSPECLAYER | _filter_img_info --format-specific \
29
| sed -e "/^disk size:/ D" -e '/refcount bits:/ D' -e '/compat:/ D' \
30
- -e '/lazy refcounts:/ D' -e '/corrupt:/ D'
31
+ -e '/lazy refcounts:/ D' -e '/corrupt:/ D' -e '/^\s*data file/ D' \
32
+ | _filter_json_filename
33
34
35
# success, all done
36
diff --git a/tests/qemu-iotests/198.out b/tests/qemu-iotests/198.out
37
index XXXXXXX..XXXXXXX 100644
22
index XXXXXXX..XXXXXXX 100644
38
--- a/tests/qemu-iotests/198.out
23
--- a/docs/system/qemu-block-drivers.rst.inc
39
+++ b/tests/qemu-iotests/198.out
24
+++ b/docs/system/qemu-block-drivers.rst.inc
40
@@ -XXX,XX +XXX,XX @@ read 16777216/16777216 bytes at offset 0
25
@@ -XXX,XX +XXX,XX @@ on host and see if there are locks held by the QEMU process on the image file.
41
16 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
26
More than one byte could be locked by the QEMU instance, each byte of which
42
27
reflects a particular permission that is acquired or protected by the running
43
== checking image base ==
28
block driver.
44
-image: json:{"encrypt.key-secret": "sec0", "driver": "IMGFMT", "file": {"driver": "file", "filename": "TEST_DIR/t.IMGFMT.base"}}
29
+
45
+image: json:{ /* filtered */ }
30
+Filter drivers
46
file format: IMGFMT
31
+~~~~~~~~~~~~~~
47
virtual size: 16 MiB (16777216 bytes)
32
+
48
Format specific information:
33
+QEMU supports several filter drivers, which don't store any data, but perform
49
@@ -XXX,XX +XXX,XX @@ Format specific information:
34
+some additional tasks, hooking io requests.
50
master key iters: 1024
35
+
51
36
+.. program:: filter-drivers
52
== checking image layer ==
37
+.. option:: preallocate
53
-image: json:{"encrypt.key-secret": "sec1", "driver": "IMGFMT", "file": {"driver": "file", "filename": "TEST_DIR/t.IMGFMT"}}
38
+
54
+image: json:{ /* filtered */ }
39
+ The preallocate filter driver is intended to be inserted between format
55
file format: IMGFMT
40
+ and protocol nodes and preallocates some additional space
56
virtual size: 16 MiB (16777216 bytes)
41
+ (expanding the protocol file) when writing past the file’s end. This can be
57
backing file: TEST_DIR/t.IMGFMT.base
42
+ useful for file-systems with slow allocation.
43
+
44
+ Supported options:
45
+
46
+ .. program:: preallocate
47
+ .. option:: prealloc-align
48
+
49
+ On preallocation, align the file length to this value (in bytes), default 1M.
50
+
51
+ .. program:: preallocate
52
+ .. option:: prealloc-size
53
+
54
+ How much to preallocate (in bytes), default 128M.
55
diff --git a/qapi/block-core.json b/qapi/block-core.json
56
index XXXXXXX..XXXXXXX 100644
57
--- a/qapi/block-core.json
58
+++ b/qapi/block-core.json
59
@@ -XXX,XX +XXX,XX @@
60
'cloop', 'compress', 'copy-on-read', 'dmg', 'file', 'ftp', 'ftps',
61
'gluster', 'host_cdrom', 'host_device', 'http', 'https', 'iscsi',
62
'luks', 'nbd', 'nfs', 'null-aio', 'null-co', 'nvme', 'parallels',
63
- 'qcow', 'qcow2', 'qed', 'quorum', 'raw', 'rbd',
64
+ 'preallocate', 'qcow', 'qcow2', 'qed', 'quorum', 'raw', 'rbd',
65
{ 'name': 'replication', 'if': 'defined(CONFIG_REPLICATION)' },
66
'sheepdog',
67
'ssh', 'throttle', 'vdi', 'vhdx', 'vmdk', 'vpc', 'vvfat' ] }
68
@@ -XXX,XX +XXX,XX @@
69
'data': { 'aes': 'QCryptoBlockOptionsQCow',
70
'luks': 'QCryptoBlockOptionsLUKS'} }
71
72
+##
73
+# @BlockdevOptionsPreallocate:
74
+#
75
+# Filter driver intended to be inserted between format and protocol node
76
+# and do preallocation in protocol node on write.
77
+#
78
+# @prealloc-align: on preallocation, align file length to this number,
79
+# default 1048576 (1M)
80
+#
81
+# @prealloc-size: how much to preallocate, default 134217728 (128M)
82
+#
83
+# Since: 6.0
84
+##
85
+{ 'struct': 'BlockdevOptionsPreallocate',
86
+ 'base': 'BlockdevOptionsGenericFormat',
87
+ 'data': { '*prealloc-align': 'int', '*prealloc-size': 'int' } }
88
+
89
##
90
# @BlockdevOptionsQcow2:
91
#
92
@@ -XXX,XX +XXX,XX @@
93
'null-co': 'BlockdevOptionsNull',
94
'nvme': 'BlockdevOptionsNVMe',
95
'parallels': 'BlockdevOptionsGenericFormat',
96
+ 'preallocate':'BlockdevOptionsPreallocate',
97
'qcow2': 'BlockdevOptionsQcow2',
98
'qcow': 'BlockdevOptionsQcow',
99
'qed': 'BlockdevOptionsGenericCOWFormat',
100
diff --git a/block/preallocate.c b/block/preallocate.c
101
new file mode 100644
102
index XXXXXXX..XXXXXXX
103
--- /dev/null
104
+++ b/block/preallocate.c
105
@@ -XXX,XX +XXX,XX @@
106
+/*
107
+ * preallocate filter driver
108
+ *
109
+ * The driver performs preallocate operation: it is injected above
110
+ * some node, and before each write over EOF it does additional preallocating
111
+ * write-zeroes request.
112
+ *
113
+ * Copyright (c) 2020 Virtuozzo International GmbH.
114
+ *
115
+ * Author:
116
+ * Sementsov-Ogievskiy Vladimir <vsementsov@virtuozzo.com>
117
+ *
118
+ * This program is free software; you can redistribute it and/or modify
119
+ * it under the terms of the GNU General Public License as published by
120
+ * the Free Software Foundation; either version 2 of the License, or
121
+ * (at your option) any later version.
122
+ *
123
+ * This program is distributed in the hope that it will be useful,
124
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
125
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
126
+ * GNU General Public License for more details.
127
+ *
128
+ * You should have received a copy of the GNU General Public License
129
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
130
+ */
131
+
132
+#include "qemu/osdep.h"
133
+
134
+#include "qapi/error.h"
135
+#include "qemu/module.h"
136
+#include "qemu/option.h"
137
+#include "qemu/units.h"
138
+#include "block/block_int.h"
139
+
140
+
141
+typedef struct PreallocateOpts {
142
+ int64_t prealloc_size;
143
+ int64_t prealloc_align;
144
+} PreallocateOpts;
145
+
146
+typedef struct BDRVPreallocateState {
147
+ PreallocateOpts opts;
148
+
149
+ /*
150
+ * Track real data end, to crop preallocation on close. If < 0 the status is
151
+ * unknown.
152
+ *
153
+ * @data_end is a maximum of file size on open (or when we get write/resize
154
+ * permissions) and all write request ends after it. So it's safe to
155
+ * truncate to data_end if it is valid.
156
+ */
157
+ int64_t data_end;
158
+
159
+ /*
160
+ * Start of trailing preallocated area which reads as zero. May be smaller
161
+ * than data_end, if user does over-EOF write zero operation. If < 0 the
162
+ * status is unknown.
163
+ *
164
+ * If both @zero_start and @file_end are valid, the region
165
+ * [@zero_start, @file_end) is known to be preallocated zeroes. If @file_end
166
+ * is not valid, @zero_start doesn't make much sense.
167
+ */
168
+ int64_t zero_start;
169
+
170
+ /*
171
+ * Real end of file. Actually the cache for bdrv_getlength(bs->file->bs),
172
+ * to avoid extra lseek() calls on each write operation. If < 0 the status
173
+ * is unknown.
174
+ */
175
+ int64_t file_end;
176
+
177
+ /*
178
+ * All three states @data_end, @zero_start and @file_end are guaranteed to
179
+ * be invalid (< 0) when we don't have both exclusive BLK_PERM_RESIZE and
180
+ * BLK_PERM_WRITE permissions on file child.
181
+ */
182
+} BDRVPreallocateState;
183
+
184
+#define PREALLOCATE_OPT_PREALLOC_ALIGN "prealloc-align"
185
+#define PREALLOCATE_OPT_PREALLOC_SIZE "prealloc-size"
186
+static QemuOptsList runtime_opts = {
187
+ .name = "preallocate",
188
+ .head = QTAILQ_HEAD_INITIALIZER(runtime_opts.head),
189
+ .desc = {
190
+ {
191
+ .name = PREALLOCATE_OPT_PREALLOC_ALIGN,
192
+ .type = QEMU_OPT_SIZE,
193
+ .help = "on preallocation, align file length to this number, "
194
+ "default 1M",
195
+ },
196
+ {
197
+ .name = PREALLOCATE_OPT_PREALLOC_SIZE,
198
+ .type = QEMU_OPT_SIZE,
199
+ .help = "how much to preallocate, default 128M",
200
+ },
201
+ { /* end of list */ }
202
+ },
203
+};
204
+
205
+static bool preallocate_absorb_opts(PreallocateOpts *dest, QDict *options,
206
+ BlockDriverState *child_bs, Error **errp)
207
+{
208
+ QemuOpts *opts = qemu_opts_create(&runtime_opts, NULL, 0, &error_abort);
209
+
210
+ if (!qemu_opts_absorb_qdict(opts, options, errp)) {
211
+ return false;
212
+ }
213
+
214
+ dest->prealloc_align =
215
+ qemu_opt_get_size(opts, PREALLOCATE_OPT_PREALLOC_ALIGN, 1 * MiB);
216
+ dest->prealloc_size =
217
+ qemu_opt_get_size(opts, PREALLOCATE_OPT_PREALLOC_SIZE, 128 * MiB);
218
+
219
+ qemu_opts_del(opts);
220
+
221
+ if (!QEMU_IS_ALIGNED(dest->prealloc_align, BDRV_SECTOR_SIZE)) {
222
+ error_setg(errp, "prealloc-align parameter of preallocate filter "
223
+ "is not aligned to %llu", BDRV_SECTOR_SIZE);
224
+ return false;
225
+ }
226
+
227
+ if (!QEMU_IS_ALIGNED(dest->prealloc_align,
228
+ child_bs->bl.request_alignment)) {
229
+ error_setg(errp, "prealloc-align parameter of preallocate filter "
230
+ "is not aligned to underlying node request alignment "
231
+ "(%" PRIi32 ")", child_bs->bl.request_alignment);
232
+ return false;
233
+ }
234
+
235
+ return true;
236
+}
237
+
238
+static int preallocate_open(BlockDriverState *bs, QDict *options, int flags,
239
+ Error **errp)
240
+{
241
+ BDRVPreallocateState *s = bs->opaque;
242
+
243
+ /*
244
+ * s->data_end and friends should be initialized on permission update.
245
+ * For this to work, mark them invalid.
246
+ */
247
+ s->file_end = s->zero_start = s->data_end = -EINVAL;
248
+
249
+ bs->file = bdrv_open_child(NULL, options, "file", bs, &child_of_bds,
250
+ BDRV_CHILD_FILTERED | BDRV_CHILD_PRIMARY,
251
+ false, errp);
252
+ if (!bs->file) {
253
+ return -EINVAL;
254
+ }
255
+
256
+ if (!preallocate_absorb_opts(&s->opts, options, bs->file->bs, errp)) {
257
+ return -EINVAL;
258
+ }
259
+
260
+ bs->supported_write_flags = BDRV_REQ_WRITE_UNCHANGED |
261
+ (BDRV_REQ_FUA & bs->file->bs->supported_write_flags);
262
+
263
+ bs->supported_zero_flags = BDRV_REQ_WRITE_UNCHANGED |
264
+ ((BDRV_REQ_FUA | BDRV_REQ_MAY_UNMAP | BDRV_REQ_NO_FALLBACK) &
265
+ bs->file->bs->supported_zero_flags);
266
+
267
+ return 0;
268
+}
269
+
270
+static void preallocate_close(BlockDriverState *bs)
271
+{
272
+ int ret;
273
+ BDRVPreallocateState *s = bs->opaque;
274
+
275
+ if (s->data_end < 0) {
276
+ return;
277
+ }
278
+
279
+ if (s->file_end < 0) {
280
+ s->file_end = bdrv_getlength(bs->file->bs);
281
+ if (s->file_end < 0) {
282
+ return;
283
+ }
284
+ }
285
+
286
+ if (s->data_end < s->file_end) {
287
+ ret = bdrv_truncate(bs->file, s->data_end, true, PREALLOC_MODE_OFF, 0,
288
+ NULL);
289
+ s->file_end = ret < 0 ? ret : s->data_end;
290
+ }
291
+}
292
+
293
+
294
+/*
295
+ * Handle reopen.
296
+ *
297
+ * We must implement reopen handlers, otherwise reopen just don't work. Handle
298
+ * new options and don't care about preallocation state, as it is handled in
299
+ * set/check permission handlers.
300
+ */
301
+
302
+static int preallocate_reopen_prepare(BDRVReopenState *reopen_state,
303
+ BlockReopenQueue *queue, Error **errp)
304
+{
305
+ PreallocateOpts *opts = g_new0(PreallocateOpts, 1);
306
+
307
+ if (!preallocate_absorb_opts(opts, reopen_state->options,
308
+ reopen_state->bs->file->bs, errp)) {
309
+ g_free(opts);
310
+ return -EINVAL;
311
+ }
312
+
313
+ reopen_state->opaque = opts;
314
+
315
+ return 0;
316
+}
317
+
318
+static void preallocate_reopen_commit(BDRVReopenState *state)
319
+{
320
+ BDRVPreallocateState *s = state->bs->opaque;
321
+
322
+ s->opts = *(PreallocateOpts *)state->opaque;
323
+
324
+ g_free(state->opaque);
325
+ state->opaque = NULL;
326
+}
327
+
328
+static void preallocate_reopen_abort(BDRVReopenState *state)
329
+{
330
+ g_free(state->opaque);
331
+ state->opaque = NULL;
332
+}
333
+
334
+static coroutine_fn int preallocate_co_preadv_part(
335
+ BlockDriverState *bs, uint64_t offset, uint64_t bytes,
336
+ QEMUIOVector *qiov, size_t qiov_offset, int flags)
337
+{
338
+ return bdrv_co_preadv_part(bs->file, offset, bytes, qiov, qiov_offset,
339
+ flags);
340
+}
341
+
342
+static int coroutine_fn preallocate_co_pdiscard(BlockDriverState *bs,
343
+ int64_t offset, int bytes)
344
+{
345
+ return bdrv_co_pdiscard(bs->file, offset, bytes);
346
+}
347
+
348
+static bool can_write_resize(uint64_t perm)
349
+{
350
+ return (perm & BLK_PERM_WRITE) && (perm & BLK_PERM_RESIZE);
351
+}
352
+
353
+static bool has_prealloc_perms(BlockDriverState *bs)
354
+{
355
+ BDRVPreallocateState *s = bs->opaque;
356
+
357
+ if (can_write_resize(bs->file->perm)) {
358
+ assert(!(bs->file->shared_perm & BLK_PERM_WRITE));
359
+ assert(!(bs->file->shared_perm & BLK_PERM_RESIZE));
360
+ return true;
361
+ }
362
+
363
+ assert(s->data_end < 0);
364
+ assert(s->zero_start < 0);
365
+ assert(s->file_end < 0);
366
+ return false;
367
+}
368
+
369
+/*
370
+ * Call on each write. Returns true if @want_merge_zero is true and the region
371
+ * [offset, offset + bytes) is zeroed (as a result of this call or earlier
372
+ * preallocation).
373
+ *
374
+ * want_merge_zero is used to merge write-zero request with preallocation in
375
+ * one bdrv_co_pwrite_zeroes() call.
376
+ */
377
+static bool coroutine_fn handle_write(BlockDriverState *bs, int64_t offset,
378
+ int64_t bytes, bool want_merge_zero)
379
+{
380
+ BDRVPreallocateState *s = bs->opaque;
381
+ int64_t end = offset + bytes;
382
+ int64_t prealloc_start, prealloc_end;
383
+ int ret;
384
+
385
+ if (!has_prealloc_perms(bs)) {
386
+ /* We don't have state neither should try to recover it */
387
+ return false;
388
+ }
389
+
390
+ if (s->data_end < 0) {
391
+ s->data_end = bdrv_getlength(bs->file->bs);
392
+ if (s->data_end < 0) {
393
+ return false;
394
+ }
395
+
396
+ if (s->file_end < 0) {
397
+ s->file_end = s->data_end;
398
+ }
399
+ }
400
+
401
+ if (end <= s->data_end) {
402
+ return false;
403
+ }
404
+
405
+ /* We have valid s->data_end, and request writes beyond it. */
406
+
407
+ s->data_end = end;
408
+ if (s->zero_start < 0 || !want_merge_zero) {
409
+ s->zero_start = end;
410
+ }
411
+
412
+ if (s->file_end < 0) {
413
+ s->file_end = bdrv_getlength(bs->file->bs);
414
+ if (s->file_end < 0) {
415
+ return false;
416
+ }
417
+ }
418
+
419
+ /* Now s->data_end, s->zero_start and s->file_end are valid. */
420
+
421
+ if (end <= s->file_end) {
422
+ /* No preallocation needed. */
423
+ return want_merge_zero && offset >= s->zero_start;
424
+ }
425
+
426
+ /* Now we want new preallocation, as request writes beyond s->file_end. */
427
+
428
+ prealloc_start = want_merge_zero ? MIN(offset, s->file_end) : s->file_end;
429
+ prealloc_end = QEMU_ALIGN_UP(end + s->opts.prealloc_size,
430
+ s->opts.prealloc_align);
431
+
432
+ ret = bdrv_co_pwrite_zeroes(
433
+ bs->file, prealloc_start, prealloc_end - prealloc_start,
434
+ BDRV_REQ_NO_FALLBACK | BDRV_REQ_SERIALISING | BDRV_REQ_NO_WAIT);
435
+ if (ret < 0) {
436
+ s->file_end = ret;
437
+ return false;
438
+ }
439
+
440
+ s->file_end = prealloc_end;
441
+ return want_merge_zero;
442
+}
443
+
444
+static int coroutine_fn preallocate_co_pwrite_zeroes(BlockDriverState *bs,
445
+ int64_t offset, int bytes, BdrvRequestFlags flags)
446
+{
447
+ bool want_merge_zero =
448
+ !(flags & ~(BDRV_REQ_ZERO_WRITE | BDRV_REQ_NO_FALLBACK));
449
+ if (handle_write(bs, offset, bytes, want_merge_zero)) {
450
+ return 0;
451
+ }
452
+
453
+ return bdrv_co_pwrite_zeroes(bs->file, offset, bytes, flags);
454
+}
455
+
456
+static coroutine_fn int preallocate_co_pwritev_part(BlockDriverState *bs,
457
+ uint64_t offset,
458
+ uint64_t bytes,
459
+ QEMUIOVector *qiov,
460
+ size_t qiov_offset,
461
+ int flags)
462
+{
463
+ handle_write(bs, offset, bytes, false);
464
+
465
+ return bdrv_co_pwritev_part(bs->file, offset, bytes, qiov, qiov_offset,
466
+ flags);
467
+}
468
+
469
+static int coroutine_fn
470
+preallocate_co_truncate(BlockDriverState *bs, int64_t offset,
471
+ bool exact, PreallocMode prealloc,
472
+ BdrvRequestFlags flags, Error **errp)
473
+{
474
+ ERRP_GUARD();
475
+ BDRVPreallocateState *s = bs->opaque;
476
+ int ret;
477
+
478
+ if (s->data_end >= 0 && offset > s->data_end) {
479
+ if (s->file_end < 0) {
480
+ s->file_end = bdrv_getlength(bs->file->bs);
481
+ if (s->file_end < 0) {
482
+ error_setg(errp, "failed to get file length");
483
+ return s->file_end;
484
+ }
485
+ }
486
+
487
+ if (prealloc == PREALLOC_MODE_FALLOC) {
488
+ /*
489
+ * If offset <= s->file_end, the task is already done, just
490
+ * update s->data_end, to move part of "filter preallocation"
491
+ * to "preallocation requested by user".
492
+ * Otherwise just proceed to preallocate missing part.
493
+ */
494
+ if (offset <= s->file_end) {
495
+ s->data_end = offset;
496
+ return 0;
497
+ }
498
+ } else {
499
+ /*
500
+ * We have to drop our preallocation, to
501
+ * - avoid "Cannot use preallocation for shrinking files" in
502
+ * case of offset < file_end
503
+ * - give PREALLOC_MODE_OFF a chance to keep small disk
504
+ * usage
505
+ * - give PREALLOC_MODE_FULL a chance to actually write the
506
+ * whole region as user expects
507
+ */
508
+ if (s->file_end > s->data_end) {
509
+ ret = bdrv_co_truncate(bs->file, s->data_end, true,
510
+ PREALLOC_MODE_OFF, 0, errp);
511
+ if (ret < 0) {
512
+ s->file_end = ret;
513
+ error_prepend(errp, "preallocate-filter: failed to drop "
514
+ "write-zero preallocation: ");
515
+ return ret;
516
+ }
517
+ s->file_end = s->data_end;
518
+ }
519
+ }
520
+
521
+ s->data_end = offset;
522
+ }
523
+
524
+ ret = bdrv_co_truncate(bs->file, offset, exact, prealloc, flags, errp);
525
+ if (ret < 0) {
526
+ s->file_end = s->zero_start = s->data_end = ret;
527
+ return ret;
528
+ }
529
+
530
+ if (has_prealloc_perms(bs)) {
531
+ s->file_end = s->zero_start = s->data_end = offset;
532
+ }
533
+ return 0;
534
+}
535
+
536
+static int coroutine_fn preallocate_co_flush(BlockDriverState *bs)
537
+{
538
+ return bdrv_co_flush(bs->file->bs);
539
+}
540
+
541
+static int64_t preallocate_getlength(BlockDriverState *bs)
542
+{
543
+ int64_t ret;
544
+ BDRVPreallocateState *s = bs->opaque;
545
+
546
+ if (s->data_end >= 0) {
547
+ return s->data_end;
548
+ }
549
+
550
+ ret = bdrv_getlength(bs->file->bs);
551
+
552
+ if (has_prealloc_perms(bs)) {
553
+ s->file_end = s->zero_start = s->data_end = ret;
554
+ }
555
+
556
+ return ret;
557
+}
558
+
559
+static int preallocate_check_perm(BlockDriverState *bs,
560
+ uint64_t perm, uint64_t shared, Error **errp)
561
+{
562
+ BDRVPreallocateState *s = bs->opaque;
563
+
564
+ if (s->data_end >= 0 && !can_write_resize(perm)) {
565
+ /*
566
+ * Lose permissions.
567
+ * We should truncate in check_perm, as in set_perm bs->file->perm will
568
+ * be already changed, and we should not violate it.
569
+ */
570
+ if (s->file_end < 0) {
571
+ s->file_end = bdrv_getlength(bs->file->bs);
572
+ if (s->file_end < 0) {
573
+ error_setg(errp, "Failed to get file length");
574
+ return s->file_end;
575
+ }
576
+ }
577
+
578
+ if (s->data_end < s->file_end) {
579
+ int ret = bdrv_truncate(bs->file, s->data_end, true,
580
+ PREALLOC_MODE_OFF, 0, NULL);
581
+ if (ret < 0) {
582
+ error_setg(errp, "Failed to drop preallocation");
583
+ s->file_end = ret;
584
+ return ret;
585
+ }
586
+ s->file_end = s->data_end;
587
+ }
588
+ }
589
+
590
+ return 0;
591
+}
592
+
593
+static void preallocate_set_perm(BlockDriverState *bs,
594
+ uint64_t perm, uint64_t shared)
595
+{
596
+ BDRVPreallocateState *s = bs->opaque;
597
+
598
+ if (can_write_resize(perm)) {
599
+ if (s->data_end < 0) {
600
+ s->data_end = s->file_end = s->zero_start =
601
+ bdrv_getlength(bs->file->bs);
602
+ }
603
+ } else {
604
+ /*
605
+ * We drop our permissions, as well as allow shared
606
+ * permissions (see preallocate_child_perm), anyone will be able to
607
+ * change the child, so mark all states invalid. We'll regain control if
608
+ * get good permissions back.
609
+ */
610
+ s->data_end = s->file_end = s->zero_start = -EINVAL;
611
+ }
612
+}
613
+
614
+static void preallocate_child_perm(BlockDriverState *bs, BdrvChild *c,
615
+ BdrvChildRole role, BlockReopenQueue *reopen_queue,
616
+ uint64_t perm, uint64_t shared, uint64_t *nperm, uint64_t *nshared)
617
+{
618
+ bdrv_default_perms(bs, c, role, reopen_queue, perm, shared, nperm, nshared);
619
+
620
+ if (can_write_resize(perm)) {
621
+ /* This should come by default, but let's enforce: */
622
+ *nperm |= BLK_PERM_WRITE | BLK_PERM_RESIZE;
623
+
624
+ /*
625
+ * Don't share, to keep our states s->file_end, s->data_end and
626
+ * s->zero_start valid.
627
+ */
628
+ *nshared &= ~(BLK_PERM_WRITE | BLK_PERM_RESIZE);
629
+ }
630
+}
631
+
632
+BlockDriver bdrv_preallocate_filter = {
633
+ .format_name = "preallocate",
634
+ .instance_size = sizeof(BDRVPreallocateState),
635
+
636
+ .bdrv_getlength = preallocate_getlength,
637
+ .bdrv_open = preallocate_open,
638
+ .bdrv_close = preallocate_close,
639
+
640
+ .bdrv_reopen_prepare = preallocate_reopen_prepare,
641
+ .bdrv_reopen_commit = preallocate_reopen_commit,
642
+ .bdrv_reopen_abort = preallocate_reopen_abort,
643
+
644
+ .bdrv_co_preadv_part = preallocate_co_preadv_part,
645
+ .bdrv_co_pwritev_part = preallocate_co_pwritev_part,
646
+ .bdrv_co_pwrite_zeroes = preallocate_co_pwrite_zeroes,
647
+ .bdrv_co_pdiscard = preallocate_co_pdiscard,
648
+ .bdrv_co_flush = preallocate_co_flush,
649
+ .bdrv_co_truncate = preallocate_co_truncate,
650
+
651
+ .bdrv_check_perm = preallocate_check_perm,
652
+ .bdrv_set_perm = preallocate_set_perm,
653
+ .bdrv_child_perm = preallocate_child_perm,
654
+
655
+ .has_variable_length = true,
656
+ .is_filter = true,
657
+};
658
+
659
+static void bdrv_preallocate_init(void)
660
+{
661
+ bdrv_register(&bdrv_preallocate_filter);
662
+}
663
+
664
+block_init(bdrv_preallocate_init);
665
diff --git a/block/meson.build b/block/meson.build
666
index XXXXXXX..XXXXXXX 100644
667
--- a/block/meson.build
668
+++ b/block/meson.build
669
@@ -XXX,XX +XXX,XX @@ block_ss.add(files(
670
'block-copy.c',
671
'commit.c',
672
'copy-on-read.c',
673
+ 'preallocate.c',
674
'create.c',
675
'crypto.c',
676
'dirty-bitmap.c',
58
--
677
--
59
2.24.1
678
2.29.2
60
679
61
680
diff view generated by jsdifflib
1
Tests should not overwrite all user-supplied image options, but only add
1
From: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
2
to it (which will effectively overwrite conflicting values). Accomplish
3
this by passing options to _make_test_img via -o instead of $IMGOPTS.
4
2
5
For some tests, there is no functional change because they already only
3
This will be used in further test.
6
appended options to IMGOPTS. For these, this patch is just a
7
simplification.
8
4
9
For others, this is a change, so they now heed user-specified $IMGOPTS.
5
Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
10
Some of those tests do not work with all image options, though, so we
6
Reviewed-by: Max Reitz <mreitz@redhat.com>
11
need to disable them accordingly.
7
Message-Id: <20201021145859.11201-10-vsementsov@virtuozzo.com>
12
13
Signed-off-by: Max Reitz <mreitz@redhat.com>
14
Reviewed-by: Maxim Levitsky <mlevitsk@redhat.com>
15
Message-id: 20191107163708.833192-12-mreitz@redhat.com
16
Signed-off-by: Max Reitz <mreitz@redhat.com>
8
Signed-off-by: Max Reitz <mreitz@redhat.com>
17
---
9
---
18
tests/qemu-iotests/031 | 9 ++++---
10
qemu-io-cmds.c | 46 ++++++++++++++++++++++++++++++++--------------
19
tests/qemu-iotests/039 | 24 ++++++------------
11
1 file changed, 32 insertions(+), 14 deletions(-)
20
tests/qemu-iotests/059 | 18 ++++++-------
21
tests/qemu-iotests/060 | 6 ++---
22
tests/qemu-iotests/061 | 57 ++++++++++++++++++++++--------------------
23
tests/qemu-iotests/079 | 3 +--
24
tests/qemu-iotests/106 | 2 +-
25
tests/qemu-iotests/108 | 2 +-
26
tests/qemu-iotests/112 | 32 ++++++++++++------------
27
tests/qemu-iotests/115 | 3 +--
28
tests/qemu-iotests/121 | 6 ++---
29
tests/qemu-iotests/125 | 2 +-
30
tests/qemu-iotests/137 | 2 +-
31
tests/qemu-iotests/138 | 3 +--
32
tests/qemu-iotests/175 | 2 +-
33
tests/qemu-iotests/190 | 2 +-
34
tests/qemu-iotests/191 | 3 +--
35
tests/qemu-iotests/220 | 4 ++-
36
tests/qemu-iotests/243 | 6 +++--
37
tests/qemu-iotests/244 | 10 +++++---
38
tests/qemu-iotests/250 | 3 +--
39
tests/qemu-iotests/265 | 2 +-
40
22 files changed, 100 insertions(+), 101 deletions(-)
41
12
42
diff --git a/tests/qemu-iotests/031 b/tests/qemu-iotests/031
13
diff --git a/qemu-io-cmds.c b/qemu-io-cmds.c
43
index XXXXXXX..XXXXXXX 100755
14
index XXXXXXX..XXXXXXX 100644
44
--- a/tests/qemu-iotests/031
15
--- a/qemu-io-cmds.c
45
+++ b/tests/qemu-iotests/031
16
+++ b/qemu-io-cmds.c
46
@@ -XXX,XX +XXX,XX @@ trap "_cleanup; exit \$status" 0 1 2 3 15
17
@@ -XXX,XX +XXX,XX @@ static const cmdinfo_t flush_cmd = {
47
# This tests qcow2-specific low-level functionality
18
.oneline = "flush all in-core file state to disk",
48
_supported_fmt qcow2
19
};
49
_supported_proto file
20
50
+# We want to test compat=0.10, which does not support refcount widths
21
+static int truncate_f(BlockBackend *blk, int argc, char **argv);
51
+# other than 16
22
+static const cmdinfo_t truncate_cmd = {
52
+_unsupported_imgopts 'refcount_bits=\([^1]\|.\([^6]\|$\)\)'
23
+ .name = "truncate",
53
24
+ .altname = "t",
54
CLUSTER_SIZE=65536
25
+ .cfunc = truncate_f,
55
26
+ .perm = BLK_PERM_WRITE | BLK_PERM_RESIZE,
56
# qcow2.py output depends on the exact options used, so override the command
27
+ .argmin = 1,
57
# line here as an exception
28
+ .argmax = 3,
58
-for IMGOPTS in "compat=0.10" "compat=1.1"; do
29
+ .args = "[-m prealloc_mode] off",
59
+for compat in "compat=0.10" "compat=1.1"; do
30
+ .oneline = "truncates the current file at the given offset",
60
31
+};
61
echo
32
+
62
- echo ===== Testing with -o $IMGOPTS =====
33
static int truncate_f(BlockBackend *blk, int argc, char **argv)
63
+ echo ===== Testing with -o $compat =====
34
{
64
echo
35
Error *local_err = NULL;
65
echo === Create image with unknown header extension ===
36
int64_t offset;
66
echo
37
- int ret;
67
- _make_test_img 64M
38
+ int c, ret;
68
+ _make_test_img -o $compat 64M
39
+ PreallocMode prealloc = PREALLOC_MODE_OFF;
69
$PYTHON qcow2.py "$TEST_IMG" add-header-ext 0x12345678 "This is a test header extension"
40
70
$PYTHON qcow2.py "$TEST_IMG" dump-header
41
- offset = cvtnum(argv[1]);
71
_check_test_img
42
+ while ((c = getopt(argc, argv, "m:")) != -1) {
72
diff --git a/tests/qemu-iotests/039 b/tests/qemu-iotests/039
43
+ switch (c) {
73
index XXXXXXX..XXXXXXX 100755
44
+ case 'm':
74
--- a/tests/qemu-iotests/039
45
+ prealloc = qapi_enum_parse(&PreallocMode_lookup, optarg,
75
+++ b/tests/qemu-iotests/039
46
+ PREALLOC_MODE__MAX, NULL);
76
@@ -XXX,XX +XXX,XX @@ size=128M
47
+ if (prealloc == PREALLOC_MODE__MAX) {
77
echo
48
+ error_report("Invalid preallocation mode '%s'", optarg);
78
echo "== Checking that image is clean on shutdown =="
49
+ return -EINVAL;
79
50
+ }
80
-IMGOPTS="compat=1.1,lazy_refcounts=on"
51
+ break;
81
-_make_test_img $size
52
+ default:
82
+_make_test_img -o "compat=1.1,lazy_refcounts=on" $size
53
+ qemuio_command_usage(&truncate_cmd);
83
54
+ return -EINVAL;
84
$QEMU_IO -c "write -P 0x5a 0 512" "$TEST_IMG" | _filter_qemu_io
55
+ }
85
56
+ }
86
@@ -XXX,XX +XXX,XX @@ _check_test_img
57
+
87
echo
58
+ offset = cvtnum(argv[optind]);
88
echo "== Creating a dirty image file =="
59
if (offset < 0) {
89
60
print_cvtnum_err(offset, argv[1]);
90
-IMGOPTS="compat=1.1,lazy_refcounts=on"
61
return offset;
91
-_make_test_img $size
62
@@ -XXX,XX +XXX,XX @@ static int truncate_f(BlockBackend *blk, int argc, char **argv)
92
+_make_test_img -o "compat=1.1,lazy_refcounts=on" $size
63
* exact=true. It is better to err on the "emit more errors" side
93
64
* than to be overly permissive.
94
_NO_VALGRIND \
65
*/
95
$QEMU_IO -c "write -P 0x5a 0 512" \
66
- ret = blk_truncate(blk, offset, false, PREALLOC_MODE_OFF, 0, &local_err);
96
@@ -XXX,XX +XXX,XX @@ $QEMU_IO -c "read -P 0x5a 0 512" "$TEST_IMG" | _filter_qemu_io
67
+ ret = blk_truncate(blk, offset, false, prealloc, 0, &local_err);
97
echo
68
if (ret < 0) {
98
echo "== Opening a dirty image read/write should repair it =="
69
error_report_err(local_err);
99
70
return ret;
100
-IMGOPTS="compat=1.1,lazy_refcounts=on"
71
@@ -XXX,XX +XXX,XX @@ static int truncate_f(BlockBackend *blk, int argc, char **argv)
101
-_make_test_img $size
72
return 0;
102
+_make_test_img -o "compat=1.1,lazy_refcounts=on" $size
103
104
_NO_VALGRIND \
105
$QEMU_IO -c "write -P 0x5a 0 512" \
106
@@ -XXX,XX +XXX,XX @@ $PYTHON qcow2.py "$TEST_IMG" dump-header | grep incompatible_features
107
echo
108
echo "== Creating an image file with lazy_refcounts=off =="
109
110
-IMGOPTS="compat=1.1,lazy_refcounts=off"
111
-_make_test_img $size
112
+_make_test_img -o "compat=1.1,lazy_refcounts=off" $size
113
114
_NO_VALGRIND \
115
$QEMU_IO -c "write -P 0x5a 0 512" \
116
@@ -XXX,XX +XXX,XX @@ _check_test_img
117
echo
118
echo "== Committing to a backing file with lazy_refcounts=on =="
119
120
-IMGOPTS="compat=1.1,lazy_refcounts=on"
121
-TEST_IMG="$TEST_IMG".base _make_test_img $size
122
+TEST_IMG="$TEST_IMG".base _make_test_img -o "compat=1.1,lazy_refcounts=on" $size
123
124
-IMGOPTS="compat=1.1,lazy_refcounts=on,backing_file=$TEST_IMG.base"
125
-_make_test_img $size
126
+_make_test_img -o "compat=1.1,lazy_refcounts=on,backing_file=$TEST_IMG.base" $size
127
128
$QEMU_IO -c "write 0 512" "$TEST_IMG" | _filter_qemu_io
129
$QEMU_IMG commit "$TEST_IMG"
130
@@ -XXX,XX +XXX,XX @@ TEST_IMG="$TEST_IMG".base _check_test_img
131
echo
132
echo "== Changing lazy_refcounts setting at runtime =="
133
134
-IMGOPTS="compat=1.1,lazy_refcounts=off"
135
-_make_test_img $size
136
+_make_test_img -o "compat=1.1,lazy_refcounts=off" $size
137
138
_NO_VALGRIND \
139
$QEMU_IO -c "reopen -o lazy-refcounts=on" \
140
@@ -XXX,XX +XXX,XX @@ $QEMU_IO -c "reopen -o lazy-refcounts=on" \
141
$PYTHON qcow2.py "$TEST_IMG" dump-header | grep incompatible_features
142
_check_test_img
143
144
-IMGOPTS="compat=1.1,lazy_refcounts=on"
145
-_make_test_img $size
146
+_make_test_img -o "compat=1.1,lazy_refcounts=on" $size
147
148
_NO_VALGRIND \
149
$QEMU_IO -c "reopen -o lazy-refcounts=off" \
150
diff --git a/tests/qemu-iotests/059 b/tests/qemu-iotests/059
151
index XXXXXXX..XXXXXXX 100755
152
--- a/tests/qemu-iotests/059
153
+++ b/tests/qemu-iotests/059
154
@@ -XXX,XX +XXX,XX @@ poke_file "$TEST_IMG" "$grain_table_size_offset" "\x01\x00\x00\x00"
155
156
echo
157
echo "=== Testing monolithicFlat creation and opening ==="
158
-IMGOPTS="subformat=monolithicFlat" _make_test_img 2G
159
+_make_test_img -o "subformat=monolithicFlat" 2G
160
_img_info
161
_cleanup_test_img
162
163
echo
164
echo "=== Testing monolithicFlat with zeroed_grain ==="
165
-IMGOPTS="subformat=monolithicFlat,zeroed_grain=on" _make_test_img 2G
166
+_make_test_img -o "subformat=monolithicFlat,zeroed_grain=on" 2G
167
_cleanup_test_img
168
169
echo
170
echo "=== Testing big twoGbMaxExtentFlat ==="
171
-IMGOPTS="subformat=twoGbMaxExtentFlat" _make_test_img 1000G
172
+_make_test_img -o "subformat=twoGbMaxExtentFlat" 1000G
173
$QEMU_IMG info $TEST_IMG | _filter_testdir | sed -e 's/cid: [0-9]*/cid: XXXXXXXX/'
174
_cleanup_test_img
175
176
@@ -XXX,XX +XXX,XX @@ _img_info
177
178
echo
179
echo "=== Testing truncated sparse ==="
180
-IMGOPTS="subformat=monolithicSparse" _make_test_img 100G
181
+_make_test_img -o "subformat=monolithicSparse" 100G
182
truncate -s 10M $TEST_IMG
183
_img_info
184
185
echo
186
echo "=== Converting to streamOptimized from image with small cluster size==="
187
-TEST_IMG="$TEST_IMG.qcow2" IMGFMT=qcow2 IMGOPTS="cluster_size=4096" _make_test_img 1G
188
+TEST_IMG="$TEST_IMG.qcow2" IMGFMT=qcow2 _make_test_img -o "cluster_size=4096" 1G
189
$QEMU_IO -f qcow2 -c "write -P 0xa 0 512" "$TEST_IMG.qcow2" | _filter_qemu_io
190
$QEMU_IO -f qcow2 -c "write -P 0xb 10240 512" "$TEST_IMG.qcow2" | _filter_qemu_io
191
$QEMU_IMG convert -f qcow2 -O vmdk -o subformat=streamOptimized "$TEST_IMG.qcow2" "$TEST_IMG" 2>&1
192
@@ -XXX,XX +XXX,XX @@ echo "=== Testing monolithicFlat with internally generated JSON file name ==="
193
194
echo '--- blkdebug ---'
195
# Should work, because bdrv_dirname() works fine with blkdebug
196
-IMGOPTS="subformat=monolithicFlat" _make_test_img 64M
197
+_make_test_img -o "subformat=monolithicFlat" 64M
198
$QEMU_IO -c "open -o driver=$IMGFMT,file.driver=blkdebug,file.image.filename=$TEST_IMG,file.inject-error.0.event=read_aio" \
199
-c info \
200
2>&1 \
201
@@ -XXX,XX +XXX,XX @@ _cleanup_test_img
202
203
echo '--- quorum ---'
204
# Should not work, because bdrv_dirname() does not work with quorum
205
-IMGOPTS="subformat=monolithicFlat" _make_test_img 64M
206
+_make_test_img -o "subformat=monolithicFlat" 64M
207
cp "$TEST_IMG" "$TEST_IMG.orig"
208
209
filename="json:{
210
@@ -XXX,XX +XXX,XX @@ _cleanup_test_img
211
212
echo
213
echo "=== Testing 4TB monolithicFlat creation and IO ==="
214
-IMGOPTS="subformat=monolithicFlat" _make_test_img 4T
215
+_make_test_img -o "subformat=monolithicFlat" 4T
216
_img_info
217
$QEMU_IO -c "write -P 0xa 900G 512" "$TEST_IMG" | _filter_qemu_io
218
$QEMU_IO -c "read -v 900G 1024" "$TEST_IMG" | _filter_qemu_io
219
@@ -XXX,XX +XXX,XX @@ _cleanup_test_img
220
echo
221
echo "=== Testing qemu-img map on extents ==="
222
for fmt in monolithicSparse twoGbMaxExtentSparse; do
223
- IMGOPTS="subformat=$fmt" _make_test_img 31G
224
+ _make_test_img -o "subformat=$fmt" 31G
225
$QEMU_IO -c "write 65024 1k" "$TEST_IMG" | _filter_qemu_io
226
$QEMU_IO -c "write 2147483136 1k" "$TEST_IMG" | _filter_qemu_io
227
$QEMU_IO -c "write 5G 1k" "$TEST_IMG" | _filter_qemu_io
228
diff --git a/tests/qemu-iotests/060 b/tests/qemu-iotests/060
229
index XXXXXXX..XXXXXXX 100755
230
--- a/tests/qemu-iotests/060
231
+++ b/tests/qemu-iotests/060
232
@@ -XXX,XX +XXX,XX @@ $QEMU_IO -c 'write 0k 64k' "$BACKING_IMG" | _filter_qemu_io
233
# compat=0.10 is required in order to make the following discard actually
234
# unallocate the sector rather than make it a zero sector - we want COW, after
235
# all.
236
-IMGOPTS='compat=0.10' _make_test_img -b "$BACKING_IMG" 1G
237
+_make_test_img -o 'compat=0.10' -b "$BACKING_IMG" 1G
238
# Write two clusters, the second one enforces creation of an L2 table after
239
# the first data cluster.
240
$QEMU_IO -c 'write 0k 64k' -c 'write 512M 64k' "$TEST_IMG" | _filter_qemu_io
241
@@ -XXX,XX +XXX,XX @@ echo
242
echo "=== Discarding a non-covered in-bounds refblock ==="
243
echo
244
245
-IMGOPTS='refcount_bits=1' _make_test_img 64M
246
+_make_test_img -o 'refcount_bits=1' 64M
247
248
# Pretend there's a refblock somewhere where there is no refblock to
249
# cover it (but the covering refblock has a valid index in the
250
@@ -XXX,XX +XXX,XX @@ echo
251
echo "=== Discarding a refblock covered by an unaligned refblock ==="
252
echo
253
254
-IMGOPTS='refcount_bits=1' _make_test_img 64M
255
+_make_test_img -o 'refcount_bits=1' 64M
256
257
# Same as above
258
poke_file "$TEST_IMG" "$(($rt_offset+8))" "\x00\x00\x00\x10\x00\x00\x00\x00"
259
diff --git a/tests/qemu-iotests/061 b/tests/qemu-iotests/061
260
index XXXXXXX..XXXXXXX 100755
261
--- a/tests/qemu-iotests/061
262
+++ b/tests/qemu-iotests/061
263
@@ -XXX,XX +XXX,XX @@ trap "_cleanup; exit \$status" 0 1 2 3 15
264
_supported_fmt qcow2
265
_supported_proto file
266
_supported_os Linux
267
+# Conversion between different compat versions can only really work
268
+# with refcount_bits=16
269
+_unsupported_imgopts 'refcount_bits=\([^1]\|.\([^6]\|$\)\)'
270
271
echo
272
echo "=== Testing version downgrade with zero expansion ==="
273
echo
274
-IMGOPTS="compat=1.1,lazy_refcounts=on" _make_test_img 64M
275
+_make_test_img -o "compat=1.1,lazy_refcounts=on" 64M
276
$QEMU_IO -c "write -z 0 128k" "$TEST_IMG" | _filter_qemu_io
277
$PYTHON qcow2.py "$TEST_IMG" dump-header
278
$QEMU_IMG amend -o "compat=0.10" "$TEST_IMG"
279
@@ -XXX,XX +XXX,XX @@ _check_test_img
280
echo
281
echo "=== Testing version downgrade with zero expansion and 4K cache entries ==="
282
echo
283
-IMGOPTS="compat=1.1,lazy_refcounts=on" _make_test_img 64M
284
+_make_test_img -o "compat=1.1,lazy_refcounts=on" 64M
285
$QEMU_IO -c "write -z 0 128k" "$TEST_IMG" | _filter_qemu_io
286
$QEMU_IO -c "write -z 32M 128k" "$TEST_IMG" | _filter_qemu_io
287
$QEMU_IO -c map "$TEST_IMG" | _filter_qemu_io
288
@@ -XXX,XX +XXX,XX @@ _check_test_img
289
echo
290
echo "=== Testing dirty version downgrade ==="
291
echo
292
-IMGOPTS="compat=1.1,lazy_refcounts=on" _make_test_img 64M
293
+_make_test_img -o "compat=1.1,lazy_refcounts=on" 64M
294
_NO_VALGRIND \
295
$QEMU_IO -c "write -P 0x2a 0 128k" -c flush \
296
-c "sigraise $(kill -l KILL)" "$TEST_IMG" 2>&1 | _filter_qemu_io
297
@@ -XXX,XX +XXX,XX @@ _check_test_img
298
echo
299
echo "=== Testing version downgrade with unknown compat/autoclear flags ==="
300
echo
301
-IMGOPTS="compat=1.1" _make_test_img 64M
302
+_make_test_img -o "compat=1.1" 64M
303
$PYTHON qcow2.py "$TEST_IMG" set-feature-bit compatible 42
304
$PYTHON qcow2.py "$TEST_IMG" set-feature-bit autoclear 42
305
$PYTHON qcow2.py "$TEST_IMG" dump-header
306
@@ -XXX,XX +XXX,XX @@ _check_test_img
307
echo
308
echo "=== Testing version upgrade and resize ==="
309
echo
310
-IMGOPTS="compat=0.10" _make_test_img 64M
311
+_make_test_img -o "compat=0.10" 64M
312
$QEMU_IO -c "write -P 0x2a 42M 64k" "$TEST_IMG" | _filter_qemu_io
313
$PYTHON qcow2.py "$TEST_IMG" dump-header
314
$QEMU_IMG amend -o "compat=1.1,lazy_refcounts=on,size=128M" "$TEST_IMG"
315
@@ -XXX,XX +XXX,XX @@ _check_test_img
316
echo
317
echo "=== Testing dirty lazy_refcounts=off ==="
318
echo
319
-IMGOPTS="compat=1.1,lazy_refcounts=on" _make_test_img 64M
320
+_make_test_img -o "compat=1.1,lazy_refcounts=on" 64M
321
_NO_VALGRIND \
322
$QEMU_IO -c "write -P 0x2a 0 128k" -c flush \
323
-c "sigraise $(kill -l KILL)" "$TEST_IMG" 2>&1 | _filter_qemu_io
324
@@ -XXX,XX +XXX,XX @@ _check_test_img
325
echo
326
echo "=== Testing backing file ==="
327
echo
328
-IMGOPTS="compat=1.1" _make_test_img 64M
329
-IMGOPTS="compat=1.1" TEST_IMG="$TEST_IMG.base" _make_test_img 64M
330
+_make_test_img -o "compat=1.1" 64M
331
+TEST_IMG="$TEST_IMG.base" _make_test_img -o "compat=1.1" 64M
332
$QEMU_IO -c "write -P 0x2a 0 128k" "$TEST_IMG.base" | _filter_qemu_io
333
$QEMU_IO -c "read -P 0 0 128k" "$TEST_IMG" | _filter_qemu_io
334
$QEMU_IMG amend -o "backing_file=$TEST_IMG.base,backing_fmt=qcow2" "$TEST_IMG"
335
@@ -XXX,XX +XXX,XX @@ _check_test_img
336
echo
337
echo "=== Testing invalid configurations ==="
338
echo
339
-IMGOPTS="compat=0.10" _make_test_img 64M
340
+_make_test_img -o "compat=0.10" 64M
341
$QEMU_IMG amend -o "lazy_refcounts=on" "$TEST_IMG"
342
$QEMU_IMG amend -o "compat=1.1" "$TEST_IMG" # actually valid
343
$QEMU_IMG amend -o "compat=0.10,lazy_refcounts=on" "$TEST_IMG"
344
@@ -XXX,XX +XXX,XX @@ $QEMU_IMG amend -o "preallocation=on" "$TEST_IMG"
345
echo
346
echo "=== Testing correct handling of unset value ==="
347
echo
348
-IMGOPTS="compat=1.1,cluster_size=1k" _make_test_img 64M
349
+_make_test_img -o "compat=1.1,cluster_size=1k" 64M
350
echo "Should work:"
351
$QEMU_IMG amend -o "lazy_refcounts=on" "$TEST_IMG"
352
echo "Should not work:" # Just to know which of these tests actually fails
353
@@ -XXX,XX +XXX,XX @@ $QEMU_IMG amend -o "cluster_size=64k" "$TEST_IMG"
354
echo
355
echo "=== Testing zero expansion on inactive clusters ==="
356
echo
357
-IMGOPTS="compat=1.1" _make_test_img 64M
358
+_make_test_img -o "compat=1.1" 64M
359
$QEMU_IO -c "write -z 0 128k" "$TEST_IMG" | _filter_qemu_io
360
$QEMU_IMG snapshot -c foo "$TEST_IMG"
361
$QEMU_IO -c "write -P 0x2a 0 128k" "$TEST_IMG" | _filter_qemu_io
362
@@ -XXX,XX +XXX,XX @@ $QEMU_IO -c "read -P 0 0 128k" "$TEST_IMG" | _filter_qemu_io
363
echo
364
echo "=== Testing zero expansion on shared L2 table ==="
365
echo
366
-IMGOPTS="compat=1.1" _make_test_img 64M
367
+_make_test_img -o "compat=1.1" 64M
368
$QEMU_IO -c "write -z 0 128k" "$TEST_IMG" | _filter_qemu_io
369
$QEMU_IMG snapshot -c foo "$TEST_IMG"
370
$QEMU_IMG amend -o "compat=0.10" "$TEST_IMG"
371
@@ -XXX,XX +XXX,XX @@ $QEMU_IO -c "read -P 0 0 128k" "$TEST_IMG" | _filter_qemu_io
372
echo
373
echo "=== Testing zero expansion on backed image ==="
374
echo
375
-IMGOPTS="compat=1.1" TEST_IMG="$TEST_IMG.base" _make_test_img 64M
376
+TEST_IMG="$TEST_IMG.base" _make_test_img -o "compat=1.1" 64M
377
$QEMU_IO -c "write -P 0x2a 0 128k" "$TEST_IMG.base" | _filter_qemu_io
378
-IMGOPTS="compat=1.1" _make_test_img -b "$TEST_IMG.base" 64M
379
+_make_test_img -o "compat=1.1" -b "$TEST_IMG.base" 64M
380
$QEMU_IO -c "read -P 0x2a 0 128k" -c "write -z 0 64k" "$TEST_IMG" | _filter_qemu_io
381
$QEMU_IMG amend -o "compat=0.10" "$TEST_IMG"
382
_check_test_img
383
@@ -XXX,XX +XXX,XX @@ $QEMU_IO -c "read -P 0 0 64k" -c "read -P 0x2a 64k 64k" "$TEST_IMG" | _filter_qe
384
echo
385
echo "=== Testing zero expansion on backed inactive clusters ==="
386
echo
387
-IMGOPTS="compat=1.1" TEST_IMG="$TEST_IMG.base" _make_test_img 64M
388
+TEST_IMG="$TEST_IMG.base" _make_test_img -o "compat=1.1" 64M
389
$QEMU_IO -c "write -P 0x2a 0 128k" "$TEST_IMG.base" | _filter_qemu_io
390
-IMGOPTS="compat=1.1" _make_test_img -b "$TEST_IMG.base" 64M
391
+_make_test_img -o "compat=1.1" -b "$TEST_IMG.base" 64M
392
$QEMU_IO -c "write -z 0 64k" "$TEST_IMG" | _filter_qemu_io
393
$QEMU_IMG snapshot -c foo "$TEST_IMG"
394
$QEMU_IO -c "write -P 0x42 0 128k" "$TEST_IMG" | _filter_qemu_io
395
@@ -XXX,XX +XXX,XX @@ $QEMU_IO -c "read -P 0 0 64k" -c "read -P 0x2a 64k 64k" "$TEST_IMG" | _filter_qe
396
echo
397
echo "=== Testing zero expansion on backed image with shared L2 table ==="
398
echo
399
-IMGOPTS="compat=1.1" TEST_IMG="$TEST_IMG.base" _make_test_img 64M
400
+TEST_IMG="$TEST_IMG.base" _make_test_img -o "compat=1.1" 64M
401
$QEMU_IO -c "write -P 0x2a 0 128k" "$TEST_IMG.base" | _filter_qemu_io
402
-IMGOPTS="compat=1.1" _make_test_img -b "$TEST_IMG.base" 64M
403
+_make_test_img -o "compat=1.1" -b "$TEST_IMG.base" 64M
404
$QEMU_IO -c "write -z 0 128k" "$TEST_IMG" | _filter_qemu_io
405
$QEMU_IMG snapshot -c foo "$TEST_IMG"
406
$QEMU_IMG amend -o "compat=0.10" "$TEST_IMG"
407
@@ -XXX,XX +XXX,XX @@ $QEMU_IO -c "read -P 0 0 128k" "$TEST_IMG" | _filter_qemu_io
408
echo
409
echo "=== Testing preallocated zero expansion on full image ==="
410
echo
411
-IMGOPTS="compat=1.1" TEST_IMG="$TEST_IMG" _make_test_img 64M
412
+TEST_IMG="$TEST_IMG" _make_test_img -o "compat=1.1" 64M
413
$QEMU_IO -c "write -P 0x2a 0 64M" "$TEST_IMG" -c "write -z 0 64M" | _filter_qemu_io
414
$QEMU_IMG amend -o "compat=0.10" "$TEST_IMG"
415
_check_test_img
416
@@ -XXX,XX +XXX,XX @@ $QEMU_IO -c "read -P 0 0 64M" "$TEST_IMG" | _filter_qemu_io
417
echo
418
echo "=== Testing progress report without snapshot ==="
419
echo
420
-IMGOPTS="compat=1.1" TEST_IMG="$TEST_IMG.base" _make_test_img 4G
421
-IMGOPTS="compat=1.1" _make_test_img -b "$TEST_IMG.base" 4G
422
+TEST_IMG="$TEST_IMG.base" _make_test_img -o "compat=1.1" 4G
423
+_make_test_img -o "compat=1.1" -b "$TEST_IMG.base" 4G
424
$QEMU_IO -c "write -z 0 64k" \
425
-c "write -z 1G 64k" \
426
-c "write -z 2G 64k" \
427
@@ -XXX,XX +XXX,XX @@ _check_test_img
428
echo
429
echo "=== Testing progress report with snapshot ==="
430
echo
431
-IMGOPTS="compat=1.1" TEST_IMG="$TEST_IMG.base" _make_test_img 4G
432
-IMGOPTS="compat=1.1" _make_test_img -b "$TEST_IMG.base" 4G
433
+TEST_IMG="$TEST_IMG.base" _make_test_img -o "compat=1.1" 4G
434
+_make_test_img -o "compat=1.1" -b "$TEST_IMG.base" 4G
435
$QEMU_IO -c "write -z 0 64k" \
436
-c "write -z 1G 64k" \
437
-c "write -z 2G 64k" \
438
@@ -XXX,XX +XXX,XX @@ _check_test_img
439
echo
440
echo "=== Testing version downgrade with external data file ==="
441
echo
442
-IMGOPTS="compat=1.1,data_file=$TEST_IMG.data" _make_test_img 64M
443
+_make_test_img -o "compat=1.1,data_file=$TEST_IMG.data" 64M
444
$QEMU_IMG amend -o "compat=0.10" "$TEST_IMG"
445
_img_info --format-specific
446
_check_test_img
447
@@ -XXX,XX +XXX,XX @@ _check_test_img
448
echo
449
echo "=== Try changing the external data file ==="
450
echo
451
-IMGOPTS="compat=1.1" _make_test_img 64M
452
+_make_test_img -o "compat=1.1" 64M
453
$QEMU_IMG amend -o "data_file=foo" "$TEST_IMG"
454
455
echo
456
-IMGOPTS="compat=1.1,data_file=$TEST_IMG.data" _make_test_img 64M
457
+_make_test_img -o "compat=1.1,data_file=$TEST_IMG.data" 64M
458
$QEMU_IMG amend -o "data_file=foo" "$TEST_IMG"
459
_img_info --format-specific
460
TEST_IMG="data-file.filename=$TEST_IMG.data,file.filename=$TEST_IMG" _img_info --format-specific --image-opts
461
@@ -XXX,XX +XXX,XX @@ TEST_IMG="data-file.filename=$TEST_IMG.data,file.filename=$TEST_IMG" _img_info -
462
echo
463
echo "=== Clearing and setting data-file-raw ==="
464
echo
465
-IMGOPTS="compat=1.1,data_file=$TEST_IMG.data,data_file_raw=on" _make_test_img 64M
466
+_make_test_img -o "compat=1.1,data_file=$TEST_IMG.data,data_file_raw=on" 64M
467
$QEMU_IMG amend -o "data_file_raw=on" "$TEST_IMG"
468
_img_info --format-specific
469
_check_test_img
470
diff --git a/tests/qemu-iotests/079 b/tests/qemu-iotests/079
471
index XXXXXXX..XXXXXXX 100755
472
--- a/tests/qemu-iotests/079
473
+++ b/tests/qemu-iotests/079
474
@@ -XXX,XX +XXX,XX @@ echo
475
cluster_sizes="16384 32768 65536 131072 262144 524288 1048576 2097152 4194304"
476
477
for s in $cluster_sizes; do
478
- IMGOPTS=$(_optstr_add "$IMGOPTS" "preallocation=metadata,cluster_size=$s") \
479
- _make_test_img 4G
480
+ _make_test_img -o "preallocation=metadata,cluster_size=$s" 4G
481
done
482
483
# success, all done
484
diff --git a/tests/qemu-iotests/106 b/tests/qemu-iotests/106
485
index XXXXXXX..XXXXXXX 100755
486
--- a/tests/qemu-iotests/106
487
+++ b/tests/qemu-iotests/106
488
@@ -XXX,XX +XXX,XX @@ for create_mode in off falloc full; do
489
echo
490
echo "--- create_mode=$create_mode growth_mode=$growth_mode ---"
491
492
- IMGOPTS="preallocation=$create_mode" _make_test_img ${CREATION_SIZE}K
493
+ _make_test_img -o "preallocation=$create_mode" ${CREATION_SIZE}K
494
$QEMU_IMG resize -f "$IMGFMT" --preallocation=$growth_mode "$TEST_IMG" +${GROWTH_SIZE}K
495
496
expected_size=0
497
diff --git a/tests/qemu-iotests/108 b/tests/qemu-iotests/108
498
index XXXXXXX..XXXXXXX 100755
499
--- a/tests/qemu-iotests/108
500
+++ b/tests/qemu-iotests/108
501
@@ -XXX,XX +XXX,XX @@ echo
502
echo '=== Repairing unreferenced data cluster in new refblock area ==='
503
echo
504
505
-IMGOPTS='cluster_size=512' _make_test_img 64M
506
+_make_test_img -o 'cluster_size=512' 64M
507
# Allocate the first 128 kB in the image (first refblock)
508
$QEMU_IO -c 'write 0 0x1b200' "$TEST_IMG" | _filter_qemu_io
509
# should be 131072 == 0x20000
510
diff --git a/tests/qemu-iotests/112 b/tests/qemu-iotests/112
511
index XXXXXXX..XXXXXXX 100755
512
--- a/tests/qemu-iotests/112
513
+++ b/tests/qemu-iotests/112
514
@@ -XXX,XX +XXX,XX @@ echo '=== refcount_bits limits ==='
515
echo
516
517
# Must be positive (non-zero)
518
-IMGOPTS="$IMGOPTS,refcount_bits=0" _make_test_img 64M
519
+_make_test_img -o "refcount_bits=0" 64M
520
# Must be positive (non-negative)
521
-IMGOPTS="$IMGOPTS,refcount_bits=-1" _make_test_img 64M
522
+_make_test_img -o "refcount_bits=-1" 64M
523
# May not exceed 64
524
-IMGOPTS="$IMGOPTS,refcount_bits=128" _make_test_img 64M
525
+_make_test_img -o "refcount_bits=128" 64M
526
# Must be a power of two
527
-IMGOPTS="$IMGOPTS,refcount_bits=42" _make_test_img 64M
528
+_make_test_img -o "refcount_bits=42" 64M
529
530
# 1 is the minimum
531
-IMGOPTS="$IMGOPTS,refcount_bits=1" _make_test_img 64M
532
+_make_test_img -o "refcount_bits=1" 64M
533
print_refcount_bits
534
535
# 64 is the maximum
536
-IMGOPTS="$IMGOPTS,refcount_bits=64" _make_test_img 64M
537
+_make_test_img -o "refcount_bits=64" 64M
538
print_refcount_bits
539
540
# 16 is the default
541
@@ -XXX,XX +XXX,XX @@ echo '=== refcount_bits and compat=0.10 ==='
542
echo
543
544
# Should work
545
-IMGOPTS="$IMGOPTS,compat=0.10,refcount_bits=16" _make_test_img 64M
546
+_make_test_img -o "compat=0.10,refcount_bits=16" 64M
547
print_refcount_bits
548
549
# Should not work
550
-IMGOPTS="$IMGOPTS,compat=0.10,refcount_bits=1" _make_test_img 64M
551
-IMGOPTS="$IMGOPTS,compat=0.10,refcount_bits=64" _make_test_img 64M
552
+_make_test_img -o "compat=0.10,refcount_bits=1" 64M
553
+_make_test_img -o "compat=0.10,refcount_bits=64" 64M
554
555
556
echo
557
echo '=== Snapshot limit on refcount_bits=1 ==='
558
echo
559
560
-IMGOPTS="$IMGOPTS,refcount_bits=1" _make_test_img 64M
561
+_make_test_img -o "refcount_bits=1" 64M
562
print_refcount_bits
563
564
$QEMU_IO -c 'write 0 512' "$TEST_IMG" | _filter_qemu_io
565
@@ -XXX,XX +XXX,XX @@ echo
566
echo '=== Snapshot limit on refcount_bits=2 ==='
567
echo
568
569
-IMGOPTS="$IMGOPTS,refcount_bits=2" _make_test_img 64M
570
+_make_test_img -o "refcount_bits=2" 64M
571
print_refcount_bits
572
573
$QEMU_IO -c 'write 0 512' "$TEST_IMG" | _filter_qemu_io
574
@@ -XXX,XX +XXX,XX @@ echo
575
echo '=== Compressed clusters with refcount_bits=1 ==='
576
echo
577
578
-IMGOPTS="$IMGOPTS,refcount_bits=1" _make_test_img 64M
579
+_make_test_img -o "refcount_bits=1" 64M
580
print_refcount_bits
581
582
# Both should fit into a single host cluster; instead of failing to increase the
583
@@ -XXX,XX +XXX,XX @@ echo
584
echo '=== MSb set in 64 bit refcount ==='
585
echo
586
587
-IMGOPTS="$IMGOPTS,refcount_bits=64" _make_test_img 64M
588
+_make_test_img -o "refcount_bits=64" 64M
589
print_refcount_bits
590
591
$QEMU_IO -c 'write 0 512' "$TEST_IMG" | _filter_qemu_io
592
@@ -XXX,XX +XXX,XX @@ echo
593
echo '=== Snapshot on maximum 64 bit refcount value ==='
594
echo
595
596
-IMGOPTS="$IMGOPTS,refcount_bits=64" _make_test_img 64M
597
+_make_test_img -o "refcount_bits=64" 64M
598
print_refcount_bits
599
600
$QEMU_IO -c 'write 0 512' "$TEST_IMG" | _filter_qemu_io
601
@@ -XXX,XX +XXX,XX @@ echo
602
echo '=== Testing too many references for check ==='
603
echo
604
605
-IMGOPTS="$IMGOPTS,refcount_bits=1" _make_test_img 64M
606
+_make_test_img -o "refcount_bits=1" 64M
607
print_refcount_bits
608
609
# This cluster should be created at 0x50000
610
@@ -XXX,XX +XXX,XX @@ echo
611
echo '=== Multiple walks necessary during amend ==='
612
echo
613
614
-IMGOPTS="$IMGOPTS,refcount_bits=1,cluster_size=512" _make_test_img 64k
615
+_make_test_img -o "refcount_bits=1,cluster_size=512" 64k
616
617
# Cluster 0 is the image header, clusters 1 to 4 are used by the L1 table, a
618
# single L2 table, the reftable and a single refblock. This creates 58 data
619
diff --git a/tests/qemu-iotests/115 b/tests/qemu-iotests/115
620
index XXXXXXX..XXXXXXX 100755
621
--- a/tests/qemu-iotests/115
622
+++ b/tests/qemu-iotests/115
623
@@ -XXX,XX +XXX,XX @@ echo
624
# least 256 MB. We can achieve that by using preallocation=metadata for an image
625
# which has a guest disk size of 256 MB.
626
627
-IMGOPTS="$IMGOPTS,refcount_bits=64,cluster_size=512,preallocation=metadata" \
628
- _make_test_img 256M
629
+_make_test_img -o "refcount_bits=64,cluster_size=512,preallocation=metadata" 256M
630
631
# We know for sure that the L1 and refcount tables do not overlap with any other
632
# structure because the metadata overlap checks would have caught that case.
633
diff --git a/tests/qemu-iotests/121 b/tests/qemu-iotests/121
634
index XXXXXXX..XXXXXXX 100755
635
--- a/tests/qemu-iotests/121
636
+++ b/tests/qemu-iotests/121
637
@@ -XXX,XX +XXX,XX @@ echo
638
# Preallocation speeds up the write operation, but preallocating everything will
639
# destroy the purpose of the write; so preallocate one KB less than what would
640
# cause a reftable growth...
641
-IMGOPTS='preallocation=metadata,cluster_size=1k' _make_test_img 64512K
642
+_make_test_img -o 'preallocation=metadata,cluster_size=1k' 64512K
643
# ...and make the image the desired size afterwards.
644
$QEMU_IMG resize "$TEST_IMG" 65M
645
646
@@ -XXX,XX +XXX,XX @@ echo
647
echo '--- Test 2 ---'
648
echo
649
650
-IMGOPTS='preallocation=metadata,cluster_size=1k' _make_test_img 64513K
651
+_make_test_img -o 'preallocation=metadata,cluster_size=1k' 64513K
652
# This results in an L1 table growth which in turn results in some clusters at
653
# the start of the image becoming free
654
$QEMU_IMG resize "$TEST_IMG" 65M
655
@@ -XXX,XX +XXX,XX @@ echo
656
echo '=== Allocating a new refcount block must not leave holes in the image ==='
657
echo
658
659
-IMGOPTS='cluster_size=512,refcount_bits=16' _make_test_img 1M
660
+_make_test_img -o 'cluster_size=512,refcount_bits=16' 1M
661
662
# This results in an image with 256 used clusters: the qcow2 header,
663
# the refcount table, one refcount block, the L1 table, four L2 tables
664
diff --git a/tests/qemu-iotests/125 b/tests/qemu-iotests/125
665
index XXXXXXX..XXXXXXX 100755
666
--- a/tests/qemu-iotests/125
667
+++ b/tests/qemu-iotests/125
668
@@ -XXX,XX +XXX,XX @@ for GROWTH_SIZE in 16 48 80; do
669
for growth_mode in off metadata falloc full; do
670
echo "--- cluster_size=$cluster_size growth_size=$GROWTH_SIZE create_mode=$create_mode growth_mode=$growth_mode ---"
671
672
- IMGOPTS="preallocation=$create_mode,cluster_size=$cluster_size" _make_test_img ${CREATION_SIZE}
673
+ _make_test_img -o "preallocation=$create_mode,cluster_size=$cluster_size" ${CREATION_SIZE}
674
$QEMU_IMG resize -f "$IMGFMT" --preallocation=$growth_mode "$TEST_IMG" +${GROWTH_SIZE}K
675
676
host_size_0=$(get_image_size_on_host)
677
diff --git a/tests/qemu-iotests/137 b/tests/qemu-iotests/137
678
index XXXXXXX..XXXXXXX 100755
679
--- a/tests/qemu-iotests/137
680
+++ b/tests/qemu-iotests/137
681
@@ -XXX,XX +XXX,XX @@ $QEMU_IO \
682
-c "reopen -o cache-clean-interval=-1" \
683
"$TEST_IMG" | _filter_qemu_io
684
685
-IMGOPTS="cluster_size=256k" _make_test_img 32P
686
+_make_test_img -o "cluster_size=256k" 32P
687
$QEMU_IO \
688
-c "reopen -o l2-cache-entry-size=512,l2-cache-size=1T" \
689
"$TEST_IMG" | _filter_qemu_io
690
diff --git a/tests/qemu-iotests/138 b/tests/qemu-iotests/138
691
index XXXXXXX..XXXXXXX 100755
692
--- a/tests/qemu-iotests/138
693
+++ b/tests/qemu-iotests/138
694
@@ -XXX,XX +XXX,XX @@ echo
695
echo '=== Check on an image with a multiple of 2^32 clusters ==='
696
echo
697
698
-IMGOPTS=$(_optstr_add "$IMGOPTS" "cluster_size=512") \
699
- _make_test_img 512
700
+_make_test_img -o "cluster_size=512" 512
701
702
# Allocate L2 table
703
$QEMU_IO -c 'write 0 512' "$TEST_IMG" | _filter_qemu_io
704
diff --git a/tests/qemu-iotests/175 b/tests/qemu-iotests/175
705
index XXXXXXX..XXXXXXX 100755
706
--- a/tests/qemu-iotests/175
707
+++ b/tests/qemu-iotests/175
708
@@ -XXX,XX +XXX,XX @@ stat -c "size=%s, blocks=%b" $TEST_IMG | _filter_blocks $extra_blocks $min_block
709
for mode in off full falloc; do
710
echo
711
echo "== creating image with preallocation $mode =="
712
- IMGOPTS=preallocation=$mode _make_test_img $size | _filter_imgfmt
713
+ _make_test_img -o preallocation=$mode $size | _filter_imgfmt
714
stat -c "size=%s, blocks=%b" $TEST_IMG | _filter_blocks $extra_blocks $min_blocks $size
715
done
716
717
diff --git a/tests/qemu-iotests/190 b/tests/qemu-iotests/190
718
index XXXXXXX..XXXXXXX 100755
719
--- a/tests/qemu-iotests/190
720
+++ b/tests/qemu-iotests/190
721
@@ -XXX,XX +XXX,XX @@ _supported_proto file
722
echo "== Huge file =="
723
echo
724
725
-IMGOPTS='cluster_size=2M' _make_test_img 2T
726
+_make_test_img -o 'cluster_size=2M' 2T
727
728
$QEMU_IMG measure -O raw -f qcow2 "$TEST_IMG"
729
$QEMU_IMG measure -O qcow2 -o cluster_size=64k -f qcow2 "$TEST_IMG"
730
diff --git a/tests/qemu-iotests/191 b/tests/qemu-iotests/191
731
index XXXXXXX..XXXXXXX 100755
732
--- a/tests/qemu-iotests/191
733
+++ b/tests/qemu-iotests/191
734
@@ -XXX,XX +XXX,XX @@ echo === Preparing and starting VM ===
735
echo
736
737
TEST_IMG="${TEST_IMG}.base" _make_test_img $size
738
-IMGOPTS=$(_optstr_add "$IMGOPTS" "backing_fmt=$IMGFMT") \
739
- TEST_IMG="${TEST_IMG}.mid" _make_test_img -b "${TEST_IMG}.base"
740
+TEST_IMG="${TEST_IMG}.mid" _make_test_img -o "backing_fmt=$IMGFMT" -b "${TEST_IMG}.base"
741
_make_test_img -b "${TEST_IMG}.mid"
742
TEST_IMG="${TEST_IMG}.ovl2" _make_test_img -b "${TEST_IMG}.mid"
743
744
diff --git a/tests/qemu-iotests/220 b/tests/qemu-iotests/220
745
index XXXXXXX..XXXXXXX 100755
746
--- a/tests/qemu-iotests/220
747
+++ b/tests/qemu-iotests/220
748
@@ -XXX,XX +XXX,XX @@ trap "_cleanup; exit \$status" 0 1 2 3 15
749
_supported_fmt qcow2
750
_supported_proto file
751
_supported_os Linux
752
+# To use a different refcount width but 16 bits we need compat=1.1
753
+_unsupported_imgopts 'compat=0.10'
754
755
echo "== Creating huge file =="
756
757
@@ -XXX,XX +XXX,XX @@ echo "== Creating huge file =="
758
# of a HUGE (but very sparse) file. tmpfs works, ext4 does not.
759
_require_large_file 513T
760
761
-IMGOPTS='cluster_size=2M,refcount_bits=1' _make_test_img 513T
762
+_make_test_img -o 'cluster_size=2M,refcount_bits=1' 513T
763
764
echo "== Populating refcounts =="
765
# We want an image with 256M refcounts * 2M clusters = 512T referenced.
766
diff --git a/tests/qemu-iotests/243 b/tests/qemu-iotests/243
767
index XXXXXXX..XXXXXXX 100755
768
--- a/tests/qemu-iotests/243
769
+++ b/tests/qemu-iotests/243
770
@@ -XXX,XX +XXX,XX @@ trap "_cleanup; exit \$status" 0 1 2 3 15
771
_supported_fmt qcow2
772
_supported_proto file
773
_supported_os Linux
774
+# External data files do not work with compat=0.10
775
+_unsupported_imgopts 'compat=0.10'
776
777
for mode in off metadata falloc full; do
778
779
@@ -XXX,XX +XXX,XX @@ for mode in off metadata falloc full; do
780
echo "=== preallocation=$mode ==="
781
echo
782
783
- IMGOPTS="preallocation=$mode" _make_test_img 64M
784
+ _make_test_img -o "preallocation=$mode" 64M
785
786
printf "File size: "
787
du -b $TEST_IMG | cut -f1
788
@@ -XXX,XX +XXX,XX @@ for mode in off metadata falloc full; do
789
echo "=== External data file: preallocation=$mode ==="
790
echo
791
792
- IMGOPTS="data_file=$TEST_IMG.data,preallocation=$mode" _make_test_img 64M
793
+ _make_test_img -o "data_file=$TEST_IMG.data,preallocation=$mode" 64M
794
795
echo -n "qcow2 file size: "
796
du -b $TEST_IMG | cut -f1
797
diff --git a/tests/qemu-iotests/244 b/tests/qemu-iotests/244
798
index XXXXXXX..XXXXXXX 100755
799
--- a/tests/qemu-iotests/244
800
+++ b/tests/qemu-iotests/244
801
@@ -XXX,XX +XXX,XX @@ trap "_cleanup; exit \$status" 0 1 2 3 15
802
_supported_fmt qcow2
803
_supported_proto file
804
_supported_os Linux
805
+# External data files do not work with compat=0.10
806
+_unsupported_imgopts 'compat=0.10'
807
808
echo
809
echo "=== Create and open image with external data file ==="
810
echo
811
812
echo "With data file name in the image:"
813
-IMGOPTS="data_file=$TEST_IMG.data" _make_test_img 64M
814
+_make_test_img -o "data_file=$TEST_IMG.data" 64M
815
_check_test_img
816
817
$QEMU_IO -c "open $TEST_IMG" -c "read -P 0 0 64k" 2>&1 | _filter_qemu_io | _filter_testdir
818
@@ -XXX,XX +XXX,XX @@ echo
819
echo "=== Standalone image with external data file (efficient) ==="
820
echo
821
822
-IMGOPTS="data_file=$TEST_IMG.data" _make_test_img 64M
823
+_make_test_img -o "data_file=$TEST_IMG.data" 64M
824
825
echo -n "qcow2 file size before I/O: "
826
du -b $TEST_IMG | cut -f1
827
@@ -XXX,XX +XXX,XX @@ echo
828
echo "=== Standalone image with external data file (valid raw) ==="
829
echo
830
831
-IMGOPTS="data_file=$TEST_IMG.data,data_file_raw=on" _make_test_img 64M
832
+_make_test_img -o "data_file=$TEST_IMG.data,data_file_raw=on" 64M
833
834
echo -n "qcow2 file size before I/O: "
835
du -b $TEST_IMG | cut -f1
836
@@ -XXX,XX +XXX,XX @@ echo
837
echo "=== bdrv_co_block_status test for file and offset=0 ==="
838
echo
839
840
-IMGOPTS="data_file=$TEST_IMG.data" _make_test_img 64M
841
+_make_test_img -o "data_file=$TEST_IMG.data" 64M
842
843
$QEMU_IO -c 'write -P 0x11 0 1M' -f $IMGFMT "$TEST_IMG" | _filter_qemu_io
844
$QEMU_IO -c 'read -P 0x11 0 1M' -f $IMGFMT "$TEST_IMG" | _filter_qemu_io
845
diff --git a/tests/qemu-iotests/250 b/tests/qemu-iotests/250
846
index XXXXXXX..XXXXXXX 100755
847
--- a/tests/qemu-iotests/250
848
+++ b/tests/qemu-iotests/250
849
@@ -XXX,XX +XXX,XX @@ disk_usage()
850
}
73
}
851
74
852
size=2100M
75
-static const cmdinfo_t truncate_cmd = {
853
-IMGOPTS="cluster_size=1M,preallocation=metadata"
76
- .name = "truncate",
854
77
- .altname = "t",
855
-_make_test_img $size
78
- .cfunc = truncate_f,
856
+_make_test_img -o "cluster_size=1M,preallocation=metadata" $size
79
- .perm = BLK_PERM_WRITE | BLK_PERM_RESIZE,
857
$QEMU_IO -c 'discard 0 10M' -c 'discard 2090M 10M' \
80
- .argmin = 1,
858
-c 'write 2090M 10M' -c 'write 0 10M' "$TEST_IMG" | _filter_qemu_io
81
- .argmax = 1,
859
82
- .args = "off",
860
diff --git a/tests/qemu-iotests/265 b/tests/qemu-iotests/265
83
- .oneline = "truncates the current file at the given offset",
861
index XXXXXXX..XXXXXXX 100755
84
-};
862
--- a/tests/qemu-iotests/265
85
-
863
+++ b/tests/qemu-iotests/265
86
static int length_f(BlockBackend *blk, int argc, char **argv)
864
@@ -XXX,XX +XXX,XX @@ _supported_os Linux
87
{
865
echo '--- Writing to the image ---'
88
int64_t size;
866
867
# Reduce cluster size so we get more and quicker I/O
868
-IMGOPTS='cluster_size=4096' _make_test_img 1M
869
+_make_test_img -o 'cluster_size=4096' 1M
870
(for ((kb = 1024 - 4; kb >= 0; kb -= 4)); do \
871
echo "aio_write -P 42 $((kb + 1))k 2k"; \
872
done) \
873
--
89
--
874
2.24.1
90
2.29.2
875
91
876
92
diff view generated by jsdifflib
1
Callers can use this new parameter to expect failure during the
1
From: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
2
completion process.
3
2
4
Signed-off-by: Max Reitz <mreitz@redhat.com>
3
Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
5
Reviewed-by: John Snow <jsnow@redhat.com>
4
Reviewed-by: Max Reitz <mreitz@redhat.com>
6
Reviewed-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
5
Message-Id: <20201021145859.11201-11-vsementsov@virtuozzo.com>
7
Message-id: 20191108123455.39445-5-mreitz@redhat.com
8
Signed-off-by: Max Reitz <mreitz@redhat.com>
6
Signed-off-by: Max Reitz <mreitz@redhat.com>
9
---
7
---
10
tests/qemu-iotests/iotests.py | 18 ++++++++++++------
8
tests/qemu-iotests/iotests.py | 7 ++++++-
11
1 file changed, 12 insertions(+), 6 deletions(-)
9
1 file changed, 6 insertions(+), 1 deletion(-)
12
10
13
diff --git a/tests/qemu-iotests/iotests.py b/tests/qemu-iotests/iotests.py
11
diff --git a/tests/qemu-iotests/iotests.py b/tests/qemu-iotests/iotests.py
14
index XXXXXXX..XXXXXXX 100644
12
index XXXXXXX..XXXXXXX 100644
15
--- a/tests/qemu-iotests/iotests.py
13
--- a/tests/qemu-iotests/iotests.py
16
+++ b/tests/qemu-iotests/iotests.py
14
+++ b/tests/qemu-iotests/iotests.py
17
@@ -XXX,XX +XXX,XX @@ class QMPTestCase(unittest.TestCase):
15
@@ -XXX,XX +XXX,XX @@ def qemu_io_log(*args):
18
self.assert_no_active_block_jobs()
16
19
return result
17
def qemu_io_silent(*args):
20
18
'''Run qemu-io and return the exit code, suppressing stdout'''
21
- def wait_until_completed(self, drive='drive0', check_offset=True, wait=60.0):
19
- args = qemu_io_args + list(args)
22
+ def wait_until_completed(self, drive='drive0', check_offset=True, wait=60.0,
20
+ if '-f' in args or '--image-opts' in args:
23
+ error=None):
21
+ default_args = qemu_io_args_no_fmt
24
'''Wait for a block job to finish, returning the event'''
22
+ else:
25
while True:
23
+ default_args = qemu_io_args
26
for event in self.vm.get_qmp_events(wait=wait):
24
+
27
if event['event'] == 'BLOCK_JOB_COMPLETED':
25
+ args = default_args + list(args)
28
self.assert_qmp(event, 'data/device', drive)
26
exitcode = subprocess.call(args, stdout=open('/dev/null', 'w'))
29
- self.assert_qmp_absent(event, 'data/error')
27
if exitcode < 0:
30
- if check_offset:
28
sys.stderr.write('qemu-io received signal %i: %s\n' %
31
- self.assert_qmp(event, 'data/offset', event['data']['len'])
32
+ if error is None:
33
+ self.assert_qmp_absent(event, 'data/error')
34
+ if check_offset:
35
+ self.assert_qmp(event, 'data/offset',
36
+ event['data']['len'])
37
+ else:
38
+ self.assert_qmp(event, 'data/error', error)
39
self.assert_no_active_block_jobs()
40
return event
41
elif event['event'] == 'JOB_STATUS_CHANGE':
42
@@ -XXX,XX +XXX,XX @@ class QMPTestCase(unittest.TestCase):
43
self.assert_qmp(event, 'data/type', 'mirror')
44
self.assert_qmp(event, 'data/offset', event['data']['len'])
45
46
- def complete_and_wait(self, drive='drive0', wait_ready=True):
47
+ def complete_and_wait(self, drive='drive0', wait_ready=True,
48
+ completion_error=None):
49
'''Complete a block job and wait for it to finish'''
50
if wait_ready:
51
self.wait_ready(drive=drive)
52
@@ -XXX,XX +XXX,XX @@ class QMPTestCase(unittest.TestCase):
53
result = self.vm.qmp('block-job-complete', device=drive)
54
self.assert_qmp(result, 'return', {})
55
56
- event = self.wait_until_completed(drive=drive)
57
+ event = self.wait_until_completed(drive=drive, error=completion_error)
58
self.assert_qmp(event, 'data/type', 'mirror')
59
60
def pause_wait(self, job_id='job0'):
61
--
29
--
62
2.24.1
30
2.29.2
63
31
64
32
diff view generated by jsdifflib
1
Just rm will not delete external data files. Use _rm_test_img every
1
From: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
2
time we delete a test image.
3
2
4
(In the process, clean up the indentation of every _cleanup() this patch
3
Add a parameter to skip test if some needed additional formats are not
5
touches.)
4
supported (for example filter drivers).
6
5
7
((Also, use quotes consistently. I am happy to see unquoted instances
6
Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
8
like "rm -rf $TEST_DIR/..." go.))
7
Message-Id: <20201021145859.11201-12-vsementsov@virtuozzo.com>
9
8
Reviewed-by: Max Reitz <mreitz@redhat.com>
10
Signed-off-by: Max Reitz <mreitz@redhat.com>
11
Reviewed-by: Maxim Levitsky <mlevitsk@redhat.com>
12
Message-id: 20191107163708.833192-16-mreitz@redhat.com
13
Signed-off-by: Max Reitz <mreitz@redhat.com>
9
Signed-off-by: Max Reitz <mreitz@redhat.com>
14
---
10
---
15
tests/qemu-iotests/019 | 6 +++---
11
tests/qemu-iotests/iotests.py | 9 ++++++++-
16
tests/qemu-iotests/020 | 6 +++---
12
1 file changed, 8 insertions(+), 1 deletion(-)
17
tests/qemu-iotests/024 | 10 +++++-----
18
tests/qemu-iotests/028 | 2 +-
19
tests/qemu-iotests/029 | 2 +-
20
tests/qemu-iotests/043 | 4 +++-
21
tests/qemu-iotests/048 | 2 +-
22
tests/qemu-iotests/050 | 4 ++--
23
tests/qemu-iotests/053 | 4 ++--
24
tests/qemu-iotests/058 | 2 +-
25
tests/qemu-iotests/059 | 2 +-
26
tests/qemu-iotests/061 | 2 +-
27
tests/qemu-iotests/063 | 6 ++++--
28
tests/qemu-iotests/069 | 2 +-
29
tests/qemu-iotests/074 | 2 +-
30
tests/qemu-iotests/080 | 2 +-
31
tests/qemu-iotests/081 | 6 +++---
32
tests/qemu-iotests/085 | 9 ++++++---
33
tests/qemu-iotests/088 | 2 +-
34
tests/qemu-iotests/092 | 2 +-
35
tests/qemu-iotests/094 | 2 +-
36
tests/qemu-iotests/095 | 5 +++--
37
tests/qemu-iotests/099 | 7 ++++---
38
tests/qemu-iotests/109 | 4 ++--
39
tests/qemu-iotests/110 | 4 ++--
40
tests/qemu-iotests/122 | 6 ++++--
41
tests/qemu-iotests/123 | 2 +-
42
tests/qemu-iotests/141 | 4 +++-
43
tests/qemu-iotests/142 | 2 +-
44
tests/qemu-iotests/144 | 4 +++-
45
tests/qemu-iotests/153 | 10 +++-------
46
tests/qemu-iotests/156 | 8 ++++++--
47
tests/qemu-iotests/159 | 2 +-
48
tests/qemu-iotests/160 | 3 ++-
49
tests/qemu-iotests/161 | 4 ++--
50
tests/qemu-iotests/170 | 2 +-
51
tests/qemu-iotests/172 | 6 +++---
52
tests/qemu-iotests/173 | 3 ++-
53
tests/qemu-iotests/178 | 2 +-
54
tests/qemu-iotests/182 | 2 +-
55
tests/qemu-iotests/183 | 2 +-
56
tests/qemu-iotests/185 | 4 ++--
57
tests/qemu-iotests/187 | 6 +++---
58
tests/qemu-iotests/190 | 2 +-
59
tests/qemu-iotests/191 | 6 +++---
60
tests/qemu-iotests/195 | 2 +-
61
tests/qemu-iotests/197 | 2 +-
62
tests/qemu-iotests/200 | 3 ++-
63
tests/qemu-iotests/215 | 2 +-
64
tests/qemu-iotests/225 | 2 +-
65
tests/qemu-iotests/229 | 3 ++-
66
tests/qemu-iotests/232 | 4 +++-
67
tests/qemu-iotests/243 | 2 +-
68
tests/qemu-iotests/244 | 4 ++--
69
tests/qemu-iotests/247 | 4 +++-
70
tests/qemu-iotests/249 | 4 ++--
71
tests/qemu-iotests/252 | 2 +-
72
57 files changed, 118 insertions(+), 95 deletions(-)
73
13
74
diff --git a/tests/qemu-iotests/019 b/tests/qemu-iotests/019
14
diff --git a/tests/qemu-iotests/iotests.py b/tests/qemu-iotests/iotests.py
75
index XXXXXXX..XXXXXXX 100755
15
index XXXXXXX..XXXXXXX 100644
76
--- a/tests/qemu-iotests/019
16
--- a/tests/qemu-iotests/iotests.py
77
+++ b/tests/qemu-iotests/019
17
+++ b/tests/qemu-iotests/iotests.py
78
@@ -XXX,XX +XXX,XX @@ status=1    # failure is the default!
18
@@ -XXX,XX +XXX,XX @@ def _verify_aio_mode(supported_aio_modes: Sequence[str] = ()) -> None:
79
19
if supported_aio_modes and (aiomode not in supported_aio_modes):
80
_cleanup()
20
notrun('not suitable for this aio mode: %s' % aiomode)
81
{
21
82
-    _cleanup_test_img
22
+def _verify_formats(required_formats: Sequence[str] = ()) -> None:
83
- rm -f "$TEST_IMG.base"
23
+ usf_list = list(set(required_formats) - set(supported_formats()))
84
- rm -f "$TEST_IMG.orig"
24
+ if usf_list:
85
+ _cleanup_test_img
25
+ notrun(f'formats {usf_list} are not whitelisted')
86
+ _rm_test_img "$TEST_IMG.base"
87
+ _rm_test_img "$TEST_IMG.orig"
88
}
89
trap "_cleanup; exit \$status" 0 1 2 3 15
90
91
diff --git a/tests/qemu-iotests/020 b/tests/qemu-iotests/020
92
index XXXXXXX..XXXXXXX 100755
93
--- a/tests/qemu-iotests/020
94
+++ b/tests/qemu-iotests/020
95
@@ -XXX,XX +XXX,XX @@ status=1    # failure is the default!
96
97
_cleanup()
98
{
99
-    _cleanup_test_img
100
- rm -f "$TEST_IMG.base"
101
- rm -f "$TEST_IMG.orig"
102
+ _cleanup_test_img
103
+ _rm_test_img "$TEST_IMG.base"
104
+ _rm_test_img "$TEST_IMG.orig"
105
}
106
trap "_cleanup; exit \$status" 0 1 2 3 15
107
108
diff --git a/tests/qemu-iotests/024 b/tests/qemu-iotests/024
109
index XXXXXXX..XXXXXXX 100755
110
--- a/tests/qemu-iotests/024
111
+++ b/tests/qemu-iotests/024
112
@@ -XXX,XX +XXX,XX @@ status=1    # failure is the default!
113
_cleanup()
114
{
115
_cleanup_test_img
116
- rm -f "$TEST_DIR/t.$IMGFMT.base_old"
117
- rm -f "$TEST_DIR/t.$IMGFMT.base_new"
118
+ _rm_test_img "$TEST_DIR/t.$IMGFMT.base_old"
119
+ _rm_test_img "$TEST_DIR/t.$IMGFMT.base_new"
120
121
- rm -f "$TEST_DIR/subdir/t.$IMGFMT"
122
- rm -f "$TEST_DIR/subdir/t.$IMGFMT.base_old"
123
- rm -f "$TEST_DIR/subdir/t.$IMGFMT.base_new"
124
+ _rm_test_img "$TEST_DIR/subdir/t.$IMGFMT"
125
+ _rm_test_img "$TEST_DIR/subdir/t.$IMGFMT.base_old"
126
+ _rm_test_img "$TEST_DIR/subdir/t.$IMGFMT.base_new"
127
rmdir "$TEST_DIR/subdir" 2> /dev/null
128
}
129
trap "_cleanup; exit \$status" 0 1 2 3 15
130
diff --git a/tests/qemu-iotests/028 b/tests/qemu-iotests/028
131
index XXXXXXX..XXXXXXX 100755
132
--- a/tests/qemu-iotests/028
133
+++ b/tests/qemu-iotests/028
134
@@ -XXX,XX +XXX,XX @@ status=1    # failure is the default!
135
_cleanup()
136
{
137
_cleanup_qemu
138
- rm -f "${TEST_IMG}.copy"
139
+ _rm_test_img "${TEST_IMG}.copy"
140
_cleanup_test_img
141
}
142
trap "_cleanup; exit \$status" 0 1 2 3 15
143
diff --git a/tests/qemu-iotests/029 b/tests/qemu-iotests/029
144
index XXXXXXX..XXXXXXX 100755
145
--- a/tests/qemu-iotests/029
146
+++ b/tests/qemu-iotests/029
147
@@ -XXX,XX +XXX,XX @@ status=1    # failure is the default!
148
149
_cleanup()
150
{
151
- rm -f $TEST_IMG.snap
152
+ _rm_test_img "$TEST_IMG.snap"
153
_cleanup_test_img
154
}
155
trap "_cleanup; exit \$status" 0 1 2 3 15
156
diff --git a/tests/qemu-iotests/043 b/tests/qemu-iotests/043
157
index XXXXXXX..XXXXXXX 100755
158
--- a/tests/qemu-iotests/043
159
+++ b/tests/qemu-iotests/043
160
@@ -XXX,XX +XXX,XX @@ status=1    # failure is the default!
161
_cleanup()
162
{
163
_cleanup_test_img
164
- rm -f "$TEST_IMG".[123].base
165
+ for img in "$TEST_IMG".[123].base; do
166
+ _rm_test_img "$img"
167
+ done
168
}
169
trap "_cleanup; exit \$status" 0 1 2 3 15
170
171
diff --git a/tests/qemu-iotests/048 b/tests/qemu-iotests/048
172
index XXXXXXX..XXXXXXX 100755
173
--- a/tests/qemu-iotests/048
174
+++ b/tests/qemu-iotests/048
175
@@ -XXX,XX +XXX,XX @@ _cleanup()
176
{
177
echo "Cleanup"
178
_cleanup_test_img
179
- rm "${TEST_IMG_FILE2}"
180
+ _rm_test_img "${TEST_IMG_FILE2}"
181
}
182
trap "_cleanup; exit \$status" 0 1 2 3 15
183
184
diff --git a/tests/qemu-iotests/050 b/tests/qemu-iotests/050
185
index XXXXXXX..XXXXXXX 100755
186
--- a/tests/qemu-iotests/050
187
+++ b/tests/qemu-iotests/050
188
@@ -XXX,XX +XXX,XX @@ status=1    # failure is the default!
189
_cleanup()
190
{
191
_cleanup_test_img
192
- rm -f "$TEST_IMG.old"
193
- rm -f "$TEST_IMG.new"
194
+ _rm_test_img "$TEST_IMG.old"
195
+ _rm_test_img "$TEST_IMG.new"
196
}
197
trap "_cleanup; exit \$status" 0 1 2 3 15
198
199
diff --git a/tests/qemu-iotests/053 b/tests/qemu-iotests/053
200
index XXXXXXX..XXXXXXX 100755
201
--- a/tests/qemu-iotests/053
202
+++ b/tests/qemu-iotests/053
203
@@ -XXX,XX +XXX,XX @@ status=1    # failure is the default!
204
205
_cleanup()
206
{
207
-    rm -f "$TEST_IMG.orig"
208
-    _cleanup_test_img
209
+ _rm_test_img "$TEST_IMG.orig"
210
+ _cleanup_test_img
211
}
212
trap "_cleanup; exit \$status" 0 1 2 3 15
213
214
diff --git a/tests/qemu-iotests/058 b/tests/qemu-iotests/058
215
index XXXXXXX..XXXXXXX 100755
216
--- a/tests/qemu-iotests/058
217
+++ b/tests/qemu-iotests/058
218
@@ -XXX,XX +XXX,XX @@ _cleanup()
219
{
220
nbd_server_stop
221
_cleanup_test_img
222
- rm -f "$converted_image"
223
+ _rm_test_img "$converted_image"
224
}
225
trap "_cleanup; exit \$status" 0 1 2 3 15
226
227
diff --git a/tests/qemu-iotests/059 b/tests/qemu-iotests/059
228
index XXXXXXX..XXXXXXX 100755
229
--- a/tests/qemu-iotests/059
230
+++ b/tests/qemu-iotests/059
231
@@ -XXX,XX +XXX,XX @@ status=1    # failure is the default!
232
_cleanup()
233
{
234
_cleanup_test_img
235
- rm -f "$TEST_IMG.qcow2"
236
+ IMGFMT=qcow2 _rm_test_img "$TEST_IMG.qcow2"
237
}
238
trap "_cleanup; exit \$status" 0 1 2 3 15
239
240
diff --git a/tests/qemu-iotests/061 b/tests/qemu-iotests/061
241
index XXXXXXX..XXXXXXX 100755
242
--- a/tests/qemu-iotests/061
243
+++ b/tests/qemu-iotests/061
244
@@ -XXX,XX +XXX,XX @@ status=1    # failure is the default!
245
_cleanup()
246
{
247
_cleanup_test_img
248
- rm -f $TEST_IMG.data
249
+ _rm_test_img "$TEST_IMG.data"
250
}
251
trap "_cleanup; exit \$status" 0 1 2 3 15
252
253
diff --git a/tests/qemu-iotests/063 b/tests/qemu-iotests/063
254
index XXXXXXX..XXXXXXX 100755
255
--- a/tests/qemu-iotests/063
256
+++ b/tests/qemu-iotests/063
257
@@ -XXX,XX +XXX,XX @@ status=1    # failure is the default!
258
259
_cleanup()
260
{
261
-    _cleanup_test_img
262
-    rm -f "$TEST_IMG.orig" "$TEST_IMG.raw1" "$TEST_IMG.raw2"
263
+ _cleanup_test_img
264
+ for img in "$TEST_IMG".{orig,raw1,raw2,target}; do
265
+ _rm_test_img "$img"
266
+ done
267
}
268
trap "_cleanup; exit \$status" 0 1 2 3 15
269
270
diff --git a/tests/qemu-iotests/069 b/tests/qemu-iotests/069
271
index XXXXXXX..XXXXXXX 100755
272
--- a/tests/qemu-iotests/069
273
+++ b/tests/qemu-iotests/069
274
@@ -XXX,XX +XXX,XX @@ echo "=== Creating an image with a backing file and deleting that file ==="
275
echo
276
TEST_IMG="$TEST_IMG.base" _make_test_img $IMG_SIZE
277
_make_test_img -b "$TEST_IMG.base" $IMG_SIZE
278
-rm -f "$TEST_IMG.base"
279
+_rm_test_img "$TEST_IMG.base"
280
# Just open the image and close it right again (this should print an error message)
281
$QEMU_IO -c quit "$TEST_IMG" 2>&1 | _filter_testdir | _filter_imgfmt
282
283
diff --git a/tests/qemu-iotests/074 b/tests/qemu-iotests/074
284
index XXXXXXX..XXXXXXX 100755
285
--- a/tests/qemu-iotests/074
286
+++ b/tests/qemu-iotests/074
287
@@ -XXX,XX +XXX,XX @@ _cleanup()
288
{
289
echo "Cleanup"
290
_cleanup_test_img
291
- rm "${TEST_IMG2}"
292
+ _rm_test_img "${TEST_IMG2}"
293
rm -f "$TEST_DIR/blkdebug.conf"
294
}
295
trap "_cleanup; exit \$status" 0 1 2 3 15
296
diff --git a/tests/qemu-iotests/080 b/tests/qemu-iotests/080
297
index XXXXXXX..XXXXXXX 100755
298
--- a/tests/qemu-iotests/080
299
+++ b/tests/qemu-iotests/080
300
@@ -XXX,XX +XXX,XX @@ status=1    # failure is the default!
301
302
_cleanup()
303
{
304
- rm -f $TEST_IMG.snap
305
+ _rm_test_img "$TEST_IMG.snap"
306
_cleanup_test_img
307
}
308
trap "_cleanup; exit \$status" 0 1 2 3 15
309
diff --git a/tests/qemu-iotests/081 b/tests/qemu-iotests/081
310
index XXXXXXX..XXXXXXX 100755
311
--- a/tests/qemu-iotests/081
312
+++ b/tests/qemu-iotests/081
313
@@ -XXX,XX +XXX,XX @@ status=1    # failure is the default!
314
315
_cleanup()
316
{
317
- rm -rf $TEST_DIR/1.raw
318
- rm -rf $TEST_DIR/2.raw
319
- rm -rf $TEST_DIR/3.raw
320
+ _rm_test_img "$TEST_DIR/1.raw"
321
+ _rm_test_img "$TEST_DIR/2.raw"
322
+ _rm_test_img "$TEST_DIR/3.raw"
323
}
324
trap "_cleanup; exit \$status" 0 1 2 3 15
325
326
diff --git a/tests/qemu-iotests/085 b/tests/qemu-iotests/085
327
index XXXXXXX..XXXXXXX 100755
328
--- a/tests/qemu-iotests/085
329
+++ b/tests/qemu-iotests/085
330
@@ -XXX,XX +XXX,XX @@ _cleanup()
331
_cleanup_qemu
332
for i in $(seq 1 ${SNAPSHOTS})
333
do
334
- rm -f "${TEST_DIR}/${i}-${snapshot_virt0}"
335
- rm -f "${TEST_DIR}/${i}-${snapshot_virt1}"
336
+ _rm_test_img "${TEST_DIR}/${i}-${snapshot_virt0}"
337
+ _rm_test_img "${TEST_DIR}/${i}-${snapshot_virt1}"
338
+ done
339
+ for img in "${TEST_IMG}".{1,2,base}
340
+ do
341
+ _rm_test_img "$img"
342
done
343
- rm -f "${TEST_IMG}" "${TEST_IMG}.1" "${TEST_IMG}.2" "${TEST_IMG}.base"
344
345
}
346
trap "_cleanup; exit \$status" 0 1 2 3 15
347
diff --git a/tests/qemu-iotests/088 b/tests/qemu-iotests/088
348
index XXXXXXX..XXXXXXX 100755
349
--- a/tests/qemu-iotests/088
350
+++ b/tests/qemu-iotests/088
351
@@ -XXX,XX +XXX,XX @@ status=1    # failure is the default!
352
353
_cleanup()
354
{
355
- rm -f $TEST_IMG.snap
356
+ _rm_test_img "$TEST_IMG.snap"
357
_cleanup_test_img
358
}
359
trap "_cleanup; exit \$status" 0 1 2 3 15
360
diff --git a/tests/qemu-iotests/092 b/tests/qemu-iotests/092
361
index XXXXXXX..XXXXXXX 100755
362
--- a/tests/qemu-iotests/092
363
+++ b/tests/qemu-iotests/092
364
@@ -XXX,XX +XXX,XX @@ status=1    # failure is the default!
365
366
_cleanup()
367
{
368
- rm -f $TEST_IMG.snap
369
+ _rm_test_img "$TEST_IMG.snap"
370
_cleanup_test_img
371
}
372
trap "_cleanup; exit \$status" 0 1 2 3 15
373
diff --git a/tests/qemu-iotests/094 b/tests/qemu-iotests/094
374
index XXXXXXX..XXXXXXX 100755
375
--- a/tests/qemu-iotests/094
376
+++ b/tests/qemu-iotests/094
377
@@ -XXX,XX +XXX,XX @@ _cleanup()
378
{
379
_cleanup_qemu
380
_cleanup_test_img
381
- rm -f "$TEST_DIR/source.$IMGFMT"
382
+ _rm_test_img "$TEST_DIR/source.$IMGFMT"
383
}
384
385
trap "_cleanup; exit \$status" 0 1 2 3 15
386
diff --git a/tests/qemu-iotests/095 b/tests/qemu-iotests/095
387
index XXXXXXX..XXXXXXX 100755
388
--- a/tests/qemu-iotests/095
389
+++ b/tests/qemu-iotests/095
390
@@ -XXX,XX +XXX,XX @@ status=1    # failure is the default!
391
_cleanup()
392
{
393
_cleanup_qemu
394
- rm -f "${TEST_IMG}.base" "${TEST_IMG}.snp1"
395
-    _cleanup_test_img
396
+ _rm_test_img "${TEST_IMG}.base"
397
+ _rm_test_img "${TEST_IMG}.snp1"
398
+ _cleanup_test_img
399
}
400
trap "_cleanup; exit \$status" 0 1 2 3 15
401
402
diff --git a/tests/qemu-iotests/099 b/tests/qemu-iotests/099
403
index XXXXXXX..XXXXXXX 100755
404
--- a/tests/qemu-iotests/099
405
+++ b/tests/qemu-iotests/099
406
@@ -XXX,XX +XXX,XX @@ status=1    # failure is the default!
407
408
_cleanup()
409
{
410
-    _cleanup_test_img
411
+ _cleanup_test_img
412
+ _rm_test_img "$TEST_IMG.compare"
413
+ rm -f "$TEST_DIR/blkdebug.conf"
414
+
26
+
415
}
27
def supports_quorum():
416
trap "_cleanup; exit \$status" 0 1 2 3 15
28
return 'quorum' in qemu_img_pipe('--help')
417
29
418
@@ -XXX,XX +XXX,XX @@ echo
30
@@ -XXX,XX +XXX,XX @@ def execute_setup_common(supported_fmts: Sequence[str] = (),
419
test_qemu "file.driver=blkdebug,file.image.filename=$TEST_IMG"
31
supported_aio_modes: Sequence[str] = (),
420
32
unsupported_fmts: Sequence[str] = (),
421
33
supported_protocols: Sequence[str] = (),
422
-rm -f "$TEST_IMG.compare" "$TEST_DIR/blkdebug.conf"
34
- unsupported_protocols: Sequence[str] = ()) -> bool:
423
-
35
+ unsupported_protocols: Sequence[str] = (),
424
# success, all done
36
+ required_fmts: Sequence[str] = ()) -> bool:
425
echo "*** done"
37
"""
426
rm -f $seq.full
38
Perform necessary setup for either script-style or unittest-style tests.
427
diff --git a/tests/qemu-iotests/109 b/tests/qemu-iotests/109
39
428
index XXXXXXX..XXXXXXX 100755
40
@@ -XXX,XX +XXX,XX @@ def execute_setup_common(supported_fmts: Sequence[str] = (),
429
--- a/tests/qemu-iotests/109
41
_verify_platform(supported=supported_platforms)
430
+++ b/tests/qemu-iotests/109
42
_verify_cache_mode(supported_cache_modes)
431
@@ -XXX,XX +XXX,XX @@ status=1    # failure is the default!
43
_verify_aio_mode(supported_aio_modes)
432
_cleanup()
44
+ _verify_formats(required_fmts)
433
{
45
434
_cleanup_qemu
46
return debug
435
- rm -f $TEST_IMG.src
436
-    _cleanup_test_img
437
+ _rm_test_img "$TEST_IMG.src"
438
+ _cleanup_test_img
439
}
440
trap "_cleanup; exit \$status" 0 1 2 3 15
441
442
diff --git a/tests/qemu-iotests/110 b/tests/qemu-iotests/110
443
index XXXXXXX..XXXXXXX 100755
444
--- a/tests/qemu-iotests/110
445
+++ b/tests/qemu-iotests/110
446
@@ -XXX,XX +XXX,XX @@ status=1    # failure is the default!
447
448
_cleanup()
449
{
450
-    _cleanup_test_img
451
- rm -f "$TEST_IMG.copy"
452
+ _cleanup_test_img
453
+ _rm_test_img "$TEST_IMG.copy"
454
}
455
trap "_cleanup; exit \$status" 0 1 2 3 15
456
457
diff --git a/tests/qemu-iotests/122 b/tests/qemu-iotests/122
458
index XXXXXXX..XXXXXXX 100755
459
--- a/tests/qemu-iotests/122
460
+++ b/tests/qemu-iotests/122
461
@@ -XXX,XX +XXX,XX @@ status=1    # failure is the default!
462
463
_cleanup()
464
{
465
- rm -f "$TEST_IMG".[123]
466
-    _cleanup_test_img
467
+ for img in "$TEST_IMG".[123]; do
468
+ _rm_test_img "$img"
469
+ done
470
+ _cleanup_test_img
471
}
472
trap "_cleanup; exit \$status" 0 1 2 3 15
473
474
diff --git a/tests/qemu-iotests/123 b/tests/qemu-iotests/123
475
index XXXXXXX..XXXXXXX 100755
476
--- a/tests/qemu-iotests/123
477
+++ b/tests/qemu-iotests/123
478
@@ -XXX,XX +XXX,XX @@ status=1    # failure is the default!
479
_cleanup()
480
{
481
_cleanup_test_img
482
- rm -f "$SRC_IMG"
483
+ _rm_test_img "$SRC_IMG"
484
}
485
trap "_cleanup; exit \$status" 0 1 2 3 15
486
487
diff --git a/tests/qemu-iotests/141 b/tests/qemu-iotests/141
488
index XXXXXXX..XXXXXXX 100755
489
--- a/tests/qemu-iotests/141
490
+++ b/tests/qemu-iotests/141
491
@@ -XXX,XX +XXX,XX @@ _cleanup()
492
{
493
_cleanup_qemu
494
_cleanup_test_img
495
- rm -f "$TEST_DIR"/{b,m,o}.$IMGFMT
496
+ for img in "$TEST_DIR"/{b,m,o}.$IMGFMT; do
497
+ _rm_test_img "$img"
498
+ done
499
}
500
trap "_cleanup; exit \$status" 0 1 2 3 15
501
502
diff --git a/tests/qemu-iotests/142 b/tests/qemu-iotests/142
503
index XXXXXXX..XXXXXXX 100755
504
--- a/tests/qemu-iotests/142
505
+++ b/tests/qemu-iotests/142
506
@@ -XXX,XX +XXX,XX @@ status=1    # failure is the default!
507
_cleanup()
508
{
509
_cleanup_test_img
510
- rm -f $TEST_IMG.snap
511
+ _rm_test_img "$TEST_IMG.snap"
512
}
513
trap "_cleanup; exit \$status" 0 1 2 3 15
514
515
diff --git a/tests/qemu-iotests/144 b/tests/qemu-iotests/144
516
index XXXXXXX..XXXXXXX 100755
517
--- a/tests/qemu-iotests/144
518
+++ b/tests/qemu-iotests/144
519
@@ -XXX,XX +XXX,XX @@ TMP_SNAP2=${TEST_DIR}/tmp2.qcow2
520
_cleanup()
521
{
522
_cleanup_qemu
523
- rm -f "${TEST_IMG}" "${TMP_SNAP1}" "${TMP_SNAP2}"
524
+ for img in "${TEST_IMG}" "${TMP_SNAP1}" "${TMP_SNAP2}"; do
525
+ _rm_test_img "$img"
526
+ done
527
}
528
529
trap "_cleanup; exit \$status" 0 1 2 3 15
530
diff --git a/tests/qemu-iotests/153 b/tests/qemu-iotests/153
531
index XXXXXXX..XXXXXXX 100755
532
--- a/tests/qemu-iotests/153
533
+++ b/tests/qemu-iotests/153
534
@@ -XXX,XX +XXX,XX @@ status=1    # failure is the default!
535
_cleanup()
536
{
537
_cleanup_test_img
538
- rm -f "${TEST_IMG}.base"
539
- rm -f "${TEST_IMG}.overlay"
540
- rm -f "${TEST_IMG}.convert"
541
- rm -f "${TEST_IMG}.a"
542
- rm -f "${TEST_IMG}.b"
543
- rm -f "${TEST_IMG}.c"
544
- rm -f "${TEST_IMG}.lnk"
545
+ for img in "${TEST_IMG}".{base,overlay,convert,a,b,c,lnk}; do
546
+ _rm_test_img "$img"
547
+ done
548
}
549
trap "_cleanup; exit \$status" 0 1 2 3 15
550
551
diff --git a/tests/qemu-iotests/156 b/tests/qemu-iotests/156
552
index XXXXXXX..XXXXXXX 100755
553
--- a/tests/qemu-iotests/156
554
+++ b/tests/qemu-iotests/156
555
@@ -XXX,XX +XXX,XX @@ status=1    # failure is the default!
556
_cleanup()
557
{
558
_cleanup_qemu
559
- rm -f "$TEST_IMG"{,.target}{,.backing,.overlay}
560
+ for img in "$TEST_IMG"{,.target}{,.backing,.overlay}; do
561
+ _rm_test_img "$img"
562
+ done
563
}
564
trap "_cleanup; exit \$status" 0 1 2 3 15
565
566
@@ -XXX,XX +XXX,XX @@ _send_qemu_cmd $QEMU_HANDLE \
567
'"status": "null"'
568
569
# Remove the source images
570
-rm -f "$TEST_IMG{,.backing,.overlay}"
571
+for img in "$TEST_IMG{,.backing,.overlay}"; do
572
+ _rm_test_img "$img"
573
+done
574
575
echo
576
577
diff --git a/tests/qemu-iotests/159 b/tests/qemu-iotests/159
578
index XXXXXXX..XXXXXXX 100755
579
--- a/tests/qemu-iotests/159
580
+++ b/tests/qemu-iotests/159
581
@@ -XXX,XX +XXX,XX @@ status=1
582
_cleanup()
583
{
584
_cleanup_test_img
585
- rm -f "$TEST_IMG.out"
586
+ _rm_test_img "$TEST_IMG.out"
587
}
588
trap "_cleanup; exit \$status" 0 1 2 3 15
589
590
diff --git a/tests/qemu-iotests/160 b/tests/qemu-iotests/160
591
index XXXXXXX..XXXXXXX 100755
592
--- a/tests/qemu-iotests/160
593
+++ b/tests/qemu-iotests/160
594
@@ -XXX,XX +XXX,XX @@ status=1
595
_cleanup()
596
{
597
_cleanup_test_img
598
- rm -f "$TEST_IMG.out" "$TEST_IMG.out.dd"
599
+ _rm_test_img "$TEST_IMG.out"
600
+ _rm_test_img "$TEST_IMG.out.dd"
601
}
602
trap "_cleanup; exit \$status" 0 1 2 3 15
603
604
diff --git a/tests/qemu-iotests/161 b/tests/qemu-iotests/161
605
index XXXXXXX..XXXXXXX 100755
606
--- a/tests/qemu-iotests/161
607
+++ b/tests/qemu-iotests/161
608
@@ -XXX,XX +XXX,XX @@ status=1    # failure is the default!
609
_cleanup()
610
{
611
_cleanup_test_img
612
- rm -f "$TEST_IMG.base"
613
- rm -f "$TEST_IMG.int"
614
+ _rm_test_img "$TEST_IMG.base"
615
+ _rm_test_img "$TEST_IMG.int"
616
}
617
trap "_cleanup; exit \$status" 0 1 2 3 15
618
619
diff --git a/tests/qemu-iotests/170 b/tests/qemu-iotests/170
620
index XXXXXXX..XXXXXXX 100755
621
--- a/tests/qemu-iotests/170
622
+++ b/tests/qemu-iotests/170
623
@@ -XXX,XX +XXX,XX @@ status=1
624
_cleanup()
625
{
626
_cleanup_test_img
627
- rm -f "$TEST_IMG.out"
628
+ _rm_test_img "$TEST_IMG.out"
629
}
630
trap "_cleanup; exit \$status" 0 1 2 3 15
631
632
diff --git a/tests/qemu-iotests/172 b/tests/qemu-iotests/172
633
index XXXXXXX..XXXXXXX 100755
634
--- a/tests/qemu-iotests/172
635
+++ b/tests/qemu-iotests/172
636
@@ -XXX,XX +XXX,XX @@ status=1    # failure is the default!
637
638
_cleanup()
639
{
640
-    _cleanup_test_img
641
- rm -f "$TEST_IMG.2"
642
- rm -f "$TEST_IMG.3"
643
+ _cleanup_test_img
644
+ _rm_test_img "$TEST_IMG.2"
645
+ _rm_test_img "$TEST_IMG.3"
646
}
647
trap "_cleanup; exit \$status" 0 1 2 3 15
648
649
diff --git a/tests/qemu-iotests/173 b/tests/qemu-iotests/173
650
index XXXXXXX..XXXXXXX 100755
651
--- a/tests/qemu-iotests/173
652
+++ b/tests/qemu-iotests/173
653
@@ -XXX,XX +XXX,XX @@ status=1 # failure is the default!
654
_cleanup()
655
{
656
_cleanup_qemu
657
- rm -f "${QEMU_TEST_DIR}/image.base" "${QEMU_TEST_DIR}/image.snp1"
658
+ _rm_test_img "${TEST_DIR}/image.base"
659
+ _rm_test_img "${TEST_DIR}/image.snp1"
660
_cleanup_test_img
661
}
662
trap "_cleanup; exit \$status" 0 1 2 3 15
663
diff --git a/tests/qemu-iotests/178 b/tests/qemu-iotests/178
664
index XXXXXXX..XXXXXXX 100755
665
--- a/tests/qemu-iotests/178
666
+++ b/tests/qemu-iotests/178
667
@@ -XXX,XX +XXX,XX @@ status=1 # failure is the default!
668
_cleanup()
669
{
670
_cleanup_test_img
671
- rm -f "$TEST_IMG.converted"
672
+ _rm_test_img "$TEST_IMG.converted"
673
}
674
trap "_cleanup; exit \$status" 0 1 2 3 15
675
676
diff --git a/tests/qemu-iotests/182 b/tests/qemu-iotests/182
677
index XXXXXXX..XXXXXXX 100755
678
--- a/tests/qemu-iotests/182
679
+++ b/tests/qemu-iotests/182
680
@@ -XXX,XX +XXX,XX @@ status=1    # failure is the default!
681
_cleanup()
682
{
683
_cleanup_test_img
684
- rm -f "$TEST_IMG.overlay"
685
+ _rm_test_img "$TEST_IMG.overlay"
686
rm -f "$SOCK_DIR/nbd.socket"
687
}
688
trap "_cleanup; exit \$status" 0 1 2 3 15
689
diff --git a/tests/qemu-iotests/183 b/tests/qemu-iotests/183
690
index XXXXXXX..XXXXXXX 100755
691
--- a/tests/qemu-iotests/183
692
+++ b/tests/qemu-iotests/183
693
@@ -XXX,XX +XXX,XX @@ MIG_SOCKET="${SOCK_DIR}/migrate"
694
_cleanup()
695
{
696
rm -f "${MIG_SOCKET}"
697
- rm -f "${TEST_IMG}.dest"
698
+ _rm_test_img "${TEST_IMG}.dest"
699
_cleanup_test_img
700
_cleanup_qemu
701
}
702
diff --git a/tests/qemu-iotests/185 b/tests/qemu-iotests/185
703
index XXXXXXX..XXXXXXX 100755
704
--- a/tests/qemu-iotests/185
705
+++ b/tests/qemu-iotests/185
706
@@ -XXX,XX +XXX,XX @@ status=1 # failure is the default!
707
708
_cleanup()
709
{
710
- rm -f "${TEST_IMG}.mid"
711
- rm -f "${TEST_IMG}.copy"
712
+ _rm_test_img "${TEST_IMG}.mid"
713
+ _rm_test_img "${TEST_IMG}.copy"
714
_cleanup_test_img
715
_cleanup_qemu
716
}
717
diff --git a/tests/qemu-iotests/187 b/tests/qemu-iotests/187
718
index XXXXXXX..XXXXXXX 100755
719
--- a/tests/qemu-iotests/187
720
+++ b/tests/qemu-iotests/187
721
@@ -XXX,XX +XXX,XX @@ status=1    # failure is the default!
722
723
_cleanup()
724
{
725
-    _cleanup_test_img
726
- rm -f "$TEST_IMG.2"
727
- rm -f "$TEST_IMG.3"
728
+ _cleanup_test_img
729
+ _rm_test_img "$TEST_IMG.2"
730
+ _rm_test_img "$TEST_IMG.3"
731
}
732
trap "_cleanup; exit \$status" 0 1 2 3 15
733
734
diff --git a/tests/qemu-iotests/190 b/tests/qemu-iotests/190
735
index XXXXXXX..XXXXXXX 100755
736
--- a/tests/qemu-iotests/190
737
+++ b/tests/qemu-iotests/190
738
@@ -XXX,XX +XXX,XX @@ status=1 # failure is the default!
739
_cleanup()
740
{
741
_cleanup_test_img
742
- rm -f "$TEST_IMG.converted"
743
+ _rm_test_img "$TEST_IMG.converted"
744
}
745
trap "_cleanup; exit \$status" 0 1 2 3 15
746
747
diff --git a/tests/qemu-iotests/191 b/tests/qemu-iotests/191
748
index XXXXXXX..XXXXXXX 100755
749
--- a/tests/qemu-iotests/191
750
+++ b/tests/qemu-iotests/191
751
@@ -XXX,XX +XXX,XX @@ status=1 # failure is the default!
752
753
_cleanup()
754
{
755
- rm -f "${TEST_IMG}.mid"
756
- rm -f "${TEST_IMG}.ovl2"
757
- rm -f "${TEST_IMG}.ovl3"
758
+ _rm_test_img "${TEST_IMG}.mid"
759
+ _rm_test_img "${TEST_IMG}.ovl2"
760
+ _rm_test_img "${TEST_IMG}.ovl3"
761
_cleanup_test_img
762
_cleanup_qemu
763
}
764
diff --git a/tests/qemu-iotests/195 b/tests/qemu-iotests/195
765
index XXXXXXX..XXXXXXX 100755
766
--- a/tests/qemu-iotests/195
767
+++ b/tests/qemu-iotests/195
768
@@ -XXX,XX +XXX,XX @@ status=1 # failure is the default!
769
_cleanup()
770
{
771
_cleanup_test_img
772
- rm -f "$TEST_IMG.mid"
773
+ _rm_test_img "$TEST_IMG.mid"
774
}
775
trap "_cleanup; exit \$status" 0 1 2 3 15
776
777
diff --git a/tests/qemu-iotests/197 b/tests/qemu-iotests/197
778
index XXXXXXX..XXXXXXX 100755
779
--- a/tests/qemu-iotests/197
780
+++ b/tests/qemu-iotests/197
781
@@ -XXX,XX +XXX,XX @@ esac
782
_cleanup()
783
{
784
_cleanup_test_img
785
- rm -f "$TEST_WRAP"
786
+ _rm_test_img "$TEST_WRAP"
787
rm -f "$BLKDBG_CONF"
788
}
789
trap "_cleanup; exit \$status" 0 1 2 3 15
790
diff --git a/tests/qemu-iotests/200 b/tests/qemu-iotests/200
791
index XXXXXXX..XXXXXXX 100755
792
--- a/tests/qemu-iotests/200
793
+++ b/tests/qemu-iotests/200
794
@@ -XXX,XX +XXX,XX @@ status=1 # failure is the default!
795
_cleanup()
796
{
797
_cleanup_qemu
798
- rm -f "${TEST_IMG}" "${BACKING_IMG}"
799
+ _rm_test_img "${TEST_IMG}"
800
+ _rm_test_img "${BACKING_IMG}"
801
}
802
trap "_cleanup; exit \$status" 0 1 2 3 15
803
804
diff --git a/tests/qemu-iotests/215 b/tests/qemu-iotests/215
805
index XXXXXXX..XXXXXXX 100755
806
--- a/tests/qemu-iotests/215
807
+++ b/tests/qemu-iotests/215
808
@@ -XXX,XX +XXX,XX @@ esac
809
_cleanup()
810
{
811
_cleanup_test_img
812
- rm -f "$TEST_WRAP"
813
+ _rm_test_img "$TEST_WRAP"
814
rm -f "$BLKDBG_CONF"
815
}
816
trap "_cleanup; exit \$status" 0 1 2 3 15
817
diff --git a/tests/qemu-iotests/225 b/tests/qemu-iotests/225
818
index XXXXXXX..XXXXXXX 100755
819
--- a/tests/qemu-iotests/225
820
+++ b/tests/qemu-iotests/225
821
@@ -XXX,XX +XXX,XX @@ status=1    # failure is the default!
822
_cleanup()
823
{
824
_cleanup_test_img
825
- rm -f "$TEST_IMG.not_base"
826
+ _rm_test_img "$TEST_IMG.not_base"
827
}
828
trap "_cleanup; exit \$status" 0 1 2 3 15
829
830
diff --git a/tests/qemu-iotests/229 b/tests/qemu-iotests/229
831
index XXXXXXX..XXXXXXX 100755
832
--- a/tests/qemu-iotests/229
833
+++ b/tests/qemu-iotests/229
834
@@ -XXX,XX +XXX,XX @@ _cleanup()
835
{
836
_cleanup_qemu
837
_cleanup_test_img
838
- rm -f "$TEST_IMG" "$DEST_IMG"
839
+ _rm_test_img "$TEST_IMG"
840
+ _rm_test_img "$DEST_IMG"
841
}
842
trap "_cleanup; exit \$status" 0 1 2 3 15
843
844
diff --git a/tests/qemu-iotests/232 b/tests/qemu-iotests/232
845
index XXXXXXX..XXXXXXX 100755
846
--- a/tests/qemu-iotests/232
847
+++ b/tests/qemu-iotests/232
848
@@ -XXX,XX +XXX,XX @@ status=1    # failure is the default!
849
_cleanup()
850
{
851
_cleanup_test_img
852
- rm -f $TEST_IMG.[01234]
853
+ for img in "$TEST_IMG".[01234]; do
854
+ _rm_test_img "$img"
855
+ done
856
}
857
trap "_cleanup; exit \$status" 0 1 2 3 15
858
859
diff --git a/tests/qemu-iotests/243 b/tests/qemu-iotests/243
860
index XXXXXXX..XXXXXXX 100755
861
--- a/tests/qemu-iotests/243
862
+++ b/tests/qemu-iotests/243
863
@@ -XXX,XX +XXX,XX @@ status=1    # failure is the default!
864
_cleanup()
865
{
866
_cleanup_test_img
867
- rm -f $TEST_IMG.data
868
+ _rm_test_img "$TEST_IMG.data"
869
}
870
trap "_cleanup; exit \$status" 0 1 2 3 15
871
872
diff --git a/tests/qemu-iotests/244 b/tests/qemu-iotests/244
873
index XXXXXXX..XXXXXXX 100755
874
--- a/tests/qemu-iotests/244
875
+++ b/tests/qemu-iotests/244
876
@@ -XXX,XX +XXX,XX @@ status=1    # failure is the default!
877
_cleanup()
878
{
879
_cleanup_test_img
880
- rm -f $TEST_IMG.data
881
- rm -f $TEST_IMG.src
882
+ _rm_test_img "$TEST_IMG.data"
883
+ _rm_test_img "$TEST_IMG.src"
884
}
885
trap "_cleanup; exit \$status" 0 1 2 3 15
886
887
diff --git a/tests/qemu-iotests/247 b/tests/qemu-iotests/247
888
index XXXXXXX..XXXXXXX 100755
889
--- a/tests/qemu-iotests/247
890
+++ b/tests/qemu-iotests/247
891
@@ -XXX,XX +XXX,XX @@ status=1    # failure is the default!
892
_cleanup()
893
{
894
_cleanup_test_img
895
- rm -f $TEST_IMG.[01234]
896
+ for img in "$TEST_IMG".[01234]; do
897
+ _rm_test_img "$img"
898
+ done
899
}
900
trap "_cleanup; exit \$status" 0 1 2 3 15
901
902
diff --git a/tests/qemu-iotests/249 b/tests/qemu-iotests/249
903
index XXXXXXX..XXXXXXX 100755
904
--- a/tests/qemu-iotests/249
905
+++ b/tests/qemu-iotests/249
906
@@ -XXX,XX +XXX,XX @@ status=1    # failure is the default!
907
_cleanup()
908
{
909
_cleanup_test_img
910
- rm -f "$TEST_IMG.base"
911
- rm -f "$TEST_IMG.int"
912
+ _rm_test_img "$TEST_IMG.base"
913
+ _rm_test_img "$TEST_IMG.int"
914
}
915
trap "_cleanup; exit \$status" 0 1 2 3 15
916
917
diff --git a/tests/qemu-iotests/252 b/tests/qemu-iotests/252
918
index XXXXXXX..XXXXXXX 100755
919
--- a/tests/qemu-iotests/252
920
+++ b/tests/qemu-iotests/252
921
@@ -XXX,XX +XXX,XX @@ status=1    # failure is the default!
922
_cleanup()
923
{
924
_cleanup_test_img
925
- rm -f "$TEST_IMG.base_new"
926
+ _rm_test_img "$TEST_IMG.base_new"
927
}
928
trap "_cleanup; exit \$status" 0 1 2 3 15
929
47
930
--
48
--
931
2.24.1
49
2.29.2
932
50
933
51
diff view generated by jsdifflib
1
Signed-off-by: Max Reitz <mreitz@redhat.com>
1
From: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
2
Reviewed-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
2
3
Tested-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
3
Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
4
Reviewed-by: John Snow <jsnow@redhat.com>
4
Message-Id: <20201021145859.11201-13-vsementsov@virtuozzo.com>
5
Message-id: 20191108123455.39445-6-mreitz@redhat.com
5
Reviewed-by: Max Reitz <mreitz@redhat.com>
6
Signed-off-by: Max Reitz <mreitz@redhat.com>
6
Signed-off-by: Max Reitz <mreitz@redhat.com>
7
---
7
---
8
tests/qemu-iotests/041 | 44 ++++++++++++++++++++++++++++++++++++++
8
tests/qemu-iotests/298 | 186 +++++++++++++++++++++++++++++++++++++
9
tests/qemu-iotests/041.out | 4 ++--
9
tests/qemu-iotests/298.out | 5 +
10
2 files changed, 46 insertions(+), 2 deletions(-)
10
tests/qemu-iotests/group | 1 +
11
11
3 files changed, 192 insertions(+)
12
diff --git a/tests/qemu-iotests/041 b/tests/qemu-iotests/041
12
create mode 100644 tests/qemu-iotests/298
13
index XXXXXXX..XXXXXXX 100755
13
create mode 100644 tests/qemu-iotests/298.out
14
--- a/tests/qemu-iotests/041
14
15
+++ b/tests/qemu-iotests/041
15
diff --git a/tests/qemu-iotests/298 b/tests/qemu-iotests/298
16
@@ -XXX,XX +XXX,XX @@ class TestOrphanedSource(iotests.QMPTestCase):
16
new file mode 100644
17
target='dest-ro')
17
index XXXXXXX..XXXXXXX
18
self.assert_qmp(result, 'error/class', 'GenericError')
18
--- /dev/null
19
19
+++ b/tests/qemu-iotests/298
20
+ def test_failing_permission_in_complete(self):
20
@@ -XXX,XX +XXX,XX @@
21
+ self.assert_no_active_block_jobs()
21
+#!/usr/bin/env python3
22
+
22
+#
23
+ # Unshare consistent-read on the target
23
+# Test for preallocate filter
24
+ # (The mirror job does not care)
24
+#
25
+ result = self.vm.qmp('blockdev-add',
25
+# Copyright (c) 2020 Virtuozzo International GmbH.
26
+ driver='blkdebug',
26
+#
27
+ node_name='dest-perm',
27
+# This program is free software; you can redistribute it and/or modify
28
+ image='dest',
28
+# it under the terms of the GNU General Public License as published by
29
+ unshare_child_perms=['consistent-read'])
29
+# the Free Software Foundation; either version 2 of the License, or
30
+# (at your option) any later version.
31
+#
32
+# This program is distributed in the hope that it will be useful,
33
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
34
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
35
+# GNU General Public License for more details.
36
+#
37
+# You should have received a copy of the GNU General Public License
38
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
39
+#
40
+
41
+import os
42
+import iotests
43
+
44
+MiB = 1024 * 1024
45
+disk = os.path.join(iotests.test_dir, 'disk')
46
+overlay = os.path.join(iotests.test_dir, 'overlay')
47
+refdisk = os.path.join(iotests.test_dir, 'refdisk')
48
+drive_opts = f'node-name=disk,driver={iotests.imgfmt},' \
49
+ f'file.node-name=filter,file.driver=preallocate,' \
50
+ f'file.file.node-name=file,file.file.filename={disk}'
51
+
52
+
53
+class TestPreallocateBase(iotests.QMPTestCase):
54
+ def setUp(self):
55
+ iotests.qemu_img_create('-f', iotests.imgfmt, disk, str(10 * MiB))
56
+
57
+ def tearDown(self):
58
+ try:
59
+ self.check_small()
60
+ check = iotests.qemu_img_check(disk)
61
+ self.assertFalse('leaks' in check)
62
+ self.assertFalse('corruptions' in check)
63
+ self.assertEqual(check['check-errors'], 0)
64
+ finally:
65
+ os.remove(disk)
66
+
67
+ def check_big(self):
68
+ self.assertTrue(os.path.getsize(disk) > 100 * MiB)
69
+
70
+ def check_small(self):
71
+ self.assertTrue(os.path.getsize(disk) < 10 * MiB)
72
+
73
+
74
+class TestQemuImg(TestPreallocateBase):
75
+ def test_qemu_img(self):
76
+ p = iotests.QemuIoInteractive('--image-opts', drive_opts)
77
+
78
+ p.cmd('write 0 1M')
79
+ p.cmd('flush')
80
+
81
+ self.check_big()
82
+
83
+ p.close()
84
+
85
+
86
+class TestPreallocateFilter(TestPreallocateBase):
87
+ def setUp(self):
88
+ super().setUp()
89
+ self.vm = iotests.VM().add_drive(path=None, opts=drive_opts)
90
+ self.vm.launch()
91
+
92
+ def tearDown(self):
93
+ self.vm.shutdown()
94
+ super().tearDown()
95
+
96
+ def test_prealloc(self):
97
+ self.vm.hmp_qemu_io('drive0', 'write 0 1M')
98
+ self.check_big()
99
+
100
+ def test_external_snapshot(self):
101
+ self.test_prealloc()
102
+
103
+ result = self.vm.qmp('blockdev-snapshot-sync', node_name='disk',
104
+ snapshot_file=overlay,
105
+ snapshot_node_name='overlay')
30
+ self.assert_qmp(result, 'return', {})
106
+ self.assert_qmp(result, 'return', {})
31
+
107
+
32
+ result = self.vm.qmp('blockdev-mirror', job_id='job', device='src',
108
+ # on reopen to r-o base preallocation should be dropped
33
+ sync='full', target='dest',
109
+ self.check_small()
34
+ filter_node_name='mirror-filter')
110
+
111
+ self.vm.hmp_qemu_io('drive0', 'write 1M 1M')
112
+
113
+ result = self.vm.qmp('block-commit', device='overlay')
35
+ self.assert_qmp(result, 'return', {})
114
+ self.assert_qmp(result, 'return', {})
36
+
115
+ self.complete_and_wait()
37
+ # Require consistent-read on the source
116
+
38
+ # (We can only add this node once the job has started, or it
117
+ # commit of new megabyte should trigger preallocation
39
+ # will complain that it does not want to run on non-root nodes)
118
+ self.check_big()
40
+ result = self.vm.qmp('blockdev-add',
119
+
41
+ driver='blkdebug',
120
+ def test_reopen_opts(self):
42
+ node_name='src-perm',
121
+ result = self.vm.qmp('x-blockdev-reopen', **{
43
+ image='src',
122
+ 'node-name': 'disk',
44
+ take_child_perms=['consistent-read'])
123
+ 'driver': iotests.imgfmt,
124
+ 'file': {
125
+ 'node-name': 'filter',
126
+ 'driver': 'preallocate',
127
+ 'prealloc-size': 20 * MiB,
128
+ 'prealloc-align': 5 * MiB,
129
+ 'file': {
130
+ 'node-name': 'file',
131
+ 'driver': 'file',
132
+ 'filename': disk
133
+ }
134
+ }
135
+ })
45
+ self.assert_qmp(result, 'return', {})
136
+ self.assert_qmp(result, 'return', {})
46
+
137
+
47
+ # While completing, mirror will attempt to replace src by
138
+ self.vm.hmp_qemu_io('drive0', 'write 0 1M')
48
+ # dest, which must fail because src-perm requires
139
+ self.assertTrue(os.path.getsize(disk) == 25 * MiB)
49
+ # consistent-read but dest-perm does not share it; thus
140
+
50
+ # aborting the job when it is supposed to complete
141
+
51
+ self.complete_and_wait('job',
142
+class TestTruncate(iotests.QMPTestCase):
52
+ completion_error='Operation not permitted')
143
+ def setUp(self):
53
+
144
+ iotests.qemu_img_create('-f', iotests.imgfmt, disk, str(10 * MiB))
54
+ # Assert that all of our nodes are still there (except for the
145
+ iotests.qemu_img_create('-f', iotests.imgfmt, refdisk, str(10 * MiB))
55
+ # mirror filter, which should be gone despite the failure)
146
+
56
+ nodes = self.vm.qmp('query-named-block-nodes')['return']
147
+ def tearDown(self):
57
+ nodes = [node['node-name'] for node in nodes]
148
+ os.remove(disk)
58
+
149
+ os.remove(refdisk)
59
+ for expect in ('src', 'src-perm', 'dest', 'dest-perm'):
150
+
60
+ self.assertTrue(expect in nodes, '%s disappeared' % expect)
151
+ def do_test(self, prealloc_mode, new_size):
61
+ self.assertFalse('mirror-filter' in nodes,
152
+ ret = iotests.qemu_io_silent('--image-opts', '-c', 'write 0 10M', '-c',
62
+ 'Mirror filter node did not disappear')
153
+ f'truncate -m {prealloc_mode} {new_size}',
63
+
154
+ drive_opts)
64
if __name__ == '__main__':
155
+ self.assertEqual(ret, 0)
65
iotests.main(supported_fmts=['qcow2', 'qed'],
156
+
66
supported_protocols=['file'])
157
+ ret = iotests.qemu_io_silent('-f', iotests.imgfmt, '-c', 'write 0 10M',
67
diff --git a/tests/qemu-iotests/041.out b/tests/qemu-iotests/041.out
158
+ '-c',
159
+ f'truncate -m {prealloc_mode} {new_size}',
160
+ refdisk)
161
+ self.assertEqual(ret, 0)
162
+
163
+ stat = os.stat(disk)
164
+ refstat = os.stat(refdisk)
165
+
166
+ # Probably we'll want preallocate filter to keep align to cluster when
167
+ # shrink preallocation, so, ignore small differece
168
+ self.assertLess(abs(stat.st_size - refstat.st_size), 64 * 1024)
169
+
170
+ # Preallocate filter may leak some internal clusters (for example, if
171
+ # guest write far over EOF, skipping some clusters - they will remain
172
+ # fallocated, preallocate filter don't care about such leaks, it drops
173
+ # only trailing preallocation.
174
+ self.assertLess(abs(stat.st_blocks - refstat.st_blocks) * 512,
175
+ 1024 * 1024)
176
+
177
+ def test_real_shrink(self):
178
+ self.do_test('off', '5M')
179
+
180
+ def test_truncate_inside_preallocated_area__falloc(self):
181
+ self.do_test('falloc', '50M')
182
+
183
+ def test_truncate_inside_preallocated_area__metadata(self):
184
+ self.do_test('metadata', '50M')
185
+
186
+ def test_truncate_inside_preallocated_area__full(self):
187
+ self.do_test('full', '50M')
188
+
189
+ def test_truncate_inside_preallocated_area__off(self):
190
+ self.do_test('off', '50M')
191
+
192
+ def test_truncate_over_preallocated_area__falloc(self):
193
+ self.do_test('falloc', '150M')
194
+
195
+ def test_truncate_over_preallocated_area__metadata(self):
196
+ self.do_test('metadata', '150M')
197
+
198
+ def test_truncate_over_preallocated_area__full(self):
199
+ self.do_test('full', '150M')
200
+
201
+ def test_truncate_over_preallocated_area__off(self):
202
+ self.do_test('off', '150M')
203
+
204
+
205
+if __name__ == '__main__':
206
+ iotests.main(supported_fmts=['qcow2'], required_fmts=['preallocate'])
207
diff --git a/tests/qemu-iotests/298.out b/tests/qemu-iotests/298.out
208
new file mode 100644
209
index XXXXXXX..XXXXXXX
210
--- /dev/null
211
+++ b/tests/qemu-iotests/298.out
212
@@ -XXX,XX +XXX,XX @@
213
+.............
214
+----------------------------------------------------------------------
215
+Ran 13 tests
216
+
217
+OK
218
diff --git a/tests/qemu-iotests/group b/tests/qemu-iotests/group
68
index XXXXXXX..XXXXXXX 100644
219
index XXXXXXX..XXXXXXX 100644
69
--- a/tests/qemu-iotests/041.out
220
--- a/tests/qemu-iotests/group
70
+++ b/tests/qemu-iotests/041.out
221
+++ b/tests/qemu-iotests/group
71
@@ -XXX,XX +XXX,XX @@
222
@@ -XXX,XX +XXX,XX @@
72
-..........................................................................................
223
295 rw
73
+...........................................................................................
224
296 rw
74
----------------------------------------------------------------------
225
297 meta
75
-Ran 90 tests
226
+298
76
+Ran 91 tests
227
299 auto quick
77
228
300 migration
78
OK
229
301 backing quick
79
--
230
--
80
2.24.1
231
2.29.2
81
232
82
233
diff view generated by jsdifflib
Deleted patch
1
From: PanNengyuan <pannengyuan@huawei.com>
2
1
3
This avoid a memory leak when qom-set is called to set throttle_group
4
limits, here is an easy way to reproduce:
5
6
1. run qemu-iotests as follow and check the result with asan:
7
./check -qcow2 184
8
9
Following is the asan output backtrack:
10
Direct leak of 912 byte(s) in 3 object(s) allocated from:
11
#0 0xffff8d7ab3c3 in __interceptor_calloc (/lib64/libasan.so.4+0xd33c3)
12
#1 0xffff8d4c31cb in g_malloc0 (/lib64/libglib-2.0.so.0+0x571cb)
13
#2 0x190c857 in qobject_input_start_struct /mnt/sdc/qemu-master/qemu-4.2.0-rc0/qapi/qobject-input-visitor.c:295
14
#3 0x19070df in visit_start_struct /mnt/sdc/qemu-master/qemu-4.2.0-rc0/qapi/qapi-visit-core.c:49
15
#4 0x1948b87 in visit_type_ThrottleLimits qapi/qapi-visit-block-core.c:3759
16
#5 0x17e4aa3 in throttle_group_set_limits /mnt/sdc/qemu-master/qemu-4.2.0-rc0/block/throttle-groups.c:900
17
#6 0x1650eff in object_property_set /mnt/sdc/qemu-master/qemu-4.2.0-rc0/qom/object.c:1272
18
#7 0x1658517 in object_property_set_qobject /mnt/sdc/qemu-master/qemu-4.2.0-rc0/qom/qom-qobject.c:26
19
#8 0x15880bb in qmp_qom_set /mnt/sdc/qemu-master/qemu-4.2.0-rc0/qom/qom-qmp-cmds.c:74
20
#9 0x157e3e3 in qmp_marshal_qom_set qapi/qapi-commands-qom.c:154
21
22
Reported-by: Euler Robot <euler.robot@huawei.com>
23
Signed-off-by: PanNengyuan <pannengyuan@huawei.com>
24
Message-id: 1574835614-42028-1-git-send-email-pannengyuan@huawei.com
25
Signed-off-by: Max Reitz <mreitz@redhat.com>
26
---
27
block/throttle-groups.c | 4 ++--
28
1 file changed, 2 insertions(+), 2 deletions(-)
29
30
diff --git a/block/throttle-groups.c b/block/throttle-groups.c
31
index XXXXXXX..XXXXXXX 100644
32
--- a/block/throttle-groups.c
33
+++ b/block/throttle-groups.c
34
@@ -XXX,XX +XXX,XX @@ static void throttle_group_set_limits(Object *obj, Visitor *v,
35
{
36
ThrottleGroup *tg = THROTTLE_GROUP(obj);
37
ThrottleConfig cfg;
38
- ThrottleLimits arg = { 0 };
39
- ThrottleLimits *argp = &arg;
40
+ ThrottleLimits *argp;
41
Error *local_err = NULL;
42
43
visit_type_ThrottleLimits(v, name, &argp, &local_err);
44
@@ -XXX,XX +XXX,XX @@ static void throttle_group_set_limits(Object *obj, Visitor *v,
45
unlock:
46
qemu_mutex_unlock(&tg->lock);
47
ret:
48
+ qapi_free_ThrottleLimits(argp);
49
error_propagate(errp, local_err);
50
return;
51
}
52
--
53
2.24.1
54
55
diff view generated by jsdifflib
Deleted patch
1
Probably due to blind copy-pasting, we have several instances of "qocw2"
2
in our iotests. Fix them.
3
1
4
Reported-by: Maxim Levitsky <mlevitsk@redhat.com>
5
Signed-off-by: Max Reitz <mreitz@redhat.com>
6
Message-id: 20191107163708.833192-2-mreitz@redhat.com
7
Reviewed-by: Eric Blake <eblake@redhat.com>
8
Reviewed-by: Maxim Levitsky <mlevitsk@redhat.com>
9
Signed-off-by: Max Reitz <mreitz@redhat.com>
10
---
11
tests/qemu-iotests/060 | 2 +-
12
tests/qemu-iotests/061 | 2 +-
13
tests/qemu-iotests/062 | 2 +-
14
tests/qemu-iotests/066 | 2 +-
15
tests/qemu-iotests/068 | 2 +-
16
tests/qemu-iotests/108 | 2 +-
17
tests/qemu-iotests/138 | 2 +-
18
tests/qemu-iotests/261 | 2 +-
19
8 files changed, 8 insertions(+), 8 deletions(-)
20
21
diff --git a/tests/qemu-iotests/060 b/tests/qemu-iotests/060
22
index XXXXXXX..XXXXXXX 100755
23
--- a/tests/qemu-iotests/060
24
+++ b/tests/qemu-iotests/060
25
@@ -XXX,XX +XXX,XX @@ _filter_io_error()
26
. ./common.rc
27
. ./common.filter
28
29
-# This tests qocw2-specific low-level functionality
30
+# This tests qcow2-specific low-level functionality
31
_supported_fmt qcow2
32
_supported_proto file
33
_supported_os Linux
34
diff --git a/tests/qemu-iotests/061 b/tests/qemu-iotests/061
35
index XXXXXXX..XXXXXXX 100755
36
--- a/tests/qemu-iotests/061
37
+++ b/tests/qemu-iotests/061
38
@@ -XXX,XX +XXX,XX @@ trap "_cleanup; exit \$status" 0 1 2 3 15
39
. ./common.rc
40
. ./common.filter
41
42
-# This tests qocw2-specific low-level functionality
43
+# This tests qcow2-specific low-level functionality
44
_supported_fmt qcow2
45
_supported_proto file
46
_supported_os Linux
47
diff --git a/tests/qemu-iotests/062 b/tests/qemu-iotests/062
48
index XXXXXXX..XXXXXXX 100755
49
--- a/tests/qemu-iotests/062
50
+++ b/tests/qemu-iotests/062
51
@@ -XXX,XX +XXX,XX @@ trap "_cleanup; exit \$status" 0 1 2 3 15
52
. ./common.rc
53
. ./common.filter
54
55
-# This tests qocw2-specific low-level functionality
56
+# This tests qcow2-specific low-level functionality
57
_supported_fmt qcow2
58
_supported_proto generic
59
60
diff --git a/tests/qemu-iotests/066 b/tests/qemu-iotests/066
61
index XXXXXXX..XXXXXXX 100755
62
--- a/tests/qemu-iotests/066
63
+++ b/tests/qemu-iotests/066
64
@@ -XXX,XX +XXX,XX @@ trap "_cleanup; exit \$status" 0 1 2 3 15
65
. ./common.rc
66
. ./common.filter
67
68
-# This tests qocw2-specific low-level functionality
69
+# This tests qcow2-specific low-level functionality
70
_supported_fmt qcow2
71
_supported_proto generic
72
73
diff --git a/tests/qemu-iotests/068 b/tests/qemu-iotests/068
74
index XXXXXXX..XXXXXXX 100755
75
--- a/tests/qemu-iotests/068
76
+++ b/tests/qemu-iotests/068
77
@@ -XXX,XX +XXX,XX @@ trap "_cleanup; exit \$status" 0 1 2 3 15
78
. ./common.rc
79
. ./common.filter
80
81
-# This tests qocw2-specific low-level functionality
82
+# This tests qcow2-specific low-level functionality
83
_supported_fmt qcow2
84
_supported_proto generic
85
86
diff --git a/tests/qemu-iotests/108 b/tests/qemu-iotests/108
87
index XXXXXXX..XXXXXXX 100755
88
--- a/tests/qemu-iotests/108
89
+++ b/tests/qemu-iotests/108
90
@@ -XXX,XX +XXX,XX @@ trap "_cleanup; exit \$status" 0 1 2 3 15
91
. ./common.rc
92
. ./common.filter
93
94
-# This tests qocw2-specific low-level functionality
95
+# This tests qcow2-specific low-level functionality
96
_supported_fmt qcow2
97
_supported_proto file
98
_supported_os Linux
99
diff --git a/tests/qemu-iotests/138 b/tests/qemu-iotests/138
100
index XXXXXXX..XXXXXXX 100755
101
--- a/tests/qemu-iotests/138
102
+++ b/tests/qemu-iotests/138
103
@@ -XXX,XX +XXX,XX @@ trap "_cleanup; exit \$status" 0 1 2 3 15
104
. ./common.rc
105
. ./common.filter
106
107
-# This tests qocw2-specific low-level functionality
108
+# This tests qcow2-specific low-level functionality
109
_supported_fmt qcow2
110
_supported_proto file
111
_supported_os Linux
112
diff --git a/tests/qemu-iotests/261 b/tests/qemu-iotests/261
113
index XXXXXXX..XXXXXXX 100755
114
--- a/tests/qemu-iotests/261
115
+++ b/tests/qemu-iotests/261
116
@@ -XXX,XX +XXX,XX @@ trap "_cleanup; exit \$status" 0 1 2 3 15
117
. ./common.rc
118
. ./common.filter
119
120
-# This tests qocw2-specific low-level functionality
121
+# This tests qcow2-specific low-level functionality
122
_supported_fmt qcow2
123
_supported_proto file
124
_supported_os Linux
125
--
126
2.24.1
127
128
diff view generated by jsdifflib
Deleted patch
1
This is useful for tests that want to whitelist fields from dump-header
2
(with grep) but still print all header extensions.
3
1
4
Signed-off-by: Max Reitz <mreitz@redhat.com>
5
Reviewed-by: Maxim Levitsky <mlevitsk@redhat.com>
6
Message-id: 20191107163708.833192-3-mreitz@redhat.com
7
Signed-off-by: Max Reitz <mreitz@redhat.com>
8
---
9
tests/qemu-iotests/qcow2.py | 5 +++++
10
1 file changed, 5 insertions(+)
11
12
diff --git a/tests/qemu-iotests/qcow2.py b/tests/qemu-iotests/qcow2.py
13
index XXXXXXX..XXXXXXX 100755
14
--- a/tests/qemu-iotests/qcow2.py
15
+++ b/tests/qemu-iotests/qcow2.py
16
@@ -XXX,XX +XXX,XX @@ def cmd_dump_header(fd):
17
h.dump()
18
h.dump_extensions()
19
20
+def cmd_dump_header_exts(fd):
21
+ h = QcowHeader(fd)
22
+ h.dump_extensions()
23
+
24
def cmd_set_header(fd, name, value):
25
try:
26
value = int(value, 0)
27
@@ -XXX,XX +XXX,XX @@ def cmd_set_feature_bit(fd, group, bit):
28
29
cmds = [
30
[ 'dump-header', cmd_dump_header, 0, 'Dump image header and header extensions' ],
31
+ [ 'dump-header-exts', cmd_dump_header_exts, 0, 'Dump image header extensions' ],
32
[ 'set-header', cmd_set_header, 2, 'Set a field in the header'],
33
[ 'add-header-ext', cmd_add_header_ext, 2, 'Add a header extension' ],
34
[ 'add-header-ext-stdio', cmd_add_header_ext_stdio, 1, 'Add a header extension, data from stdin' ],
35
--
36
2.24.1
37
38
diff view generated by jsdifflib
1
Use _make_test_img whenever possible. This way, we will not ignore
1
From: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
2
user-specified image options.
3
2
4
Signed-off-by: Max Reitz <mreitz@redhat.com>
3
Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
5
Reviewed-by: Maxim Levitsky <mlevitsk@redhat.com>
4
Message-Id: <20201021145859.11201-14-vsementsov@virtuozzo.com>
6
Message-id: 20191107163708.833192-15-mreitz@redhat.com
5
Reviewed-by: Max Reitz <mreitz@redhat.com>
7
Signed-off-by: Max Reitz <mreitz@redhat.com>
6
Signed-off-by: Max Reitz <mreitz@redhat.com>
8
---
7
---
9
tests/qemu-iotests/094 | 2 +-
8
scripts/simplebench/simplebench.py | 12 ++++++------
10
tests/qemu-iotests/111 | 3 +--
9
1 file changed, 6 insertions(+), 6 deletions(-)
11
tests/qemu-iotests/123 | 2 +-
12
tests/qemu-iotests/153 | 2 +-
13
tests/qemu-iotests/200 | 4 ++--
14
5 files changed, 6 insertions(+), 7 deletions(-)
15
10
16
diff --git a/tests/qemu-iotests/094 b/tests/qemu-iotests/094
11
diff --git a/scripts/simplebench/simplebench.py b/scripts/simplebench/simplebench.py
17
index XXXXXXX..XXXXXXX 100755
12
index XXXXXXX..XXXXXXX 100644
18
--- a/tests/qemu-iotests/094
13
--- a/scripts/simplebench/simplebench.py
19
+++ b/tests/qemu-iotests/094
14
+++ b/scripts/simplebench/simplebench.py
20
@@ -XXX,XX +XXX,XX @@ _supported_proto nbd
15
@@ -XXX,XX +XXX,XX @@ def bench_one(test_func, test_env, test_case, count=5, initial_run=True):
21
_unsupported_imgopts "subformat=monolithicFlat" "subformat=twoGbMaxExtentFlat"
16
22
17
result = {'runs': runs}
23
_make_test_img 64M
18
24
-$QEMU_IMG create -f $IMGFMT "$TEST_DIR/source.$IMGFMT" 64M | _filter_img_create
19
- successed = [r for r in runs if ('seconds' in r)]
25
+TEST_IMG_FILE="$TEST_DIR/source.$IMGFMT" IMGPROTO=file _make_test_img 64M
20
- if successed:
26
21
- avg = sum(r['seconds'] for r in successed) / len(successed)
27
_launch_qemu -drive if=none,id=src,file="$TEST_DIR/source.$IMGFMT",format=raw \
22
+ succeeded = [r for r in runs if ('seconds' in r)]
28
-nodefaults
23
+ if succeeded:
29
diff --git a/tests/qemu-iotests/111 b/tests/qemu-iotests/111
24
+ avg = sum(r['seconds'] for r in succeeded) / len(succeeded)
30
index XXXXXXX..XXXXXXX 100755
25
result['average'] = avg
31
--- a/tests/qemu-iotests/111
26
- result['delta'] = max(abs(r['seconds'] - avg) for r in successed)
32
+++ b/tests/qemu-iotests/111
27
+ result['delta'] = max(abs(r['seconds'] - avg) for r in succeeded)
33
@@ -XXX,XX +XXX,XX @@ _supported_fmt qed qcow qcow2 vmdk
28
34
_supported_proto file
29
- if len(successed) < count:
35
_unsupported_imgopts "subformat=monolithicFlat" "subformat=twoGbMaxExtentFlat"
30
- result['n-failed'] = count - len(successed)
36
31
+ if len(succeeded) < count:
37
-$QEMU_IMG create -f $IMGFMT -b "$TEST_IMG.inexistent" "$TEST_IMG" 2>&1 \
32
+ result['n-failed'] = count - len(succeeded)
38
- | _filter_testdir | _filter_imgfmt
33
39
+_make_test_img -b "$TEST_IMG.inexistent"
34
return result
40
41
# success, all done
42
echo '*** done'
43
diff --git a/tests/qemu-iotests/123 b/tests/qemu-iotests/123
44
index XXXXXXX..XXXXXXX 100755
45
--- a/tests/qemu-iotests/123
46
+++ b/tests/qemu-iotests/123
47
@@ -XXX,XX +XXX,XX @@ _supported_os Linux
48
SRC_IMG="$TEST_DIR/source.$IMGFMT"
49
50
_make_test_img 1M
51
-$QEMU_IMG create -f $IMGFMT "$SRC_IMG" 1M | _filter_img_create
52
+TEST_IMG_FILE=$SRC_IMG IMGPROTO=file _make_test_img 1M
53
54
$QEMU_IO -c 'write -P 42 0 1M' "$SRC_IMG" | _filter_qemu_io
55
56
diff --git a/tests/qemu-iotests/153 b/tests/qemu-iotests/153
57
index XXXXXXX..XXXXXXX 100755
58
--- a/tests/qemu-iotests/153
59
+++ b/tests/qemu-iotests/153
60
@@ -XXX,XX +XXX,XX @@ for opts1 in "" "read-only=on" "read-only=on,force-share=on"; do
61
62
echo
63
echo "== Creating test image =="
64
- $QEMU_IMG create -f $IMGFMT "${TEST_IMG}" -b ${TEST_IMG}.base | _filter_img_create
65
+ _make_test_img -b "${TEST_IMG}.base"
66
67
echo
68
echo "== Launching QEMU, opts: '$opts1' =="
69
diff --git a/tests/qemu-iotests/200 b/tests/qemu-iotests/200
70
index XXXXXXX..XXXXXXX 100755
71
--- a/tests/qemu-iotests/200
72
+++ b/tests/qemu-iotests/200
73
@@ -XXX,XX +XXX,XX @@ _supported_proto file
74
BACKING_IMG="${TEST_DIR}/backing.img"
75
TEST_IMG="${TEST_DIR}/test.img"
76
77
-${QEMU_IMG} create -f $IMGFMT "${BACKING_IMG}" 512M | _filter_img_create
78
-${QEMU_IMG} create -f $IMGFMT -F $IMGFMT "${TEST_IMG}" -b "${BACKING_IMG}" 512M | _filter_img_create
79
+TEST_IMG="$BACKING_IMG" _make_test_img 512M
80
+_make_test_img -F $IMGFMT -b "$BACKING_IMG" 512M
81
82
${QEMU_IO} -c "write -P 0xa5 512 300M" "${BACKING_IMG}" | _filter_qemu_io
83
35
84
--
36
--
85
2.24.1
37
2.29.2
86
38
87
39
diff view generated by jsdifflib
1
When using an external data file, there are no refcounts for data
1
From: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
2
clusters. We thus have to adjust the corruption test in this patch to
3
not be based around a data cluster allocation, but the L2 table
4
allocation (L2 tables are still refcounted with external data files).
5
2
6
Furthermore, we should not print qcow2.py's list of incompatible
3
Support benchmarks returning not seconds but iops. We'll use it for
7
features because it differs depending on whether there is an external
4
further new test.
8
data file or not.
9
5
10
With those two changes, the test will work both with and without
6
Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
11
external data files (once that options works with the iotests at all).
7
Message-Id: <20201021145859.11201-15-vsementsov@virtuozzo.com>
12
8
Reviewed-by: Max Reitz <mreitz@redhat.com>
13
Signed-off-by: Max Reitz <mreitz@redhat.com>
14
Reviewed-by: Maxim Levitsky <mlevitsk@redhat.com>
15
Message-id: 20191107163708.833192-20-mreitz@redhat.com
16
Signed-off-by: Max Reitz <mreitz@redhat.com>
9
Signed-off-by: Max Reitz <mreitz@redhat.com>
17
---
10
---
18
tests/qemu-iotests/137 | 15 +++++++++++----
11
scripts/simplebench/simplebench.py | 38 ++++++++++++++++++++++--------
19
tests/qemu-iotests/137.out | 6 ++----
12
1 file changed, 28 insertions(+), 10 deletions(-)
20
2 files changed, 13 insertions(+), 8 deletions(-)
21
13
22
diff --git a/tests/qemu-iotests/137 b/tests/qemu-iotests/137
14
diff --git a/scripts/simplebench/simplebench.py b/scripts/simplebench/simplebench.py
23
index XXXXXXX..XXXXXXX 100755
24
--- a/tests/qemu-iotests/137
25
+++ b/tests/qemu-iotests/137
26
@@ -XXX,XX +XXX,XX @@ $QEMU_IO \
27
"$TEST_IMG" 2>&1 | _filter_qemu_io
28
29
# The dirty bit must not be set
30
-$PYTHON qcow2.py "$TEST_IMG" dump-header | grep incompatible_features
31
+# (Filter the external data file bit)
32
+if $PYTHON qcow2.py "$TEST_IMG" dump-header | grep incompatible_features \
33
+ | grep -q '\<0\>'
34
+then
35
+ echo 'ERROR: Dirty bit set'
36
+else
37
+ echo 'OK: Dirty bit not set'
38
+fi
39
40
# Similarly we can test whether corruption detection has been enabled:
41
-# Create L1/L2, overwrite first entry in refcount block, allocate something.
42
+# Create L1, overwrite refcounts, force allocation of L2 by writing
43
+# data.
44
# Disabling the checks should fail, so the corruption must be detected.
45
_make_test_img 64M
46
-$QEMU_IO -c "write 0 64k" "$TEST_IMG" | _filter_qemu_io
47
-poke_file "$TEST_IMG" "$((0x20000))" "\x00\x00"
48
+poke_file "$TEST_IMG" "$((0x20000))" "\x00\x00\x00\x00\x00\x00\x00\x00"
49
$QEMU_IO \
50
-c "reopen -o overlap-check=none,lazy-refcounts=42" \
51
-c "write 64k 64k" \
52
diff --git a/tests/qemu-iotests/137.out b/tests/qemu-iotests/137.out
53
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
54
--- a/tests/qemu-iotests/137.out
16
--- a/scripts/simplebench/simplebench.py
55
+++ b/tests/qemu-iotests/137.out
17
+++ b/scripts/simplebench/simplebench.py
56
@@ -XXX,XX +XXX,XX @@ qemu-io: Unsupported value 'blubb' for qcow2 option 'overlap-check'. Allowed are
18
@@ -XXX,XX +XXX,XX @@ def bench_one(test_func, test_env, test_case, count=5, initial_run=True):
57
wrote 512/512 bytes at offset 0
19
58
512 bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
20
test_func -- benchmarking function with prototype
59
./common.rc: Killed ( VALGRIND_QEMU="${VALGRIND_QEMU_IO}" _qemu_proc_exec "${VALGRIND_LOGFILE}" "$QEMU_IO_PROG" $QEMU_IO_ARGS "$@" )
21
test_func(env, case), which takes test_env and test_case
60
-incompatible_features []
22
- arguments and returns {'seconds': int} (which is benchmark
61
+OK: Dirty bit not set
23
- result) on success and {'error': str} on error. Returned
62
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=67108864
24
- dict may contain any other additional fields.
63
-wrote 65536/65536 bytes at offset 0
25
+ arguments and on success returns dict with 'seconds' or
64
-64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
26
+ 'iops' (or both) fields, specifying the benchmark result.
65
qemu-io: Parameter 'lazy-refcounts' expects 'on' or 'off'
27
+ If both 'iops' and 'seconds' provided, the 'iops' is
66
-qcow2: Marking image as corrupt: Preventing invalid write on metadata (overlaps with qcow2_header); further corruption events will be suppressed
28
+ considered the main, and 'seconds' is just an additional
67
+qcow2: Marking image as corrupt: Preventing invalid allocation of L2 table at offset 0; further corruption events will be suppressed
29
+ info. On failure test_func should return {'error': str}.
68
write failed: Input/output error
30
+ Returned dict may contain any other additional fields.
69
*** done
31
test_env -- test environment - opaque first argument for test_func
32
test_case -- test case - opaque second argument for test_func
33
count -- how many times to call test_func, to calculate average
34
@@ -XXX,XX +XXX,XX @@ def bench_one(test_func, test_env, test_case, count=5, initial_run=True):
35
36
Returns dict with the following fields:
37
'runs': list of test_func results
38
- 'average': average seconds per run (exists only if at least one run
39
- succeeded)
40
+ 'dimension': dimension of results, may be 'seconds' or 'iops'
41
+ 'average': average value (iops or seconds) per run (exists only if at
42
+ least one run succeeded)
43
'delta': maximum delta between test_func result and the average
44
(exists only if at least one run succeeded)
45
'n-failed': number of failed runs (exists only if at least one run
46
@@ -XXX,XX +XXX,XX @@ def bench_one(test_func, test_env, test_case, count=5, initial_run=True):
47
48
result = {'runs': runs}
49
50
- succeeded = [r for r in runs if ('seconds' in r)]
51
+ succeeded = [r for r in runs if ('seconds' in r or 'iops' in r)]
52
if succeeded:
53
- avg = sum(r['seconds'] for r in succeeded) / len(succeeded)
54
+ if 'iops' in succeeded[0]:
55
+ assert all('iops' in r for r in succeeded)
56
+ dim = 'iops'
57
+ else:
58
+ assert all('seconds' in r for r in succeeded)
59
+ assert all('iops' not in r for r in succeeded)
60
+ dim = 'seconds'
61
+ avg = sum(r[dim] for r in succeeded) / len(succeeded)
62
+ result['dimension'] = dim
63
result['average'] = avg
64
- result['delta'] = max(abs(r['seconds'] - avg) for r in succeeded)
65
+ result['delta'] = max(abs(r[dim] - avg) for r in succeeded)
66
67
if len(succeeded) < count:
68
result['n-failed'] = count - len(succeeded)
69
@@ -XXX,XX +XXX,XX @@ def ascii(results):
70
"""Return ASCII representation of bench() returned dict."""
71
from tabulate import tabulate
72
73
+ dim = None
74
tab = [[""] + [c['id'] for c in results['envs']]]
75
for case in results['cases']:
76
row = [case['id']]
77
for env in results['envs']:
78
- row.append(ascii_one(results['tab'][case['id']][env['id']]))
79
+ res = results['tab'][case['id']][env['id']]
80
+ if dim is None:
81
+ dim = res['dimension']
82
+ else:
83
+ assert dim == res['dimension']
84
+ row.append(ascii_one(res))
85
tab.append(row)
86
87
- return tabulate(tab)
88
+ return f'All results are in {dim}\n\n' + tabulate(tab)
70
--
89
--
71
2.24.1
90
2.29.2
72
91
73
92
diff view generated by jsdifflib
1
The only difference is that the json:{} filename of the image looks
1
From: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
2
different. We actually do not care about that filename in this test, we
3
are only interested in (1) that there is a json:{} filename, and (2)
4
whether the backing filename can be constructed.
5
2
6
So just filter out the json:{} data, thus making this test pass both
3
Standard deviation is more usual to see after +- than current maximum
7
with and without data_file.
4
of deviations.
8
5
9
Signed-off-by: Max Reitz <mreitz@redhat.com>
6
Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
10
Reviewed-by: Maxim Levitsky <mlevitsk@redhat.com>
7
Message-Id: <20201021145859.11201-16-vsementsov@virtuozzo.com>
11
Message-id: 20191107163708.833192-19-mreitz@redhat.com
8
Reviewed-by: Max Reitz <mreitz@redhat.com>
12
Signed-off-by: Max Reitz <mreitz@redhat.com>
9
Signed-off-by: Max Reitz <mreitz@redhat.com>
13
---
10
---
14
tests/qemu-iotests/110 | 7 +++++--
11
scripts/simplebench/simplebench.py | 11 ++++++-----
15
tests/qemu-iotests/110.out | 4 ++--
12
1 file changed, 6 insertions(+), 5 deletions(-)
16
2 files changed, 7 insertions(+), 4 deletions(-)
17
13
18
diff --git a/tests/qemu-iotests/110 b/tests/qemu-iotests/110
14
diff --git a/scripts/simplebench/simplebench.py b/scripts/simplebench/simplebench.py
19
index XXXXXXX..XXXXXXX 100755
20
--- a/tests/qemu-iotests/110
21
+++ b/tests/qemu-iotests/110
22
@@ -XXX,XX +XXX,XX @@ echo
23
# Across blkdebug without a config file, you cannot reconstruct filenames, so
24
# qemu is incapable of knowing the directory of the top image from the filename
25
# alone. However, using bdrv_dirname(), it should still work.
26
+# (Filter out the json:{} filename so this test works with external data files)
27
TEST_IMG="json:{
28
'driver': '$IMGFMT',
29
'file': {
30
@@ -XXX,XX +XXX,XX @@ TEST_IMG="json:{
31
}
32
]
33
}
34
-}" _img_info | _filter_img_info | grep -v 'backing file format'
35
+}" _img_info | _filter_img_info | grep -v 'backing file format' \
36
+ | _filter_json_filename
37
38
echo
39
echo '=== Backing name is always relative to the backed image ==='
40
@@ -XXX,XX +XXX,XX @@ TEST_IMG="json:{
41
}
42
]
43
}
44
-}" _img_info | _filter_img_info | grep -v 'backing file format'
45
+}" _img_info | _filter_img_info | grep -v 'backing file format' \
46
+ | _filter_json_filename
47
48
49
# success, all done
50
diff --git a/tests/qemu-iotests/110.out b/tests/qemu-iotests/110.out
51
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
52
--- a/tests/qemu-iotests/110.out
16
--- a/scripts/simplebench/simplebench.py
53
+++ b/tests/qemu-iotests/110.out
17
+++ b/scripts/simplebench/simplebench.py
54
@@ -XXX,XX +XXX,XX @@ backing file: t.IMGFMT.base (actual path: TEST_DIR/t.IMGFMT.base)
18
@@ -XXX,XX +XXX,XX @@
55
19
# along with this program. If not, see <http://www.gnu.org/licenses/>.
56
=== Non-reconstructable filename ===
20
#
57
21
58
-image: json:{"driver": "IMGFMT", "file": {"set-state.0.event": "read_aio", "image": {"driver": "file", "filename": "TEST_DIR/t.IMGFMT"}, "driver": "blkdebug", "set-state.0.new_state": 42}}
22
+import statistics
59
+image: json:{ /* filtered */ }
23
+
60
file format: IMGFMT
24
61
virtual size: 64 MiB (67108864 bytes)
25
def bench_one(test_func, test_env, test_case, count=5, initial_run=True):
62
backing file: t.IMGFMT.base (actual path: TEST_DIR/t.IMGFMT.base)
26
"""Benchmark one test-case
63
@@ -XXX,XX +XXX,XX @@ Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=67108864 backing_file=t.IMGFMT.b
27
@@ -XXX,XX +XXX,XX @@ def bench_one(test_func, test_env, test_case, count=5, initial_run=True):
64
28
'dimension': dimension of results, may be 'seconds' or 'iops'
65
=== Nodes without a common directory ===
29
'average': average value (iops or seconds) per run (exists only if at
66
30
least one run succeeded)
67
-image: json:{"driver": "IMGFMT", "file": {"children": [{"driver": "file", "filename": "TEST_DIR/t.IMGFMT"}, {"driver": "file", "filename": "TEST_DIR/t.IMGFMT.copy"}], "driver": "quorum", "vote-threshold": 1}}
31
- 'delta': maximum delta between test_func result and the average
68
+image: json:{ /* filtered */ }
32
+ 'stdev': standard deviation of results
69
file format: IMGFMT
33
(exists only if at least one run succeeded)
70
virtual size: 64 MiB (67108864 bytes)
34
'n-failed': number of failed runs (exists only if at least one run
71
backing file: t.IMGFMT.base (cannot determine actual path)
35
failed)
36
@@ -XXX,XX +XXX,XX @@ def bench_one(test_func, test_env, test_case, count=5, initial_run=True):
37
assert all('seconds' in r for r in succeeded)
38
assert all('iops' not in r for r in succeeded)
39
dim = 'seconds'
40
- avg = sum(r[dim] for r in succeeded) / len(succeeded)
41
result['dimension'] = dim
42
- result['average'] = avg
43
- result['delta'] = max(abs(r[dim] - avg) for r in succeeded)
44
+ result['average'] = statistics.mean(r[dim] for r in succeeded)
45
+ result['stdev'] = statistics.stdev(r[dim] for r in succeeded)
46
47
if len(succeeded) < count:
48
result['n-failed'] = count - len(succeeded)
49
@@ -XXX,XX +XXX,XX @@ def bench_one(test_func, test_env, test_case, count=5, initial_run=True):
50
def ascii_one(result):
51
"""Return ASCII representation of bench_one() returned dict."""
52
if 'average' in result:
53
- s = '{:.2f} +- {:.2f}'.format(result['average'], result['delta'])
54
+ s = '{:.2f} +- {:.2f}'.format(result['average'], result['stdev'])
55
if 'n-failed' in result:
56
s += '\n({} failed)'.format(result['n-failed'])
57
return s
72
--
58
--
73
2.24.1
59
2.29.2
74
60
75
61
diff view generated by jsdifflib
1
The image end offset as reported by qemu-img check is different when
1
From: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
2
using an external data file; we do not care about its value here, so we
3
can just filter it. Incidentally, common.rc already has _check_test_img
4
for us which does exactly that.
5
2
6
Signed-off-by: Max Reitz <mreitz@redhat.com>
3
Next patch will use utf8 plus-minus symbol, let's use more generic (and
7
Reviewed-by: Maxim Levitsky <mlevitsk@redhat.com>
4
more readable) name.
8
Message-id: 20191107163708.833192-18-mreitz@redhat.com
5
6
Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
7
Message-Id: <20201021145859.11201-17-vsementsov@virtuozzo.com>
8
Reviewed-by: Max Reitz <mreitz@redhat.com>
9
Signed-off-by: Max Reitz <mreitz@redhat.com>
9
Signed-off-by: Max Reitz <mreitz@redhat.com>
10
---
10
---
11
tests/qemu-iotests/091 | 2 +-
11
scripts/simplebench/bench-example.py | 2 +-
12
tests/qemu-iotests/091.out | 2 --
12
scripts/simplebench/bench_write_req.py | 2 +-
13
2 files changed, 1 insertion(+), 3 deletions(-)
13
scripts/simplebench/simplebench.py | 10 +++++-----
14
3 files changed, 7 insertions(+), 7 deletions(-)
14
15
15
diff --git a/tests/qemu-iotests/091 b/tests/qemu-iotests/091
16
diff --git a/scripts/simplebench/bench-example.py b/scripts/simplebench/bench-example.py
17
index XXXXXXX..XXXXXXX 100644
18
--- a/scripts/simplebench/bench-example.py
19
+++ b/scripts/simplebench/bench-example.py
20
@@ -XXX,XX +XXX,XX @@ test_envs = [
21
]
22
23
result = simplebench.bench(bench_func, test_envs, test_cases, count=3)
24
-print(simplebench.ascii(result))
25
+print(simplebench.results_to_text(result))
26
diff --git a/scripts/simplebench/bench_write_req.py b/scripts/simplebench/bench_write_req.py
16
index XXXXXXX..XXXXXXX 100755
27
index XXXXXXX..XXXXXXX 100755
17
--- a/tests/qemu-iotests/091
28
--- a/scripts/simplebench/bench_write_req.py
18
+++ b/tests/qemu-iotests/091
29
+++ b/scripts/simplebench/bench_write_req.py
19
@@ -XXX,XX +XXX,XX @@ echo "Check image pattern"
30
@@ -XXX,XX +XXX,XX @@ if __name__ == '__main__':
20
${QEMU_IO} -c "read -P 0x22 0 4M" "${TEST_IMG}" | _filter_testdir | _filter_qemu_io
31
21
32
result = simplebench.bench(bench_func, test_envs, test_cases, count=3,
22
echo "Running 'qemu-img check -r all \$TEST_IMG'"
33
initial_run=False)
23
-"${QEMU_IMG}" check -r all "${TEST_IMG}" 2>&1 | _filter_testdir | _filter_qemu
34
- print(simplebench.ascii(result))
24
+_check_test_img -r all
35
+ print(simplebench.results_to_text(result))
25
36
diff --git a/scripts/simplebench/simplebench.py b/scripts/simplebench/simplebench.py
26
echo "*** done"
27
rm -f $seq.full
28
diff --git a/tests/qemu-iotests/091.out b/tests/qemu-iotests/091.out
29
index XXXXXXX..XXXXXXX 100644
37
index XXXXXXX..XXXXXXX 100644
30
--- a/tests/qemu-iotests/091.out
38
--- a/scripts/simplebench/simplebench.py
31
+++ b/tests/qemu-iotests/091.out
39
+++ b/scripts/simplebench/simplebench.py
32
@@ -XXX,XX +XXX,XX @@ read 4194304/4194304 bytes at offset 0
40
@@ -XXX,XX +XXX,XX @@ def bench_one(test_func, test_env, test_case, count=5, initial_run=True):
33
4 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
41
return result
34
Running 'qemu-img check -r all $TEST_IMG'
42
35
No errors were found on the image.
43
36
-80/16384 = 0.49% allocated, 0.00% fragmented, 0.00% compressed clusters
44
-def ascii_one(result):
37
-Image end offset: 5570560
45
- """Return ASCII representation of bench_one() returned dict."""
38
*** done
46
+def result_to_text(result):
47
+ """Return text representation of bench_one() returned dict."""
48
if 'average' in result:
49
s = '{:.2f} +- {:.2f}'.format(result['average'], result['stdev'])
50
if 'n-failed' in result:
51
@@ -XXX,XX +XXX,XX @@ def bench(test_func, test_envs, test_cases, *args, **vargs):
52
return results
53
54
55
-def ascii(results):
56
- """Return ASCII representation of bench() returned dict."""
57
+def results_to_text(results):
58
+ """Return text representation of bench() returned dict."""
59
from tabulate import tabulate
60
61
dim = None
62
@@ -XXX,XX +XXX,XX @@ def ascii(results):
63
dim = res['dimension']
64
else:
65
assert dim == res['dimension']
66
- row.append(ascii_one(res))
67
+ row.append(result_to_text(res))
68
tab.append(row)
69
70
return f'All results are in {dim}\n\n' + tabulate(tab)
39
--
71
--
40
2.24.1
72
2.29.2
41
73
42
74
diff view generated by jsdifflib
1
It did not matter before, but now that _make_test_img understands -o, we
1
From: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
2
should use it properly here.
3
2
4
Signed-off-by: Max Reitz <mreitz@redhat.com>
3
Let's keep view part in separate: this way it's better to improve it in
5
Reviewed-by: Maxim Levitsky <mlevitsk@redhat.com>
4
the following commits.
6
Message-id: 20191107163708.833192-11-mreitz@redhat.com
5
6
Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
7
Message-Id: <20201021145859.11201-18-vsementsov@virtuozzo.com>
8
Reviewed-by: Max Reitz <mreitz@redhat.com>
7
Signed-off-by: Max Reitz <mreitz@redhat.com>
9
Signed-off-by: Max Reitz <mreitz@redhat.com>
8
---
10
---
9
tests/qemu-iotests/051 | 2 +-
11
scripts/simplebench/bench-example.py | 3 +-
10
1 file changed, 1 insertion(+), 1 deletion(-)
12
scripts/simplebench/bench_write_req.py | 3 +-
13
scripts/simplebench/results_to_text.py | 48 ++++++++++++++++++++++++++
14
scripts/simplebench/simplebench.py | 31 -----------------
15
4 files changed, 52 insertions(+), 33 deletions(-)
16
create mode 100644 scripts/simplebench/results_to_text.py
11
17
12
diff --git a/tests/qemu-iotests/051 b/tests/qemu-iotests/051
18
diff --git a/scripts/simplebench/bench-example.py b/scripts/simplebench/bench-example.py
19
index XXXXXXX..XXXXXXX 100644
20
--- a/scripts/simplebench/bench-example.py
21
+++ b/scripts/simplebench/bench-example.py
22
@@ -XXX,XX +XXX,XX @@
23
#
24
25
import simplebench
26
+from results_to_text import results_to_text
27
from bench_block_job import bench_block_copy, drv_file, drv_nbd
28
29
30
@@ -XXX,XX +XXX,XX @@ test_envs = [
31
]
32
33
result = simplebench.bench(bench_func, test_envs, test_cases, count=3)
34
-print(simplebench.results_to_text(result))
35
+print(results_to_text(result))
36
diff --git a/scripts/simplebench/bench_write_req.py b/scripts/simplebench/bench_write_req.py
13
index XXXXXXX..XXXXXXX 100755
37
index XXXXXXX..XXXXXXX 100755
14
--- a/tests/qemu-iotests/051
38
--- a/scripts/simplebench/bench_write_req.py
15
+++ b/tests/qemu-iotests/051
39
+++ b/scripts/simplebench/bench_write_req.py
16
@@ -XXX,XX +XXX,XX @@ echo
40
@@ -XXX,XX +XXX,XX @@ import sys
17
echo === With version 2 images enabling lazy refcounts must fail ===
41
import os
18
echo
42
import subprocess
19
43
import simplebench
20
-_make_test_img -ocompat=0.10 $size
44
+from results_to_text import results_to_text
21
+_make_test_img -o compat=0.10 $size
45
22
46
23
run_qemu -drive file="$TEST_IMG",format=qcow2,lazy-refcounts=on
47
def bench_func(env, case):
24
run_qemu -drive file="$TEST_IMG",format=qcow2,lazy-refcounts=off
48
@@ -XXX,XX +XXX,XX @@ if __name__ == '__main__':
49
50
result = simplebench.bench(bench_func, test_envs, test_cases, count=3,
51
initial_run=False)
52
- print(simplebench.results_to_text(result))
53
+ print(results_to_text(result))
54
diff --git a/scripts/simplebench/results_to_text.py b/scripts/simplebench/results_to_text.py
55
new file mode 100644
56
index XXXXXXX..XXXXXXX
57
--- /dev/null
58
+++ b/scripts/simplebench/results_to_text.py
59
@@ -XXX,XX +XXX,XX @@
60
+# Simple benchmarking framework
61
+#
62
+# Copyright (c) 2019 Virtuozzo International GmbH.
63
+#
64
+# This program is free software; you can redistribute it and/or modify
65
+# it under the terms of the GNU General Public License as published by
66
+# the Free Software Foundation; either version 2 of the License, or
67
+# (at your option) any later version.
68
+#
69
+# This program is distributed in the hope that it will be useful,
70
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
71
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
72
+# GNU General Public License for more details.
73
+#
74
+# You should have received a copy of the GNU General Public License
75
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
76
+#
77
+
78
+
79
+def result_to_text(result):
80
+ """Return text representation of bench_one() returned dict."""
81
+ if 'average' in result:
82
+ s = '{:.2f} +- {:.2f}'.format(result['average'], result['stdev'])
83
+ if 'n-failed' in result:
84
+ s += '\n({} failed)'.format(result['n-failed'])
85
+ return s
86
+ else:
87
+ return 'FAILED'
88
+
89
+
90
+def results_to_text(results):
91
+ """Return text representation of bench() returned dict."""
92
+ from tabulate import tabulate
93
+
94
+ dim = None
95
+ tab = [[""] + [c['id'] for c in results['envs']]]
96
+ for case in results['cases']:
97
+ row = [case['id']]
98
+ for env in results['envs']:
99
+ res = results['tab'][case['id']][env['id']]
100
+ if dim is None:
101
+ dim = res['dimension']
102
+ else:
103
+ assert dim == res['dimension']
104
+ row.append(result_to_text(res))
105
+ tab.append(row)
106
+
107
+ return f'All results are in {dim}\n\n' + tabulate(tab)
108
diff --git a/scripts/simplebench/simplebench.py b/scripts/simplebench/simplebench.py
109
index XXXXXXX..XXXXXXX 100644
110
--- a/scripts/simplebench/simplebench.py
111
+++ b/scripts/simplebench/simplebench.py
112
@@ -XXX,XX +XXX,XX @@ def bench_one(test_func, test_env, test_case, count=5, initial_run=True):
113
return result
114
115
116
-def result_to_text(result):
117
- """Return text representation of bench_one() returned dict."""
118
- if 'average' in result:
119
- s = '{:.2f} +- {:.2f}'.format(result['average'], result['stdev'])
120
- if 'n-failed' in result:
121
- s += '\n({} failed)'.format(result['n-failed'])
122
- return s
123
- else:
124
- return 'FAILED'
125
-
126
-
127
def bench(test_func, test_envs, test_cases, *args, **vargs):
128
"""Fill benchmark table
129
130
@@ -XXX,XX +XXX,XX @@ def bench(test_func, test_envs, test_cases, *args, **vargs):
131
132
print('Done')
133
return results
134
-
135
-
136
-def results_to_text(results):
137
- """Return text representation of bench() returned dict."""
138
- from tabulate import tabulate
139
-
140
- dim = None
141
- tab = [[""] + [c['id'] for c in results['envs']]]
142
- for case in results['cases']:
143
- row = [case['id']]
144
- for env in results['envs']:
145
- res = results['tab'][case['id']][env['id']]
146
- if dim is None:
147
- dim = res['dimension']
148
- else:
149
- assert dim == res['dimension']
150
- row.append(result_to_text(res))
151
- tab.append(row)
152
-
153
- return f'All results are in {dim}\n\n' + tabulate(tab)
25
--
154
--
26
2.24.1
155
2.29.2
27
156
28
157
diff view generated by jsdifflib
1
Blindly overriding IMGOPTS is suboptimal as this discards user-specified
1
From: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
2
options. Whatever options the test needs should simply be appended.
3
2
4
Some tests do this (with IMGOPTS=$(_optstr_add "$IMGOPTS" "...")), but
3
Move to generic format for floats and percentage for error.
5
that is cumbersome. It’s simpler to just give _make_test_img an -o
6
parameter with which tests can add options.
7
4
8
Some tests actually must override the user-specified options, though,
5
Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
9
for example when creating an image in a different format than the test
6
Message-Id: <20201021145859.11201-19-vsementsov@virtuozzo.com>
10
$IMGFMT. For such cases, --no-opts allows clearing the current option
7
Acked-by: Max Reitz <mreitz@redhat.com>
11
list.
12
13
Signed-off-by: Max Reitz <mreitz@redhat.com>
14
Reviewed-by: Maxim Levitsky <mlevitsk@redhat.com>
15
Message-id: 20191107163708.833192-10-mreitz@redhat.com
16
Signed-off-by: Max Reitz <mreitz@redhat.com>
8
Signed-off-by: Max Reitz <mreitz@redhat.com>
17
---
9
---
18
tests/qemu-iotests/common.rc | 13 +++++++++++++
10
scripts/simplebench/results_to_text.py | 13 ++++++++++++-
19
1 file changed, 13 insertions(+)
11
1 file changed, 12 insertions(+), 1 deletion(-)
20
12
21
diff --git a/tests/qemu-iotests/common.rc b/tests/qemu-iotests/common.rc
13
diff --git a/scripts/simplebench/results_to_text.py b/scripts/simplebench/results_to_text.py
22
index XXXXXXX..XXXXXXX 100644
14
index XXXXXXX..XXXXXXX 100644
23
--- a/tests/qemu-iotests/common.rc
15
--- a/scripts/simplebench/results_to_text.py
24
+++ b/tests/qemu-iotests/common.rc
16
+++ b/scripts/simplebench/results_to_text.py
25
@@ -XXX,XX +XXX,XX @@ _make_test_img()
17
@@ -XXX,XX +XXX,XX @@
26
local use_backing=0
18
# along with this program. If not, see <http://www.gnu.org/licenses/>.
27
local backing_file=""
19
#
28
local object_options=""
20
29
+ local opts_param=false
21
+import math
30
local misc_params=()
31
32
if [ -n "$TEST_IMG_FILE" ]; then
33
@@ -XXX,XX +XXX,XX @@ _make_test_img()
34
if [ "$use_backing" = "1" -a -z "$backing_file" ]; then
35
backing_file=$param
36
continue
37
+ elif $opts_param; then
38
+ optstr=$(_optstr_add "$optstr" "$param")
39
+ opts_param=false
40
+ continue
41
fi
42
43
case "$param" in
44
@@ -XXX,XX +XXX,XX @@ _make_test_img()
45
use_backing=1
46
;;
47
48
+ -o)
49
+ opts_param=true
50
+ ;;
51
+
22
+
52
+ --no-opts)
53
+ optstr=""
54
+ ;;
55
+
23
+
56
*)
24
+def format_value(x, stdev):
57
misc_params=("${misc_params[@]}" "$param")
25
+ stdev_pr = stdev / x * 100
58
;;
26
+ if stdev_pr < 1.5:
27
+ # don't care too much
28
+ return f'{x:.2g}'
29
+ else:
30
+ return f'{x:.2g} ± {math.ceil(stdev_pr)}%'
31
+
32
33
def result_to_text(result):
34
"""Return text representation of bench_one() returned dict."""
35
if 'average' in result:
36
- s = '{:.2f} +- {:.2f}'.format(result['average'], result['stdev'])
37
+ s = format_value(result['average'], result['stdev'])
38
if 'n-failed' in result:
39
s += '\n({} failed)'.format(result['n-failed'])
40
return s
59
--
41
--
60
2.24.1
42
2.29.2
61
43
62
44
diff view generated by jsdifflib
1
IMGOPTS can never be empty for qcow2, because the check scripts adds
1
From: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
2
compat=1.1 unless the user specified any compat option themselves.
3
Thus, this block does not do anything and can be dropped.
4
2
5
Signed-off-by: Max Reitz <mreitz@redhat.com>
3
Performance improvements / degradations are usually discussed in
6
Reviewed-by: Maxim Levitsky <mlevitsk@redhat.com>
4
percentage. Let's make the script calculate it for us.
7
Message-id: 20191107163708.833192-8-mreitz@redhat.com
5
6
Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
7
Message-Id: <20201021145859.11201-20-vsementsov@virtuozzo.com>
8
Reviewed-by: Max Reitz <mreitz@redhat.com>
9
[mreitz: 'seconds' instead of 'secs']
8
Signed-off-by: Max Reitz <mreitz@redhat.com>
10
Signed-off-by: Max Reitz <mreitz@redhat.com>
9
---
11
---
10
tests/qemu-iotests/050 | 4 ----
12
scripts/simplebench/results_to_text.py | 67 +++++++++++++++++++++++---
11
1 file changed, 4 deletions(-)
13
1 file changed, 60 insertions(+), 7 deletions(-)
12
14
13
diff --git a/tests/qemu-iotests/050 b/tests/qemu-iotests/050
15
diff --git a/scripts/simplebench/results_to_text.py b/scripts/simplebench/results_to_text.py
14
index XXXXXXX..XXXXXXX 100755
16
index XXXXXXX..XXXXXXX 100644
15
--- a/tests/qemu-iotests/050
17
--- a/scripts/simplebench/results_to_text.py
16
+++ b/tests/qemu-iotests/050
18
+++ b/scripts/simplebench/results_to_text.py
17
@@ -XXX,XX +XXX,XX @@ trap "_cleanup; exit \$status" 0 1 2 3 15
19
@@ -XXX,XX +XXX,XX @@
18
_supported_fmt qcow2 qed
20
#
19
_supported_proto file
21
20
22
import math
21
-if test "$IMGFMT" = qcow2 && test $IMGOPTS = ""; then
23
+import tabulate
22
- IMGOPTS=compat=1.1
24
+
23
-fi
25
+# We want leading whitespace for difference row cells (see below)
26
+tabulate.PRESERVE_WHITESPACE = True
27
28
29
def format_value(x, stdev):
30
@@ -XXX,XX +XXX,XX @@ def result_to_text(result):
31
return 'FAILED'
32
33
34
-def results_to_text(results):
35
- """Return text representation of bench() returned dict."""
36
- from tabulate import tabulate
24
-
37
-
25
echo
38
+def results_dimension(results):
26
echo "== Creating images =="
39
dim = None
27
40
- tab = [[""] + [c['id'] for c in results['envs']]]
41
for case in results['cases']:
42
- row = [case['id']]
43
for env in results['envs']:
44
res = results['tab'][case['id']][env['id']]
45
if dim is None:
46
dim = res['dimension']
47
else:
48
assert dim == res['dimension']
49
+
50
+ assert dim in ('iops', 'seconds')
51
+
52
+ return dim
53
+
54
+
55
+def results_to_text(results):
56
+ """Return text representation of bench() returned dict."""
57
+ n_columns = len(results['envs'])
58
+ named_columns = n_columns > 2
59
+ dim = results_dimension(results)
60
+ tab = []
61
+
62
+ if named_columns:
63
+ # Environment columns are named A, B, ...
64
+ tab.append([''] + [chr(ord('A') + i) for i in range(n_columns)])
65
+
66
+ tab.append([''] + [c['id'] for c in results['envs']])
67
+
68
+ for case in results['cases']:
69
+ row = [case['id']]
70
+ case_results = results['tab'][case['id']]
71
+ for env in results['envs']:
72
+ res = case_results[env['id']]
73
row.append(result_to_text(res))
74
tab.append(row)
75
76
- return f'All results are in {dim}\n\n' + tabulate(tab)
77
+ # Add row of difference between columns. For each column starting from
78
+ # B we calculate difference with all previous columns.
79
+ row = ['', ''] # case name and first column
80
+ for i in range(1, n_columns):
81
+ cell = ''
82
+ env = results['envs'][i]
83
+ res = case_results[env['id']]
84
+
85
+ if 'average' not in res:
86
+ # Failed result
87
+ row.append(cell)
88
+ continue
89
+
90
+ for j in range(0, i):
91
+ env_j = results['envs'][j]
92
+ res_j = case_results[env_j['id']]
93
+ cell += ' '
94
+
95
+ if 'average' not in res_j:
96
+ # Failed result
97
+ cell += '--'
98
+ continue
99
+
100
+ col_j = tab[0][j + 1] if named_columns else ''
101
+ diff_pr = round((res['average'] - res_j['average']) /
102
+ res_j['average'] * 100)
103
+ cell += f' {col_j}{diff_pr:+}%'
104
+ row.append(cell)
105
+ tab.append(row)
106
+
107
+ return f'All results are in {dim}\n\n' + tabulate.tabulate(tab)
28
--
108
--
29
2.24.1
109
2.29.2
30
110
31
111
diff view generated by jsdifflib
1
Some tests require compat=1.1 and thus set IMGOPTS='compat=1.1'
1
From: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
2
globally. That is not how it should be done; instead, they should
3
simply set _unsupported_imgopts to compat=0.10 (compat=1.1 is the
4
default anyway).
5
2
6
This makes the tests heed user-specified $IMGOPTS. Some do not work
3
Make results_to_text a tool to dump results saved in JSON file.
7
with all image options, though, so we need to disable them accordingly.
8
4
9
Signed-off-by: Max Reitz <mreitz@redhat.com>
5
Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
10
Reviewed-by: Maxim Levitsky <mlevitsky@redhat.com>
6
Message-Id: <20201021145859.11201-21-vsementsov@virtuozzo.com>
11
Message-id: 20191107163708.833192-7-mreitz@redhat.com
7
Reviewed-by: Max Reitz <mreitz@redhat.com>
12
Signed-off-by: Max Reitz <mreitz@redhat.com>
8
Signed-off-by: Max Reitz <mreitz@redhat.com>
13
---
9
---
14
tests/qemu-iotests/036 | 3 +--
10
scripts/simplebench/results_to_text.py | 14 ++++++++++++++
15
tests/qemu-iotests/060 | 4 ++--
11
1 file changed, 14 insertions(+)
16
tests/qemu-iotests/062 | 3 ++-
12
mode change 100644 => 100755 scripts/simplebench/results_to_text.py
17
tests/qemu-iotests/066 | 3 ++-
18
tests/qemu-iotests/068 | 3 ++-
19
tests/qemu-iotests/098 | 4 ++--
20
6 files changed, 11 insertions(+), 9 deletions(-)
21
13
22
diff --git a/tests/qemu-iotests/036 b/tests/qemu-iotests/036
14
diff --git a/scripts/simplebench/results_to_text.py b/scripts/simplebench/results_to_text.py
23
index XXXXXXX..XXXXXXX 100755
15
old mode 100644
24
--- a/tests/qemu-iotests/036
16
new mode 100755
25
+++ b/tests/qemu-iotests/036
17
index XXXXXXX..XXXXXXX
26
@@ -XXX,XX +XXX,XX @@ trap "_cleanup; exit \$status" 0 1 2 3 15
18
--- a/scripts/simplebench/results_to_text.py
27
# This tests qcow2-specific low-level functionality
19
+++ b/scripts/simplebench/results_to_text.py
28
_supported_fmt qcow2
20
@@ -XXX,XX +XXX,XX @@
29
_supported_proto file
21
+#!/usr/bin/env python3
30
-
22
+#
31
# Only qcow2v3 and later supports feature bits
23
# Simple benchmarking framework
32
-IMGOPTS="compat=1.1"
24
#
33
+_unsupported_imgopts 'compat=0.10'
25
# Copyright (c) 2019 Virtuozzo International GmbH.
34
26
@@ -XXX,XX +XXX,XX @@ def results_to_text(results):
35
echo
27
tab.append(row)
36
echo === Image with unknown incompatible feature bit ===
28
37
diff --git a/tests/qemu-iotests/060 b/tests/qemu-iotests/060
29
return f'All results are in {dim}\n\n' + tabulate.tabulate(tab)
38
index XXXXXXX..XXXXXXX 100755
30
+
39
--- a/tests/qemu-iotests/060
31
+
40
+++ b/tests/qemu-iotests/060
32
+if __name__ == '__main__':
41
@@ -XXX,XX +XXX,XX @@ _filter_io_error()
33
+ import sys
42
_supported_fmt qcow2
34
+ import json
43
_supported_proto file
35
+
44
_supported_os Linux
36
+ if len(sys.argv) < 2:
45
+# These tests only work for compat=1.1 images with refcount_bits=16
37
+ print(f'USAGE: {sys.argv[0]} results.json')
46
+_unsupported_imgopts 'compat=0.10' 'refcount_bits=\([^1]\|.\([^6]\|$\)\)'
38
+ exit(1)
47
39
+
48
# The repair process will create a large file - so check for availability first
40
+ with open(sys.argv[1]) as f:
49
_require_large_file 64G
41
+ print(results_to_text(json.load(f)))
50
@@ -XXX,XX +XXX,XX @@ l1_offset=196608 # 0x30000 (XXX: just an assumption)
51
l2_offset=262144 # 0x40000 (XXX: just an assumption)
52
l2_offset_after_snapshot=524288 # 0x80000 (XXX: just an assumption)
53
54
-IMGOPTS="compat=1.1"
55
-
56
OPEN_RW="open -o overlap-check=all $TEST_IMG"
57
# Overlap checks are done before write operations only, therefore opening an
58
# image read-only makes the overlap-check option irrelevant
59
diff --git a/tests/qemu-iotests/062 b/tests/qemu-iotests/062
60
index XXXXXXX..XXXXXXX 100755
61
--- a/tests/qemu-iotests/062
62
+++ b/tests/qemu-iotests/062
63
@@ -XXX,XX +XXX,XX @@ trap "_cleanup; exit \$status" 0 1 2 3 15
64
# This tests qcow2-specific low-level functionality
65
_supported_fmt qcow2
66
_supported_proto generic
67
+# We need zero clusters and snapshots
68
+_unsupported_imgopts 'compat=0.10' 'refcount_bits=1[^0-9]'
69
70
-IMGOPTS="compat=1.1"
71
IMG_SIZE=64M
72
73
echo
74
diff --git a/tests/qemu-iotests/066 b/tests/qemu-iotests/066
75
index XXXXXXX..XXXXXXX 100755
76
--- a/tests/qemu-iotests/066
77
+++ b/tests/qemu-iotests/066
78
@@ -XXX,XX +XXX,XX @@ trap "_cleanup; exit \$status" 0 1 2 3 15
79
# This tests qcow2-specific low-level functionality
80
_supported_fmt qcow2
81
_supported_proto generic
82
+# We need zero clusters and snapshots
83
+_unsupported_imgopts 'compat=0.10' 'refcount_bits=1[^0-9]'
84
85
# Intentionally create an unaligned image
86
-IMGOPTS="compat=1.1"
87
IMG_SIZE=$((64 * 1024 * 1024 + 512))
88
89
echo
90
diff --git a/tests/qemu-iotests/068 b/tests/qemu-iotests/068
91
index XXXXXXX..XXXXXXX 100755
92
--- a/tests/qemu-iotests/068
93
+++ b/tests/qemu-iotests/068
94
@@ -XXX,XX +XXX,XX @@ trap "_cleanup; exit \$status" 0 1 2 3 15
95
# This tests qcow2-specific low-level functionality
96
_supported_fmt qcow2
97
_supported_proto generic
98
+# Internal snapshots are (currently) impossible with refcount_bits=1
99
+_unsupported_imgopts 'compat=0.10' 'refcount_bits=1[^0-9]'
100
101
-IMGOPTS="compat=1.1"
102
IMG_SIZE=128K
103
104
case "$QEMU_DEFAULT_MACHINE" in
105
diff --git a/tests/qemu-iotests/098 b/tests/qemu-iotests/098
106
index XXXXXXX..XXXXXXX 100755
107
--- a/tests/qemu-iotests/098
108
+++ b/tests/qemu-iotests/098
109
@@ -XXX,XX +XXX,XX @@ trap "_cleanup; exit \$status" 0 1 2 3 15
110
111
_supported_fmt qcow2
112
_supported_proto file
113
-
114
-IMGOPTS="compat=1.1"
115
+# The code path we want to test here only works for compat=1.1 images
116
+_unsupported_imgopts 'compat=0.10'
117
118
for event in l1_update empty_image_prepare reftable_update refblock_alloc; do
119
120
--
42
--
121
2.24.1
43
2.29.2
122
44
123
45
diff view generated by jsdifflib
1
From: Andrey Shinkevich <andrey.shinkevich@virtuozzo.com>
1
From: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
2
2
3
Allow writing all the data compressed through the filter driver.
3
Benchmark for new preallocate filter.
4
The written data will be aligned by the cluster size.
5
Based on the QEMU current implementation, that data can be written to
6
unallocated clusters only. May be used for a backup job.
7
4
8
Suggested-by: Max Reitz <mreitz@redhat.com>
5
Example usage:
9
Signed-off-by: Andrey Shinkevich <andrey.shinkevich@virtuozzo.com>
6
./bench_prealloc.py ../../build/qemu-img \
10
Reviewed-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
7
ssd-ext4:/path/to/mount/point \
11
Message-id: 1575288906-551879-2-git-send-email-andrey.shinkevich@virtuozzo.com
8
ssd-xfs:/path2 hdd-ext4:/path3 hdd-xfs:/path4
12
[mreitz: Replace NULL bdrv_get_format_name() by "(no format)"]
9
10
The benchmark shows performance improvement (or degradation) when use
11
new preallocate filter with qcow2 image.
12
13
Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
14
Message-Id: <20201021145859.11201-22-vsementsov@virtuozzo.com>
15
Reviewed-by: Max Reitz <mreitz@redhat.com>
13
Signed-off-by: Max Reitz <mreitz@redhat.com>
16
Signed-off-by: Max Reitz <mreitz@redhat.com>
14
---
17
---
15
block/Makefile.objs | 1 +
18
scripts/simplebench/bench_prealloc.py | 132 ++++++++++++++++++++++++++
16
block/filter-compress.c | 168 ++++++++++++++++++++++++++++++++++++++++
19
1 file changed, 132 insertions(+)
17
qapi/block-core.json | 10 ++-
20
create mode 100755 scripts/simplebench/bench_prealloc.py
18
3 files changed, 175 insertions(+), 4 deletions(-)
19
create mode 100644 block/filter-compress.c
20
21
21
diff --git a/block/Makefile.objs b/block/Makefile.objs
22
diff --git a/scripts/simplebench/bench_prealloc.py b/scripts/simplebench/bench_prealloc.py
22
index XXXXXXX..XXXXXXX 100644
23
new file mode 100755
23
--- a/block/Makefile.objs
24
+++ b/block/Makefile.objs
25
@@ -XXX,XX +XXX,XX @@ block-obj-y += crypto.o
26
27
block-obj-y += aio_task.o
28
block-obj-y += backup-top.o
29
+block-obj-y += filter-compress.o
30
31
common-obj-y += stream.o
32
33
diff --git a/block/filter-compress.c b/block/filter-compress.c
34
new file mode 100644
35
index XXXXXXX..XXXXXXX
24
index XXXXXXX..XXXXXXX
36
--- /dev/null
25
--- /dev/null
37
+++ b/block/filter-compress.c
26
+++ b/scripts/simplebench/bench_prealloc.py
38
@@ -XXX,XX +XXX,XX @@
27
@@ -XXX,XX +XXX,XX @@
39
+/*
28
+#!/usr/bin/env python3
40
+ * Compress filter block driver
29
+#
41
+ *
30
+# Benchmark preallocate filter
42
+ * Copyright (c) 2019 Virtuozzo International GmbH
31
+#
43
+ *
32
+# Copyright (c) 2020 Virtuozzo International GmbH.
44
+ * Author:
33
+#
45
+ * Andrey Shinkevich <andrey.shinkevich@virtuozzo.com>
34
+# This program is free software; you can redistribute it and/or modify
46
+ * (based on block/copy-on-read.c by Max Reitz)
35
+# it under the terms of the GNU General Public License as published by
47
+ *
36
+# the Free Software Foundation; either version 2 of the License, or
48
+ * This program is free software; you can redistribute it and/or
37
+# (at your option) any later version.
49
+ * modify it under the terms of the GNU General Public License as
38
+#
50
+ * published by the Free Software Foundation; either version 2 or
39
+# This program is distributed in the hope that it will be useful,
51
+ * (at your option) any later version of the License.
40
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
52
+ *
41
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
53
+ * This program is distributed in the hope that it will be useful,
42
+# GNU General Public License for more details.
54
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
43
+#
55
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
44
+# You should have received a copy of the GNU General Public License
56
+ * GNU General Public License for more details.
45
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
57
+ *
46
+#
58
+ * You should have received a copy of the GNU General Public License
59
+ * along with this program; if not, see <http://www.gnu.org/licenses/>.
60
+ */
61
+
62
+#include "qemu/osdep.h"
63
+#include "block/block_int.h"
64
+#include "qemu/module.h"
65
+#include "qapi/error.h"
66
+
47
+
67
+
48
+
68
+static int compress_open(BlockDriverState *bs, QDict *options, int flags,
49
+import sys
69
+ Error **errp)
50
+import os
70
+{
51
+import subprocess
71
+ bs->file = bdrv_open_child(NULL, options, "file", bs, &child_file, false,
52
+import re
72
+ errp);
53
+import json
73
+ if (!bs->file) {
74
+ return -EINVAL;
75
+ }
76
+
54
+
77
+ if (!bs->file->bs->drv || !block_driver_can_compress(bs->file->bs->drv)) {
55
+import simplebench
78
+ error_setg(errp,
56
+from results_to_text import results_to_text
79
+ "Compression is not supported for underlying format: %s",
80
+ bdrv_get_format_name(bs->file->bs) ?: "(no format)");
81
+
82
+ return -ENOTSUP;
83
+ }
84
+
85
+ bs->supported_write_flags = BDRV_REQ_WRITE_UNCHANGED |
86
+ (BDRV_REQ_FUA & bs->file->bs->supported_write_flags);
87
+
88
+ bs->supported_zero_flags = BDRV_REQ_WRITE_UNCHANGED |
89
+ ((BDRV_REQ_FUA | BDRV_REQ_MAY_UNMAP | BDRV_REQ_NO_FALLBACK) &
90
+ bs->file->bs->supported_zero_flags);
91
+
92
+ return 0;
93
+}
94
+
57
+
95
+
58
+
96
+static int64_t compress_getlength(BlockDriverState *bs)
59
+def qemu_img_bench(args):
97
+{
60
+ p = subprocess.run(args, stdout=subprocess.PIPE, stderr=subprocess.STDOUT,
98
+ return bdrv_getlength(bs->file->bs);
61
+ universal_newlines=True)
99
+}
62
+
63
+ if p.returncode == 0:
64
+ try:
65
+ m = re.search(r'Run completed in (\d+.\d+) seconds.', p.stdout)
66
+ return {'seconds': float(m.group(1))}
67
+ except Exception:
68
+ return {'error': f'failed to parse qemu-img output: {p.stdout}'}
69
+ else:
70
+ return {'error': f'qemu-img failed: {p.returncode}: {p.stdout}'}
100
+
71
+
101
+
72
+
102
+static int coroutine_fn compress_co_preadv_part(BlockDriverState *bs,
73
+def bench_func(env, case):
103
+ uint64_t offset, uint64_t bytes,
74
+ fname = f"{case['dir']}/prealloc-test.qcow2"
104
+ QEMUIOVector *qiov,
75
+ try:
105
+ size_t qiov_offset,
76
+ os.remove(fname)
106
+ int flags)
77
+ except OSError:
107
+{
78
+ pass
108
+ return bdrv_co_preadv_part(bs->file, offset, bytes, qiov, qiov_offset,
79
+
109
+ flags);
80
+ subprocess.run([env['qemu-img-binary'], 'create', '-f', 'qcow2', fname,
110
+}
81
+ '16G'], stdout=subprocess.DEVNULL,
82
+ stderr=subprocess.DEVNULL, check=True)
83
+
84
+ args = [env['qemu-img-binary'], 'bench', '-c', str(case['count']),
85
+ '-d', '64', '-s', case['block-size'], '-t', 'none', '-n', '-w']
86
+ if env['prealloc']:
87
+ args += ['--image-opts',
88
+ 'driver=qcow2,file.driver=preallocate,file.file.driver=file,'
89
+ f'file.file.filename={fname}']
90
+ else:
91
+ args += ['-f', 'qcow2', fname]
92
+
93
+ return qemu_img_bench(args)
111
+
94
+
112
+
95
+
113
+static int coroutine_fn compress_co_pwritev_part(BlockDriverState *bs,
96
+def auto_count_bench_func(env, case):
114
+ uint64_t offset,
97
+ case['count'] = 100
115
+ uint64_t bytes,
98
+ while True:
116
+ QEMUIOVector *qiov,
99
+ res = bench_func(env, case)
117
+ size_t qiov_offset, int flags)
100
+ if 'error' in res:
118
+{
101
+ return res
119
+ return bdrv_co_pwritev_part(bs->file, offset, bytes, qiov, qiov_offset,
102
+
120
+ flags | BDRV_REQ_WRITE_COMPRESSED);
103
+ if res['seconds'] >= 1:
121
+}
104
+ break
105
+
106
+ case['count'] *= 10
107
+
108
+ if res['seconds'] < 5:
109
+ case['count'] = round(case['count'] * 5 / res['seconds'])
110
+ res = bench_func(env, case)
111
+ if 'error' in res:
112
+ return res
113
+
114
+ res['iops'] = case['count'] / res['seconds']
115
+ return res
122
+
116
+
123
+
117
+
124
+static int coroutine_fn compress_co_pwrite_zeroes(BlockDriverState *bs,
118
+if __name__ == '__main__':
125
+ int64_t offset, int bytes,
119
+ if len(sys.argv) < 2:
126
+ BdrvRequestFlags flags)
120
+ print(f'USAGE: {sys.argv[0]} <qemu-img binary> '
127
+{
121
+ 'DISK_NAME:DIR_PATH ...')
128
+ return bdrv_co_pwrite_zeroes(bs->file, offset, bytes, flags);
122
+ exit(1)
129
+}
130
+
123
+
124
+ qemu_img = sys.argv[1]
131
+
125
+
132
+static int coroutine_fn compress_co_pdiscard(BlockDriverState *bs,
126
+ envs = [
133
+ int64_t offset, int bytes)
127
+ {
134
+{
128
+ 'id': 'no-prealloc',
135
+ return bdrv_co_pdiscard(bs->file, offset, bytes);
129
+ 'qemu-img-binary': qemu_img,
136
+}
130
+ 'prealloc': False
131
+ },
132
+ {
133
+ 'id': 'prealloc',
134
+ 'qemu-img-binary': qemu_img,
135
+ 'prealloc': True
136
+ }
137
+ ]
137
+
138
+
139
+ aligned_cases = []
140
+ unaligned_cases = []
138
+
141
+
139
+static void compress_refresh_limits(BlockDriverState *bs, Error **errp)
142
+ for disk in sys.argv[2:]:
140
+{
143
+ name, path = disk.split(':')
141
+ BlockDriverInfo bdi;
144
+ aligned_cases.append({
142
+ int ret;
145
+ 'id': f'{name}, aligned sequential 16k',
146
+ 'block-size': '16k',
147
+ 'dir': path
148
+ })
149
+ unaligned_cases.append({
150
+ 'id': f'{name}, unaligned sequential 64k',
151
+ 'block-size': '16k',
152
+ 'dir': path
153
+ })
143
+
154
+
144
+ if (!bs->file) {
155
+ result = simplebench.bench(auto_count_bench_func, envs,
145
+ return;
156
+ aligned_cases + unaligned_cases, count=5)
146
+ }
157
+ print(results_to_text(result))
147
+
158
+ with open('results.json', 'w') as f:
148
+ ret = bdrv_get_info(bs->file->bs, &bdi);
159
+ json.dump(result, f, indent=4)
149
+ if (ret < 0 || bdi.cluster_size == 0) {
150
+ return;
151
+ }
152
+
153
+ bs->bl.request_alignment = bdi.cluster_size;
154
+}
155
+
156
+
157
+static void compress_eject(BlockDriverState *bs, bool eject_flag)
158
+{
159
+ bdrv_eject(bs->file->bs, eject_flag);
160
+}
161
+
162
+
163
+static void compress_lock_medium(BlockDriverState *bs, bool locked)
164
+{
165
+ bdrv_lock_medium(bs->file->bs, locked);
166
+}
167
+
168
+
169
+static bool compress_recurse_is_first_non_filter(BlockDriverState *bs,
170
+ BlockDriverState *candidate)
171
+{
172
+ return bdrv_recurse_is_first_non_filter(bs->file->bs, candidate);
173
+}
174
+
175
+
176
+static BlockDriver bdrv_compress = {
177
+ .format_name = "compress",
178
+
179
+ .bdrv_open = compress_open,
180
+ .bdrv_child_perm = bdrv_filter_default_perms,
181
+
182
+ .bdrv_getlength = compress_getlength,
183
+
184
+ .bdrv_co_preadv_part = compress_co_preadv_part,
185
+ .bdrv_co_pwritev_part = compress_co_pwritev_part,
186
+ .bdrv_co_pwrite_zeroes = compress_co_pwrite_zeroes,
187
+ .bdrv_co_pdiscard = compress_co_pdiscard,
188
+ .bdrv_refresh_limits = compress_refresh_limits,
189
+
190
+ .bdrv_eject = compress_eject,
191
+ .bdrv_lock_medium = compress_lock_medium,
192
+
193
+ .bdrv_co_block_status = bdrv_co_block_status_from_file,
194
+
195
+ .bdrv_recurse_is_first_non_filter = compress_recurse_is_first_non_filter,
196
+
197
+ .has_variable_length = true,
198
+ .is_filter = true,
199
+};
200
+
201
+static void bdrv_compress_init(void)
202
+{
203
+ bdrv_register(&bdrv_compress);
204
+}
205
+
206
+block_init(bdrv_compress_init);
207
diff --git a/qapi/block-core.json b/qapi/block-core.json
208
index XXXXXXX..XXXXXXX 100644
209
--- a/qapi/block-core.json
210
+++ b/qapi/block-core.json
211
@@ -XXX,XX +XXX,XX @@
212
# @copy-on-read: Since 3.0
213
# @blklogwrites: Since 3.0
214
# @blkreplay: Since 4.2
215
+# @compress: Since 5.0
216
#
217
# Since: 2.9
218
##
219
{ 'enum': 'BlockdevDriver',
220
'data': [ 'blkdebug', 'blklogwrites', 'blkreplay', 'blkverify', 'bochs',
221
- 'cloop', 'copy-on-read', 'dmg', 'file', 'ftp', 'ftps', 'gluster',
222
- 'host_cdrom', 'host_device', 'http', 'https', 'iscsi', 'luks',
223
- 'nbd', 'nfs', 'null-aio', 'null-co', 'nvme', 'parallels', 'qcow',
224
- 'qcow2', 'qed', 'quorum', 'raw', 'rbd',
225
+ 'cloop', 'compress', 'copy-on-read', 'dmg', 'file', 'ftp', 'ftps',
226
+ 'gluster', 'host_cdrom', 'host_device', 'http', 'https', 'iscsi',
227
+ 'luks', 'nbd', 'nfs', 'null-aio', 'null-co', 'nvme', 'parallels',
228
+ 'qcow', 'qcow2', 'qed', 'quorum', 'raw', 'rbd',
229
{ 'name': 'replication', 'if': 'defined(CONFIG_REPLICATION)' },
230
'sheepdog',
231
'ssh', 'throttle', 'vdi', 'vhdx', 'vmdk', 'vpc', 'vvfat', 'vxhs' ] }
232
@@ -XXX,XX +XXX,XX @@
233
'blkreplay': 'BlockdevOptionsBlkreplay',
234
'bochs': 'BlockdevOptionsGenericFormat',
235
'cloop': 'BlockdevOptionsGenericFormat',
236
+ 'compress': 'BlockdevOptionsGenericFormat',
237
'copy-on-read':'BlockdevOptionsGenericFormat',
238
'dmg': 'BlockdevOptionsGenericFormat',
239
'file': 'BlockdevOptionsFile',
240
--
160
--
241
2.24.1
161
2.29.2
242
162
243
163
diff view generated by jsdifflib
1
Signed-off-by: Max Reitz <mreitz@redhat.com>
1
From: Alberto Garcia <berto@igalia.com>
2
Reviewed-by: Maxim Levitsky <mlevitsk@redhat.com>
2
3
Message-id: 20191107163708.833192-5-mreitz@redhat.com
3
The quorum driver does not implement bdrv_co_block_status() and
4
because of that it always reports to contain data even if all its
5
children are known to be empty.
6
7
One consequence of this is that if we for example create a quorum with
8
a size of 10GB and we mirror it to a new image the operation will
9
write 10GB of actual zeroes to the destination image wasting a lot of
10
time and disk space.
11
12
Since a quorum has an arbitrary number of children of potentially
13
different formats there is no way to report all possible allocation
14
status flags in a way that makes sense, so this implementation only
15
reports when a given region is known to contain zeroes
16
(BDRV_BLOCK_ZERO) or not (BDRV_BLOCK_DATA).
17
18
If all children agree that a region contains zeroes then we can return
19
BDRV_BLOCK_ZERO using the smallest size reported by the children
20
(because all agree that a region of at least that size contains
21
zeroes).
22
23
If at least one child disagrees we have to return BDRV_BLOCK_DATA.
24
In this case we use the largest of the sizes reported by the children
25
that didn't return BDRV_BLOCK_ZERO (because we know that there won't
26
be an agreement for at least that size).
27
28
Signed-off-by: Alberto Garcia <berto@igalia.com>
29
Tested-by: Tao Xu <tao3.xu@intel.com>
30
Reviewed-by: Max Reitz <mreitz@redhat.com>
31
Message-Id: <db83149afcf0f793effc8878089d29af4c46ffe1.1605286097.git.berto@igalia.com>
4
Signed-off-by: Max Reitz <mreitz@redhat.com>
32
Signed-off-by: Max Reitz <mreitz@redhat.com>
5
---
33
---
6
tests/qemu-iotests/common.filter | 24 ++++++++++++++++++++++++
34
block/quorum.c | 52 +++++++++++++
7
1 file changed, 24 insertions(+)
35
tests/qemu-iotests/312 | 148 +++++++++++++++++++++++++++++++++++++
8
36
tests/qemu-iotests/312.out | 67 +++++++++++++++++
9
diff --git a/tests/qemu-iotests/common.filter b/tests/qemu-iotests/common.filter
37
tests/qemu-iotests/group | 1 +
38
4 files changed, 268 insertions(+)
39
create mode 100755 tests/qemu-iotests/312
40
create mode 100644 tests/qemu-iotests/312.out
41
42
diff --git a/block/quorum.c b/block/quorum.c
10
index XXXXXXX..XXXXXXX 100644
43
index XXXXXXX..XXXXXXX 100644
11
--- a/tests/qemu-iotests/common.filter
44
--- a/block/quorum.c
12
+++ b/tests/qemu-iotests/common.filter
45
+++ b/block/quorum.c
13
@@ -XXX,XX +XXX,XX @@ _filter_qmp_empty_return()
46
@@ -XXX,XX +XXX,XX @@
14
grep -v '{"return": {}}'
47
#include "qemu/module.h"
48
#include "qemu/option.h"
49
#include "block/block_int.h"
50
+#include "block/coroutines.h"
51
#include "block/qdict.h"
52
#include "qapi/error.h"
53
#include "qapi/qapi-events-block.h"
54
@@ -XXX,XX +XXX,XX @@ static void quorum_child_perm(BlockDriverState *bs, BdrvChild *c,
55
| DEFAULT_PERM_UNCHANGED;
15
}
56
}
16
57
17
+_filter_json_filename()
58
+/*
59
+ * Each one of the children can report different status flags even
60
+ * when they contain the same data, so what this function does is
61
+ * return BDRV_BLOCK_ZERO if *all* children agree that a certain
62
+ * region contains zeroes, and BDRV_BLOCK_DATA otherwise.
63
+ */
64
+static int coroutine_fn quorum_co_block_status(BlockDriverState *bs,
65
+ bool want_zero,
66
+ int64_t offset, int64_t count,
67
+ int64_t *pnum, int64_t *map,
68
+ BlockDriverState **file)
18
+{
69
+{
19
+ $PYTHON -c 'import sys
70
+ BDRVQuorumState *s = bs->opaque;
20
+result, *fnames = sys.stdin.read().split("json:{")
71
+ int i, ret;
21
+depth = 0
72
+ int64_t pnum_zero = count;
22
+for fname in fnames:
73
+ int64_t pnum_data = 0;
23
+ depth += 1 # For the opening brace in the split separator
74
+
24
+ for chr_i, chr in enumerate(fname):
75
+ for (i = 0; i < s->num_children; i++) {
25
+ if chr == "{":
76
+ int64_t bytes;
26
+ depth += 1
77
+ ret = bdrv_co_common_block_status_above(s->children[i]->bs, NULL, false,
27
+ elif chr == "}":
78
+ want_zero, offset, count,
28
+ depth -= 1
79
+ &bytes, NULL, NULL, NULL);
29
+ if depth == 0:
80
+ if (ret < 0) {
30
+ break
81
+ quorum_report_bad(QUORUM_OP_TYPE_READ, offset, count,
31
+
82
+ s->children[i]->bs->node_name, ret);
32
+ # json:{} filenames may be nested; filter out everything from
83
+ pnum_data = count;
33
+ # inside the outermost one
84
+ break;
34
+ if depth == 0:
85
+ }
35
+ chr_i += 1 # First character past the filename
86
+ /*
36
+ result += "json:{ /* filtered */ }" + fname[chr_i:]
87
+ * Even if all children agree about whether there are zeroes
37
+
88
+ * or not at @offset they might disagree on the size, so use
38
+sys.stdout.write(result)'
89
+ * the smallest when reporting BDRV_BLOCK_ZERO and the largest
90
+ * when reporting BDRV_BLOCK_DATA.
91
+ */
92
+ if (ret & BDRV_BLOCK_ZERO) {
93
+ pnum_zero = MIN(pnum_zero, bytes);
94
+ } else {
95
+ pnum_data = MAX(pnum_data, bytes);
96
+ }
97
+ }
98
+
99
+ if (pnum_data) {
100
+ *pnum = pnum_data;
101
+ return BDRV_BLOCK_DATA;
102
+ } else {
103
+ *pnum = pnum_zero;
104
+ return BDRV_BLOCK_ZERO;
105
+ }
39
+}
106
+}
40
+
107
+
41
# make sure this script returns success
108
static const char *const quorum_strong_runtime_opts[] = {
42
true
109
QUORUM_OPT_VOTE_THRESHOLD,
110
QUORUM_OPT_BLKVERIFY,
111
@@ -XXX,XX +XXX,XX @@ static BlockDriver bdrv_quorum = {
112
.bdrv_close = quorum_close,
113
.bdrv_gather_child_options = quorum_gather_child_options,
114
.bdrv_dirname = quorum_dirname,
115
+ .bdrv_co_block_status = quorum_co_block_status,
116
117
.bdrv_co_flush_to_disk = quorum_co_flush,
118
119
diff --git a/tests/qemu-iotests/312 b/tests/qemu-iotests/312
120
new file mode 100755
121
index XXXXXXX..XXXXXXX
122
--- /dev/null
123
+++ b/tests/qemu-iotests/312
124
@@ -XXX,XX +XXX,XX @@
125
+#!/usr/bin/env bash
126
+#
127
+# Test drive-mirror with quorum
128
+#
129
+# The goal of this test is to check how the quorum driver reports
130
+# regions that are known to read as zeroes (BDRV_BLOCK_ZERO). The idea
131
+# is that drive-mirror will try the efficient representation of zeroes
132
+# in the destination image instead of writing actual zeroes.
133
+#
134
+# Copyright (C) 2020 Igalia, S.L.
135
+# Author: Alberto Garcia <berto@igalia.com>
136
+#
137
+# This program is free software; you can redistribute it and/or modify
138
+# it under the terms of the GNU General Public License as published by
139
+# the Free Software Foundation; either version 2 of the License, or
140
+# (at your option) any later version.
141
+#
142
+# This program is distributed in the hope that it will be useful,
143
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
144
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
145
+# GNU General Public License for more details.
146
+#
147
+# You should have received a copy of the GNU General Public License
148
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
149
+#
150
+
151
+# creator
152
+owner=berto@igalia.com
153
+
154
+seq=`basename $0`
155
+echo "QA output created by $seq"
156
+
157
+status=1    # failure is the default!
158
+
159
+_cleanup()
160
+{
161
+ _rm_test_img "$TEST_IMG.0"
162
+ _rm_test_img "$TEST_IMG.1"
163
+ _rm_test_img "$TEST_IMG.2"
164
+ _rm_test_img "$TEST_IMG.3"
165
+ _cleanup_qemu
166
+}
167
+trap "_cleanup; exit \$status" 0 1 2 3 15
168
+
169
+# get standard environment, filters and checks
170
+. ./common.rc
171
+. ./common.filter
172
+. ./common.qemu
173
+
174
+_supported_fmt qcow2
175
+_supported_proto file
176
+_supported_os Linux
177
+_unsupported_imgopts cluster_size data_file
178
+
179
+echo
180
+echo '### Create all images' # three source (quorum), one destination
181
+echo
182
+TEST_IMG="$TEST_IMG.0" _make_test_img -o cluster_size=64k 10M
183
+TEST_IMG="$TEST_IMG.1" _make_test_img -o cluster_size=64k 10M
184
+TEST_IMG="$TEST_IMG.2" _make_test_img -o cluster_size=64k 10M
185
+TEST_IMG="$TEST_IMG.3" _make_test_img -o cluster_size=64k 10M
186
+
187
+quorum="driver=raw,file.driver=quorum,file.vote-threshold=2"
188
+quorum="$quorum,file.children.0.file.filename=$TEST_IMG.0"
189
+quorum="$quorum,file.children.1.file.filename=$TEST_IMG.1"
190
+quorum="$quorum,file.children.2.file.filename=$TEST_IMG.2"
191
+quorum="$quorum,file.children.0.driver=$IMGFMT"
192
+quorum="$quorum,file.children.1.driver=$IMGFMT"
193
+quorum="$quorum,file.children.2.driver=$IMGFMT"
194
+
195
+echo
196
+echo '### Output of qemu-img map (empty quorum)'
197
+echo
198
+$QEMU_IMG map --image-opts $quorum | _filter_qemu_img_map
199
+
200
+# Now we write data to the quorum. All three images will read as
201
+# zeroes in all cases, but with different ways to represent them
202
+# (unallocated clusters, zero clusters, data clusters with zeroes)
203
+# that will have an effect on how the data will be mirrored and the
204
+# output of qemu-img map on the resulting image.
205
+echo
206
+echo '### Write data to the quorum'
207
+echo
208
+# Test 1: data regions surrounded by unallocated clusters.
209
+# Three data regions, the largest one (0x30000) will be picked, end result:
210
+# offset 0x10000, length 0x30000 -> data
211
+$QEMU_IO -c "write -P 0 $((0x10000)) $((0x10000))" "$TEST_IMG.0" | _filter_qemu_io
212
+$QEMU_IO -c "write -P 0 $((0x10000)) $((0x30000))" "$TEST_IMG.1" | _filter_qemu_io
213
+$QEMU_IO -c "write -P 0 $((0x10000)) $((0x20000))" "$TEST_IMG.2" | _filter_qemu_io
214
+
215
+# Test 2: zero regions surrounded by data clusters.
216
+# First we allocate the data clusters.
217
+$QEMU_IO -c "open -o $quorum" -c "write -P 0 $((0x100000)) $((0x40000))" | _filter_qemu_io
218
+
219
+# Three zero regions, the smallest one (0x10000) will be picked, end result:
220
+# offset 0x100000, length 0x10000 -> data
221
+# offset 0x110000, length 0x10000 -> zeroes
222
+# offset 0x120000, length 0x20000 -> data
223
+$QEMU_IO -c "write -z $((0x110000)) $((0x10000))" "$TEST_IMG.0" | _filter_qemu_io
224
+$QEMU_IO -c "write -z $((0x110000)) $((0x30000))" "$TEST_IMG.1" | _filter_qemu_io
225
+$QEMU_IO -c "write -z $((0x110000)) $((0x20000))" "$TEST_IMG.2" | _filter_qemu_io
226
+
227
+# Test 3: zero clusters surrounded by unallocated clusters.
228
+# Everything reads as zeroes, no effect on the end result.
229
+$QEMU_IO -c "write -z $((0x150000)) $((0x10000))" "$TEST_IMG.0" | _filter_qemu_io
230
+$QEMU_IO -c "write -z $((0x150000)) $((0x30000))" "$TEST_IMG.1" | _filter_qemu_io
231
+$QEMU_IO -c "write -z $((0x150000)) $((0x20000))" "$TEST_IMG.2" | _filter_qemu_io
232
+
233
+# Test 4: mix of data and zero clusters.
234
+# The zero region will be ignored in favor of the largest data region
235
+# (0x20000), end result:
236
+# offset 0x200000, length 0x20000 -> data
237
+$QEMU_IO -c "write -P 0 $((0x200000)) $((0x10000))" "$TEST_IMG.0" | _filter_qemu_io
238
+$QEMU_IO -c "write -z $((0x200000)) $((0x30000))" "$TEST_IMG.1" | _filter_qemu_io
239
+$QEMU_IO -c "write -P 0 $((0x200000)) $((0x20000))" "$TEST_IMG.2" | _filter_qemu_io
240
+
241
+echo
242
+echo '### Launch the drive-mirror job'
243
+echo
244
+qemu_comm_method="qmp" _launch_qemu -drive if=virtio,"$quorum"
245
+h=$QEMU_HANDLE
246
+_send_qemu_cmd $h "{ 'execute': 'qmp_capabilities' }" 'return'
247
+
248
+_send_qemu_cmd $h \
249
+ "{'execute': 'drive-mirror',
250
+ 'arguments': {'device': 'virtio0',
251
+ 'format': '$IMGFMT',
252
+ 'target': '$TEST_IMG.3',
253
+ 'sync': 'full',
254
+ 'mode': 'existing' }}" \
255
+ "BLOCK_JOB_READY.*virtio0"
256
+
257
+_send_qemu_cmd $h \
258
+ "{ 'execute': 'block-job-complete',
259
+ 'arguments': { 'device': 'virtio0' } }" \
260
+ 'BLOCK_JOB_COMPLETED'
261
+
262
+_send_qemu_cmd $h "{ 'execute': 'quit' }" ''
263
+
264
+echo
265
+echo '### Output of qemu-img map (destination image)'
266
+echo
267
+$QEMU_IMG map "$TEST_IMG.3" | _filter_qemu_img_map
268
+
269
+# success, all done
270
+echo "*** done"
271
+rm -f $seq.full
272
+status=0
273
diff --git a/tests/qemu-iotests/312.out b/tests/qemu-iotests/312.out
274
new file mode 100644
275
index XXXXXXX..XXXXXXX
276
--- /dev/null
277
+++ b/tests/qemu-iotests/312.out
278
@@ -XXX,XX +XXX,XX @@
279
+QA output created by 312
280
+
281
+### Create all images
282
+
283
+Formatting 'TEST_DIR/t.IMGFMT.0', fmt=IMGFMT size=10485760
284
+Formatting 'TEST_DIR/t.IMGFMT.1', fmt=IMGFMT size=10485760
285
+Formatting 'TEST_DIR/t.IMGFMT.2', fmt=IMGFMT size=10485760
286
+Formatting 'TEST_DIR/t.IMGFMT.3', fmt=IMGFMT size=10485760
287
+
288
+### Output of qemu-img map (empty quorum)
289
+
290
+Offset Length File
291
+
292
+### Write data to the quorum
293
+
294
+wrote 65536/65536 bytes at offset 65536
295
+64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
296
+wrote 196608/196608 bytes at offset 65536
297
+192 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
298
+wrote 131072/131072 bytes at offset 65536
299
+128 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
300
+wrote 262144/262144 bytes at offset 1048576
301
+256 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
302
+wrote 65536/65536 bytes at offset 1114112
303
+64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
304
+wrote 196608/196608 bytes at offset 1114112
305
+192 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
306
+wrote 131072/131072 bytes at offset 1114112
307
+128 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
308
+wrote 65536/65536 bytes at offset 1376256
309
+64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
310
+wrote 196608/196608 bytes at offset 1376256
311
+192 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
312
+wrote 131072/131072 bytes at offset 1376256
313
+128 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
314
+wrote 65536/65536 bytes at offset 2097152
315
+64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
316
+wrote 196608/196608 bytes at offset 2097152
317
+192 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
318
+wrote 131072/131072 bytes at offset 2097152
319
+128 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
320
+
321
+### Launch the drive-mirror job
322
+
323
+{ 'execute': 'qmp_capabilities' }
324
+{"return": {}}
325
+{'execute': 'drive-mirror', 'arguments': {'device': 'virtio0', 'format': 'IMGFMT', 'target': 'TEST_DIR/t.IMGFMT.3', 'sync': 'full', 'mode': 'existing' }}
326
+{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "created", "id": "virtio0"}}
327
+{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "running", "id": "virtio0"}}
328
+{"return": {}}
329
+{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "ready", "id": "virtio0"}}
330
+{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "BLOCK_JOB_READY", "data": {"device": "virtio0", "len": 10485760, "offset": 10485760, "speed": 0, "type": "mirror"}}
331
+{ 'execute': 'block-job-complete', 'arguments': { 'device': 'virtio0' } }
332
+{"return": {}}
333
+{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "waiting", "id": "virtio0"}}
334
+{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "pending", "id": "virtio0"}}
335
+{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "BLOCK_JOB_COMPLETED", "data": {"device": "virtio0", "len": 10485760, "offset": 10485760, "speed": 0, "type": "mirror"}}
336
+{ 'execute': 'quit' }
337
+
338
+### Output of qemu-img map (destination image)
339
+
340
+Offset Length File
341
+0x10000 0x30000 TEST_DIR/t.IMGFMT.3
342
+0x100000 0x10000 TEST_DIR/t.IMGFMT.3
343
+0x120000 0x20000 TEST_DIR/t.IMGFMT.3
344
+0x200000 0x20000 TEST_DIR/t.IMGFMT.3
345
+*** done
346
diff --git a/tests/qemu-iotests/group b/tests/qemu-iotests/group
347
index XXXXXXX..XXXXXXX 100644
348
--- a/tests/qemu-iotests/group
349
+++ b/tests/qemu-iotests/group
350
@@ -XXX,XX +XXX,XX @@
351
307 rw quick export
352
308 rw
353
309 rw auto quick
354
+312 rw auto quick
43
--
355
--
44
2.24.1
356
2.29.2
45
357
46
358
diff view generated by jsdifflib
1
From: Andrey Shinkevich <andrey.shinkevich@virtuozzo.com>
1
From: Alberto Garcia <berto@igalia.com>
2
2
3
QEMU currently supports writing compressed data of the size equal to
3
This simply calls bdrv_co_pwrite_zeroes() in all children.
4
one cluster. This patch allows writing QCOW2 compressed data that
5
exceed one cluster. Now, we split buffered data into separate clusters
6
and write them compressed using the block/aio_task API.
7
4
8
Suggested-by: Pavel Butsykin <pbutsykin@virtuozzo.com>
5
bs->supported_zero_flags is also set to the flags that are supported
9
Suggested-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
6
by all children.
10
Signed-off-by: Andrey Shinkevich <andrey.shinkevich@virtuozzo.com>
7
11
Reviewed-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
8
Signed-off-by: Alberto Garcia <berto@igalia.com>
9
Message-Id: <2f09c842781fe336b4c2e40036bba577b7430190.1605286097.git.berto@igalia.com>
12
Reviewed-by: Max Reitz <mreitz@redhat.com>
10
Reviewed-by: Max Reitz <mreitz@redhat.com>
13
Message-id: 1575288906-551879-3-git-send-email-andrey.shinkevich@virtuozzo.com
14
Signed-off-by: Max Reitz <mreitz@redhat.com>
11
Signed-off-by: Max Reitz <mreitz@redhat.com>
15
---
12
---
16
block/qcow2.c | 102 +++++++++++++++++++++++++++++++++++++-------------
13
block/quorum.c | 36 ++++++++++++++++++++++++++++++++++--
17
1 file changed, 75 insertions(+), 27 deletions(-)
14
tests/qemu-iotests/312 | 11 +++++++++++
15
tests/qemu-iotests/312.out | 8 ++++++++
16
3 files changed, 53 insertions(+), 2 deletions(-)
18
17
19
diff --git a/block/qcow2.c b/block/qcow2.c
18
diff --git a/block/quorum.c b/block/quorum.c
20
index XXXXXXX..XXXXXXX 100644
19
index XXXXXXX..XXXXXXX 100644
21
--- a/block/qcow2.c
20
--- a/block/quorum.c
22
+++ b/block/qcow2.c
21
+++ b/block/quorum.c
23
@@ -XXX,XX +XXX,XX @@ fail:
22
@@ -XXX,XX +XXX,XX @@ static void write_quorum_entry(void *opaque)
23
QuorumChildRequest *sacb = &acb->qcrs[i];
24
25
sacb->bs = s->children[i]->bs;
26
- sacb->ret = bdrv_co_pwritev(s->children[i], acb->offset, acb->bytes,
27
- acb->qiov, acb->flags);
28
+ if (acb->flags & BDRV_REQ_ZERO_WRITE) {
29
+ sacb->ret = bdrv_co_pwrite_zeroes(s->children[i], acb->offset,
30
+ acb->bytes, acb->flags);
31
+ } else {
32
+ sacb->ret = bdrv_co_pwritev(s->children[i], acb->offset, acb->bytes,
33
+ acb->qiov, acb->flags);
34
+ }
35
if (sacb->ret == 0) {
36
acb->success_count++;
37
} else {
38
@@ -XXX,XX +XXX,XX @@ static int quorum_co_pwritev(BlockDriverState *bs, uint64_t offset,
24
return ret;
39
return ret;
25
}
40
}
26
41
27
-/* XXX: put compressed sectors first, then all the cluster aligned
42
+static int quorum_co_pwrite_zeroes(BlockDriverState *bs, int64_t offset,
28
- tables to avoid losing bytes in alignment */
43
+ int bytes, BdrvRequestFlags flags)
29
static coroutine_fn int
44
+
30
-qcow2_co_pwritev_compressed_part(BlockDriverState *bs,
31
+qcow2_co_pwritev_compressed_task(BlockDriverState *bs,
32
uint64_t offset, uint64_t bytes,
33
QEMUIOVector *qiov, size_t qiov_offset)
34
{
35
@@ -XXX,XX +XXX,XX @@ qcow2_co_pwritev_compressed_part(BlockDriverState *bs,
36
uint8_t *buf, *out_buf;
37
uint64_t cluster_offset;
38
39
- if (has_data_file(bs)) {
40
- return -ENOTSUP;
41
- }
42
-
43
- if (bytes == 0) {
44
- /* align end of file to a sector boundary to ease reading with
45
- sector based I/Os */
46
- int64_t len = bdrv_getlength(bs->file->bs);
47
- if (len < 0) {
48
- return len;
49
- }
50
- return bdrv_co_truncate(bs->file, len, false, PREALLOC_MODE_OFF, NULL);
51
- }
52
-
53
- if (offset_into_cluster(s, offset)) {
54
- return -EINVAL;
55
- }
56
+ assert(bytes == s->cluster_size || (bytes < s->cluster_size &&
57
+ (offset + bytes == bs->total_sectors << BDRV_SECTOR_BITS)));
58
59
buf = qemu_blockalign(bs, s->cluster_size);
60
- if (bytes != s->cluster_size) {
61
- if (bytes > s->cluster_size ||
62
- offset + bytes != bs->total_sectors << BDRV_SECTOR_BITS)
63
- {
64
- qemu_vfree(buf);
65
- return -EINVAL;
66
- }
67
+ if (bytes < s->cluster_size) {
68
/* Zero-pad last write if image size is not cluster aligned */
69
memset(buf + bytes, 0, s->cluster_size - bytes);
70
}
71
@@ -XXX,XX +XXX,XX @@ fail:
72
return ret;
73
}
74
75
+static coroutine_fn int qcow2_co_pwritev_compressed_task_entry(AioTask *task)
76
+{
45
+{
77
+ Qcow2AioTask *t = container_of(task, Qcow2AioTask, task);
46
+ return quorum_co_pwritev(bs, offset, bytes, NULL,
78
+
47
+ flags | BDRV_REQ_ZERO_WRITE);
79
+ assert(!t->cluster_type && !t->l2meta);
80
+
81
+ return qcow2_co_pwritev_compressed_task(t->bs, t->offset, t->bytes, t->qiov,
82
+ t->qiov_offset);
83
+}
48
+}
84
+
49
+
85
+/*
50
static int64_t quorum_getlength(BlockDriverState *bs)
86
+ * XXX: put compressed sectors first, then all the cluster aligned
51
{
87
+ * tables to avoid losing bytes in alignment
52
BDRVQuorumState *s = bs->opaque;
88
+ */
53
@@ -XXX,XX +XXX,XX @@ static QemuOptsList quorum_runtime_opts = {
89
+static coroutine_fn int
54
},
90
+qcow2_co_pwritev_compressed_part(BlockDriverState *bs,
55
};
91
+ uint64_t offset, uint64_t bytes,
56
92
+ QEMUIOVector *qiov, size_t qiov_offset)
57
+static void quorum_refresh_flags(BlockDriverState *bs)
93
+{
58
+{
94
+ BDRVQcow2State *s = bs->opaque;
59
+ BDRVQuorumState *s = bs->opaque;
95
+ AioTaskPool *aio = NULL;
60
+ int i;
96
+ int ret = 0;
97
+
61
+
98
+ if (has_data_file(bs)) {
62
+ bs->supported_zero_flags =
99
+ return -ENOTSUP;
63
+ BDRV_REQ_FUA | BDRV_REQ_MAY_UNMAP | BDRV_REQ_NO_FALLBACK;
64
+
65
+ for (i = 0; i < s->num_children; i++) {
66
+ bs->supported_zero_flags &= s->children[i]->bs->supported_zero_flags;
100
+ }
67
+ }
101
+
68
+
102
+ if (bytes == 0) {
69
+ bs->supported_zero_flags |= BDRV_REQ_WRITE_UNCHANGED;
103
+ /*
104
+ * align end of file to a sector boundary to ease reading with
105
+ * sector based I/Os
106
+ */
107
+ int64_t len = bdrv_getlength(bs->file->bs);
108
+ if (len < 0) {
109
+ return len;
110
+ }
111
+ return bdrv_co_truncate(bs->file, len, false, PREALLOC_MODE_OFF, NULL);
112
+ }
113
+
114
+ if (offset_into_cluster(s, offset)) {
115
+ return -EINVAL;
116
+ }
117
+
118
+ while (bytes && aio_task_pool_status(aio) == 0) {
119
+ uint64_t chunk_size = MIN(bytes, s->cluster_size);
120
+
121
+ if (!aio && chunk_size != bytes) {
122
+ aio = aio_task_pool_new(QCOW2_MAX_WORKERS);
123
+ }
124
+
125
+ ret = qcow2_add_task(bs, aio, qcow2_co_pwritev_compressed_task_entry,
126
+ 0, 0, offset, chunk_size, qiov, qiov_offset, NULL);
127
+ if (ret < 0) {
128
+ break;
129
+ }
130
+ qiov_offset += chunk_size;
131
+ offset += chunk_size;
132
+ bytes -= chunk_size;
133
+ }
134
+
135
+ if (aio) {
136
+ aio_task_pool_wait_all(aio);
137
+ if (ret == 0) {
138
+ ret = aio_task_pool_status(aio);
139
+ }
140
+ g_free(aio);
141
+ }
142
+
143
+ return ret;
144
+}
70
+}
145
+
71
+
146
static int coroutine_fn
72
static int quorum_open(BlockDriverState *bs, QDict *options, int flags,
147
qcow2_co_preadv_compressed(BlockDriverState *bs,
73
Error **errp)
148
uint64_t file_cluster_offset,
74
{
75
@@ -XXX,XX +XXX,XX @@ static int quorum_open(BlockDriverState *bs, QDict *options, int flags,
76
s->next_child_index = s->num_children;
77
78
bs->supported_write_flags = BDRV_REQ_WRITE_UNCHANGED;
79
+ quorum_refresh_flags(bs);
80
81
g_free(opened);
82
goto exit;
83
@@ -XXX,XX +XXX,XX @@ static void quorum_add_child(BlockDriverState *bs, BlockDriverState *child_bs,
84
}
85
s->children = g_renew(BdrvChild *, s->children, s->num_children + 1);
86
s->children[s->num_children++] = child;
87
+ quorum_refresh_flags(bs);
88
89
out:
90
bdrv_drained_end(bs);
91
@@ -XXX,XX +XXX,XX @@ static void quorum_del_child(BlockDriverState *bs, BdrvChild *child,
92
s->children = g_renew(BdrvChild *, s->children, --s->num_children);
93
bdrv_unref_child(bs, child);
94
95
+ quorum_refresh_flags(bs);
96
bdrv_drained_end(bs);
97
}
98
99
@@ -XXX,XX +XXX,XX @@ static BlockDriver bdrv_quorum = {
100
101
.bdrv_co_preadv = quorum_co_preadv,
102
.bdrv_co_pwritev = quorum_co_pwritev,
103
+ .bdrv_co_pwrite_zeroes = quorum_co_pwrite_zeroes,
104
105
.bdrv_add_child = quorum_add_child,
106
.bdrv_del_child = quorum_del_child,
107
diff --git a/tests/qemu-iotests/312 b/tests/qemu-iotests/312
108
index XXXXXXX..XXXXXXX 100755
109
--- a/tests/qemu-iotests/312
110
+++ b/tests/qemu-iotests/312
111
@@ -XXX,XX +XXX,XX @@ $QEMU_IO -c "write -P 0 $((0x200000)) $((0x10000))" "$TEST_IMG.0" | _filter_qemu
112
$QEMU_IO -c "write -z $((0x200000)) $((0x30000))" "$TEST_IMG.1" | _filter_qemu_io
113
$QEMU_IO -c "write -P 0 $((0x200000)) $((0x20000))" "$TEST_IMG.2" | _filter_qemu_io
114
115
+# Test 5: write data to a region and then zeroize it, doing it
116
+# directly on the quorum device instead of the individual images.
117
+# This has no effect on the end result but proves that the quorum driver
118
+# supports 'write -z'.
119
+$QEMU_IO -c "open -o $quorum" -c "write -P 1 $((0x250000)) $((0x10000))" | _filter_qemu_io
120
+# Verify the data that we just wrote
121
+$QEMU_IO -c "open -o $quorum" -c "read -P 1 $((0x250000)) $((0x10000))" | _filter_qemu_io
122
+$QEMU_IO -c "open -o $quorum" -c "write -z $((0x250000)) $((0x10000))" | _filter_qemu_io
123
+# Now it should read back as zeroes
124
+$QEMU_IO -c "open -o $quorum" -c "read -P 0 $((0x250000)) $((0x10000))" | _filter_qemu_io
125
+
126
echo
127
echo '### Launch the drive-mirror job'
128
echo
129
diff --git a/tests/qemu-iotests/312.out b/tests/qemu-iotests/312.out
130
index XXXXXXX..XXXXXXX 100644
131
--- a/tests/qemu-iotests/312.out
132
+++ b/tests/qemu-iotests/312.out
133
@@ -XXX,XX +XXX,XX @@ wrote 196608/196608 bytes at offset 2097152
134
192 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
135
wrote 131072/131072 bytes at offset 2097152
136
128 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
137
+wrote 65536/65536 bytes at offset 2424832
138
+64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
139
+read 65536/65536 bytes at offset 2424832
140
+64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
141
+wrote 65536/65536 bytes at offset 2424832
142
+64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
143
+read 65536/65536 bytes at offset 2424832
144
+64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
145
146
### Launch the drive-mirror job
147
149
--
148
--
150
2.24.1
149
2.29.2
151
150
152
151
diff view generated by jsdifflib
1
From: Philippe Mathieu-Daudé <philmd@redhat.com>
1
From: Philippe Mathieu-Daudé <philmd@redhat.com>
2
2
3
Commit 6f6e1698a6 desugarized "-machine accel=" to a list
3
NVMe drive cannot be shrunk.
4
of "-accel" options. Since now "-machine accel" and "-accel"
5
became incompatible, update the iotests to the new format.
6
4
7
Error reported here:
5
Since commit c80d8b06cfa we can use the @exact parameter (set
8
https://gitlab.com/qemu-project/qemu/-/jobs/385801004#L3400
6
to false) to return success if the block device is larger than
7
the requested offset (even if we can not be shrunk).
9
8
10
Reported-by: GitLab CI
9
Use this parameter to implement the NVMe truncate() coroutine,
11
Fixes: 6f6e1698a6 (vl: configure accelerators from -accel options)
10
similarly how it is done for the iscsi and file-posix drivers
11
(see commit 82325ae5f2f "Evaluate @exact in protocol drivers").
12
13
Reported-by: Xueqiang Wei <xuwei@redhat.com>
14
Suggested-by: Max Reitz <mreitz@redhat.com>
12
Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com>
15
Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com>
13
Message-id: 20200106130951.29873-1-philmd@redhat.com
16
Message-Id: <20201210125202.858656-1-philmd@redhat.com>
14
Signed-off-by: Max Reitz <mreitz@redhat.com>
17
Signed-off-by: Max Reitz <mreitz@redhat.com>
15
---
18
---
16
tests/qemu-iotests/235 | 2 +-
19
block/nvme.c | 24 ++++++++++++++++++++++++
17
tests/qemu-iotests/check | 6 +++---
20
1 file changed, 24 insertions(+)
18
2 files changed, 4 insertions(+), 4 deletions(-)
19
21
20
diff --git a/tests/qemu-iotests/235 b/tests/qemu-iotests/235
22
diff --git a/block/nvme.c b/block/nvme.c
21
index XXXXXXX..XXXXXXX 100755
23
index XXXXXXX..XXXXXXX 100644
22
--- a/tests/qemu-iotests/235
24
--- a/block/nvme.c
23
+++ b/tests/qemu-iotests/235
25
+++ b/block/nvme.c
24
@@ -XXX,XX +XXX,XX @@ qemu_img_create('-f', iotests.imgfmt, '-o', 'preallocation=metadata', disk,
26
@@ -XXX,XX +XXX,XX @@ out:
25
str(size))
27
26
28
}
27
vm = QEMUMachine(iotests.qemu_prog)
29
28
-vm.add_args('-machine', 'accel=kvm:tcg')
30
+static int coroutine_fn nvme_co_truncate(BlockDriverState *bs, int64_t offset,
29
+vm.add_args('-accel', 'kvm', '-accel', 'tcg')
31
+ bool exact, PreallocMode prealloc,
30
if iotests.qemu_default_machine == 's390-ccw-virtio':
32
+ BdrvRequestFlags flags, Error **errp)
31
vm.add_args('-no-shutdown')
33
+{
32
vm.add_args('-drive', 'id=src,file=' + disk)
34
+ int64_t cur_length;
33
diff --git a/tests/qemu-iotests/check b/tests/qemu-iotests/check
35
+
34
index XXXXXXX..XXXXXXX 100755
36
+ if (prealloc != PREALLOC_MODE_OFF) {
35
--- a/tests/qemu-iotests/check
37
+ error_setg(errp, "Unsupported preallocation mode '%s'",
36
+++ b/tests/qemu-iotests/check
38
+ PreallocMode_str(prealloc));
37
@@ -XXX,XX +XXX,XX @@ export QEMU_PROG="$(type -p "$QEMU_PROG")"
39
+ return -ENOTSUP;
38
40
+ }
39
case "$QEMU_PROG" in
41
+
40
*qemu-system-arm|*qemu-system-aarch64)
42
+ cur_length = nvme_getlength(bs);
41
- export QEMU_OPTIONS="-nodefaults -display none -machine virt,accel=qtest"
43
+ if (offset != cur_length && exact) {
42
+ export QEMU_OPTIONS="-nodefaults -display none -machine virt -accel qtest"
44
+ error_setg(errp, "Cannot resize NVMe devices");
43
;;
45
+ return -ENOTSUP;
44
*qemu-system-tricore)
46
+ } else if (offset > cur_length) {
45
- export QEMU_OPTIONS="-nodefaults -display none -machine tricore_testboard,accel=qtest"
47
+ error_setg(errp, "Cannot grow NVMe devices");
46
+ export QEMU_OPTIONS="-nodefaults -display none -machine tricore_testboard -accel qtest"
48
+ return -EINVAL;
47
;;
49
+ }
48
*)
50
+
49
- export QEMU_OPTIONS="-nodefaults -display none -machine accel=qtest"
51
+ return 0;
50
+ export QEMU_OPTIONS="-nodefaults -display none -accel qtest"
52
+}
51
;;
53
52
esac
54
static int nvme_reopen_prepare(BDRVReopenState *reopen_state,
53
55
BlockReopenQueue *queue, Error **errp)
56
@@ -XXX,XX +XXX,XX @@ static BlockDriver bdrv_nvme = {
57
.bdrv_close = nvme_close,
58
.bdrv_getlength = nvme_getlength,
59
.bdrv_probe_blocksizes = nvme_probe_blocksizes,
60
+ .bdrv_co_truncate = nvme_co_truncate,
61
62
.bdrv_co_preadv = nvme_co_preadv,
63
.bdrv_co_pwritev = nvme_co_pwritev,
54
--
64
--
55
2.24.1
65
2.29.2
56
66
57
67
diff view generated by jsdifflib
1
Print the feature fields as a set of bits so that filtering is easier.
1
The first parameter passed to _send_qemu_cmd is supposed to be the
2
$QEMU_HANDLE. 102 does not do so here, fix it.
3
4
As a result, the output changes: Now we see the prompt this command is
5
supposedly waiting for before the resize message - as it should be.
2
6
3
Signed-off-by: Max Reitz <mreitz@redhat.com>
7
Signed-off-by: Max Reitz <mreitz@redhat.com>
4
Reviewed-by: Maxim Levitsky <mlevitsk@redhat.com>
8
Message-Id: <20201217153803.101231-2-mreitz@redhat.com>
5
Message-id: 20191107163708.833192-4-mreitz@redhat.com
9
Reviewed-by: Kevin Wolf <kwolf@redhat.com>
6
Signed-off-by: Max Reitz <mreitz@redhat.com>
7
---
10
---
8
tests/qemu-iotests/031.out | 36 +++++++++----------
11
tests/qemu-iotests/102 | 2 +-
9
tests/qemu-iotests/036.out | 18 +++++-----
12
tests/qemu-iotests/102.out | 2 +-
10
tests/qemu-iotests/039.out | 22 ++++++------
13
2 files changed, 2 insertions(+), 2 deletions(-)
11
tests/qemu-iotests/060.out | 20 +++++------
12
tests/qemu-iotests/061.out | 72 ++++++++++++++++++-------------------
13
tests/qemu-iotests/137.out | 2 +-
14
tests/qemu-iotests/qcow2.py | 18 +++++++---
15
7 files changed, 99 insertions(+), 89 deletions(-)
16
14
17
diff --git a/tests/qemu-iotests/031.out b/tests/qemu-iotests/031.out
15
diff --git a/tests/qemu-iotests/102 b/tests/qemu-iotests/102
16
index XXXXXXX..XXXXXXX 100755
17
--- a/tests/qemu-iotests/102
18
+++ b/tests/qemu-iotests/102
19
@@ -XXX,XX +XXX,XX @@ $QEMU_IO -c 'write 0 64k' "$TEST_IMG" | _filter_qemu_io
20
qemu_comm_method=monitor _launch_qemu -drive if=none,file="$TEST_IMG",id=drv0
21
22
# Wait for a prompt to appear (so we know qemu has opened the image)
23
-_send_qemu_cmd '' '(qemu)'
24
+_send_qemu_cmd $QEMU_HANDLE '' '(qemu)'
25
26
$QEMU_IMG resize --shrink --image-opts \
27
"driver=raw,file.driver=file,file.filename=$TEST_IMG,file.locking=off" \
28
diff --git a/tests/qemu-iotests/102.out b/tests/qemu-iotests/102.out
18
index XXXXXXX..XXXXXXX 100644
29
index XXXXXXX..XXXXXXX 100644
19
--- a/tests/qemu-iotests/031.out
30
--- a/tests/qemu-iotests/102.out
20
+++ b/tests/qemu-iotests/031.out
31
+++ b/tests/qemu-iotests/102.out
21
@@ -XXX,XX +XXX,XX @@ refcount_table_offset 0x10000
32
@@ -XXX,XX +XXX,XX @@ Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=65536
22
refcount_table_clusters 1
23
nb_snapshots 0
24
snapshot_offset 0x0
25
-incompatible_features 0x0
26
-compatible_features 0x0
27
-autoclear_features 0x0
28
+incompatible_features []
29
+compatible_features []
30
+autoclear_features []
31
refcount_order 4
32
header_length 72
33
34
@@ -XXX,XX +XXX,XX @@ refcount_table_offset 0x10000
35
refcount_table_clusters 1
36
nb_snapshots 0
37
snapshot_offset 0x0
38
-incompatible_features 0x0
39
-compatible_features 0x0
40
-autoclear_features 0x0
41
+incompatible_features []
42
+compatible_features []
43
+autoclear_features []
44
refcount_order 4
45
header_length 72
46
47
@@ -XXX,XX +XXX,XX @@ refcount_table_offset 0x10000
48
refcount_table_clusters 1
49
nb_snapshots 0
50
snapshot_offset 0x0
51
-incompatible_features 0x0
52
-compatible_features 0x0
53
-autoclear_features 0x0
54
+incompatible_features []
55
+compatible_features []
56
+autoclear_features []
57
refcount_order 4
58
header_length 72
59
60
@@ -XXX,XX +XXX,XX @@ refcount_table_offset 0x10000
61
refcount_table_clusters 1
62
nb_snapshots 0
63
snapshot_offset 0x0
64
-incompatible_features 0x0
65
-compatible_features 0x0
66
-autoclear_features 0x0
67
+incompatible_features []
68
+compatible_features []
69
+autoclear_features []
70
refcount_order 4
71
header_length 104
72
73
@@ -XXX,XX +XXX,XX @@ refcount_table_offset 0x10000
74
refcount_table_clusters 1
75
nb_snapshots 0
76
snapshot_offset 0x0
77
-incompatible_features 0x0
78
-compatible_features 0x0
79
-autoclear_features 0x0
80
+incompatible_features []
81
+compatible_features []
82
+autoclear_features []
83
refcount_order 4
84
header_length 104
85
86
@@ -XXX,XX +XXX,XX @@ refcount_table_offset 0x10000
87
refcount_table_clusters 1
88
nb_snapshots 0
89
snapshot_offset 0x0
90
-incompatible_features 0x0
91
-compatible_features 0x0
92
-autoclear_features 0x0
93
+incompatible_features []
94
+compatible_features []
95
+autoclear_features []
96
refcount_order 4
97
header_length 104
98
99
diff --git a/tests/qemu-iotests/036.out b/tests/qemu-iotests/036.out
100
index XXXXXXX..XXXXXXX 100644
101
--- a/tests/qemu-iotests/036.out
102
+++ b/tests/qemu-iotests/036.out
103
@@ -XXX,XX +XXX,XX @@ refcount_table_offset 0x10000
104
refcount_table_clusters 1
105
nb_snapshots 0
106
snapshot_offset 0x0
107
-incompatible_features 0x8000000000000000
108
-compatible_features 0x0
109
-autoclear_features 0x0
110
+incompatible_features [63]
111
+compatible_features []
112
+autoclear_features []
113
refcount_order 4
114
header_length 104
115
116
@@ -XXX,XX +XXX,XX @@ refcount_table_offset 0x10000
117
refcount_table_clusters 1
118
nb_snapshots 0
119
snapshot_offset 0x0
120
-incompatible_features 0x0
121
-compatible_features 0x0
122
-autoclear_features 0x8000000000000000
123
+incompatible_features []
124
+compatible_features []
125
+autoclear_features [63]
126
refcount_order 4
127
header_length 104
128
129
@@ -XXX,XX +XXX,XX @@ refcount_table_offset 0x10000
130
refcount_table_clusters 1
131
nb_snapshots 0
132
snapshot_offset 0x0
133
-incompatible_features 0x0
134
-compatible_features 0x0
135
-autoclear_features 0x0
136
+incompatible_features []
137
+compatible_features []
138
+autoclear_features []
139
refcount_order 4
140
header_length 104
141
142
diff --git a/tests/qemu-iotests/039.out b/tests/qemu-iotests/039.out
143
index XXXXXXX..XXXXXXX 100644
144
--- a/tests/qemu-iotests/039.out
145
+++ b/tests/qemu-iotests/039.out
146
@@ -XXX,XX +XXX,XX @@ QA output created by 039
147
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=134217728
148
wrote 512/512 bytes at offset 0
149
512 bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
150
-incompatible_features 0x0
151
+incompatible_features []
152
No errors were found on the image.
153
154
== Creating a dirty image file ==
155
@@ -XXX,XX +XXX,XX @@ Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=134217728
156
wrote 512/512 bytes at offset 0
157
512 bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
158
./common.rc: Killed ( VALGRIND_QEMU="${VALGRIND_QEMU_IO}" _qemu_proc_exec "${VALGRIND_LOGFILE}" "$QEMU_IO_PROG" $QEMU_IO_ARGS "$@" )
159
-incompatible_features 0x1
160
+incompatible_features [0]
161
ERROR cluster 5 refcount=0 reference=1
162
ERROR OFLAG_COPIED data cluster: l2_entry=8000000000050000 refcount=0
163
164
@@ -XXX,XX +XXX,XX @@ Data may be corrupted, or further writes to the image may corrupt it.
165
== Read-only access must still work ==
166
read 512/512 bytes at offset 0
167
512 bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
168
-incompatible_features 0x1
169
+incompatible_features [0]
170
171
== Repairing the image file must succeed ==
172
ERROR cluster 5 refcount=0 reference=1
173
@@ -XXX,XX +XXX,XX @@ The following inconsistencies were found and repaired:
174
175
Double checking the fixed image now...
176
No errors were found on the image.
177
-incompatible_features 0x0
178
+incompatible_features []
179
180
== Data should still be accessible after repair ==
181
read 512/512 bytes at offset 0
182
@@ -XXX,XX +XXX,XX @@ Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=134217728
183
wrote 512/512 bytes at offset 0
184
512 bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
185
./common.rc: Killed ( VALGRIND_QEMU="${VALGRIND_QEMU_IO}" _qemu_proc_exec "${VALGRIND_LOGFILE}" "$QEMU_IO_PROG" $QEMU_IO_ARGS "$@" )
186
-incompatible_features 0x1
187
+incompatible_features [0]
188
ERROR cluster 5 refcount=0 reference=1
189
Rebuilding refcount structure
190
Repairing cluster 1 refcount=1 reference=0
191
Repairing cluster 2 refcount=1 reference=0
192
wrote 512/512 bytes at offset 0
193
512 bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
194
-incompatible_features 0x0
195
+incompatible_features []
196
197
== Creating an image file with lazy_refcounts=off ==
198
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=134217728
199
wrote 512/512 bytes at offset 0
200
512 bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
201
./common.rc: Killed ( VALGRIND_QEMU="${VALGRIND_QEMU_IO}" _qemu_proc_exec "${VALGRIND_LOGFILE}" "$QEMU_IO_PROG" $QEMU_IO_ARGS "$@" )
202
-incompatible_features 0x0
203
+incompatible_features []
204
No errors were found on the image.
205
206
== Committing to a backing file with lazy_refcounts=on ==
207
@@ -XXX,XX +XXX,XX @@ Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=134217728 backing_file=TEST_DIR/
208
wrote 512/512 bytes at offset 0
209
512 bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
210
Image committed.
211
-incompatible_features 0x0
212
-incompatible_features 0x0
213
+incompatible_features []
214
+incompatible_features []
215
No errors were found on the image.
216
No errors were found on the image.
217
218
@@ -XXX,XX +XXX,XX @@ Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=134217728
219
wrote 512/512 bytes at offset 0
220
512 bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
221
./common.rc: Killed ( VALGRIND_QEMU="${VALGRIND_QEMU_IO}" _qemu_proc_exec "${VALGRIND_LOGFILE}" "$QEMU_IO_PROG" $QEMU_IO_ARGS "$@" )
222
-incompatible_features 0x1
223
+incompatible_features [0]
224
ERROR cluster 5 refcount=0 reference=1
225
ERROR OFLAG_COPIED data cluster: l2_entry=8000000000050000 refcount=0
226
227
@@ -XXX,XX +XXX,XX @@ Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=134217728
228
wrote 512/512 bytes at offset 0
229
512 bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
230
./common.rc: Killed ( VALGRIND_QEMU="${VALGRIND_QEMU_IO}" _qemu_proc_exec "${VALGRIND_LOGFILE}" "$QEMU_IO_PROG" $QEMU_IO_ARGS "$@" )
231
-incompatible_features 0x0
232
+incompatible_features []
233
No errors were found on the image.
234
*** done
235
diff --git a/tests/qemu-iotests/060.out b/tests/qemu-iotests/060.out
236
index XXXXXXX..XXXXXXX 100644
237
--- a/tests/qemu-iotests/060.out
238
+++ b/tests/qemu-iotests/060.out
239
@@ -XXX,XX +XXX,XX @@ ERROR cluster 3 refcount=1 reference=3
240
241
1 errors were found on the image.
242
Data may be corrupted, or further writes to the image may corrupt it.
243
-incompatible_features 0x0
244
+incompatible_features []
245
qcow2: Marking image as corrupt: Preventing invalid write on metadata (overlaps with active L1 table); further corruption events will be suppressed
246
write failed: Input/output error
247
-incompatible_features 0x2
248
+incompatible_features [1]
249
image: TEST_DIR/t.IMGFMT
250
file format: IMGFMT
251
virtual size: 64 MiB (67108864 bytes)
252
@@ -XXX,XX +XXX,XX @@ ERROR cluster 2 refcount=1 reference=2
253
254
2 errors were found on the image.
255
Data may be corrupted, or further writes to the image may corrupt it.
256
-incompatible_features 0x0
257
+incompatible_features []
258
qcow2: Marking image as corrupt: Preventing invalid write on metadata (overlaps with refcount block); further corruption events will be suppressed
259
write failed: Input/output error
260
-incompatible_features 0x2
261
+incompatible_features [1]
262
ERROR refcount block 0 refcount=2
263
ERROR cluster 2 refcount=1 reference=2
264
Rebuilding refcount structure
265
@@ -XXX,XX +XXX,XX @@ The following inconsistencies were found and repaired:
266
267
Double checking the fixed image now...
268
No errors were found on the image.
269
-incompatible_features 0x0
270
+incompatible_features []
271
wrote 512/512 bytes at offset 0
272
512 bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
273
-incompatible_features 0x0
274
+incompatible_features []
275
276
=== Testing cluster data reference into inactive L2 table ===
277
278
@@ -XXX,XX +XXX,XX @@ Data may be corrupted, or further writes to the image may corrupt it.
279
280
1 leaked clusters were found on the image.
281
This means waste of disk space, but no harm to data.
282
-incompatible_features 0x0
283
+incompatible_features []
284
qcow2: Marking image as corrupt: Preventing invalid write on metadata (overlaps with inactive L2 table); further corruption events will be suppressed
285
write failed: Input/output error
286
-incompatible_features 0x2
287
+incompatible_features [1]
288
ERROR cluster 4 refcount=1 reference=2
289
Leaked cluster 9 refcount=1 reference=0
290
Repairing cluster 4 refcount=1 reference=2
291
@@ -XXX,XX +XXX,XX @@ The following inconsistencies were found and repaired:
292
293
Double checking the fixed image now...
294
No errors were found on the image.
295
-incompatible_features 0x0
296
+incompatible_features []
297
wrote 512/512 bytes at offset 0
298
512 bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
299
-incompatible_features 0x0
300
+incompatible_features []
301
read 512/512 bytes at offset 0
302
512 bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
303
No errors were found on the image.
304
diff --git a/tests/qemu-iotests/061.out b/tests/qemu-iotests/061.out
305
index XXXXXXX..XXXXXXX 100644
306
--- a/tests/qemu-iotests/061.out
307
+++ b/tests/qemu-iotests/061.out
308
@@ -XXX,XX +XXX,XX @@ refcount_table_offset 0x10000
309
refcount_table_clusters 1
310
nb_snapshots 0
311
snapshot_offset 0x0
312
-incompatible_features 0x0
313
-compatible_features 0x1
314
-autoclear_features 0x0
315
+incompatible_features []
316
+compatible_features [0]
317
+autoclear_features []
318
refcount_order 4
319
header_length 104
320
321
@@ -XXX,XX +XXX,XX @@ refcount_table_offset 0x10000
322
refcount_table_clusters 1
323
nb_snapshots 0
324
snapshot_offset 0x0
325
-incompatible_features 0x0
326
-compatible_features 0x0
327
-autoclear_features 0x0
328
+incompatible_features []
329
+compatible_features []
330
+autoclear_features []
331
refcount_order 4
332
header_length 72
333
334
@@ -XXX,XX +XXX,XX @@ refcount_table_offset 0x10000
335
refcount_table_clusters 1
336
nb_snapshots 0
337
snapshot_offset 0x0
338
-incompatible_features 0x0
339
-compatible_features 0x1
340
-autoclear_features 0x0
341
+incompatible_features []
342
+compatible_features [0]
343
+autoclear_features []
344
refcount_order 4
345
header_length 104
346
347
@@ -XXX,XX +XXX,XX @@ refcount_table_offset 0x10000
348
refcount_table_clusters 1
349
nb_snapshots 0
350
snapshot_offset 0x0
351
-incompatible_features 0x0
352
-compatible_features 0x0
353
-autoclear_features 0x0
354
+incompatible_features []
355
+compatible_features []
356
+autoclear_features []
357
refcount_order 4
358
header_length 72
359
360
@@ -XXX,XX +XXX,XX @@ refcount_table_offset 0x10000
361
refcount_table_clusters 1
362
nb_snapshots 0
363
snapshot_offset 0x0
364
-incompatible_features 0x1
365
-compatible_features 0x1
366
-autoclear_features 0x0
367
+incompatible_features [0]
368
+compatible_features [0]
369
+autoclear_features []
370
refcount_order 4
371
header_length 104
372
373
@@ -XXX,XX +XXX,XX @@ refcount_table_offset 0x80000
374
refcount_table_clusters 1
375
nb_snapshots 0
376
snapshot_offset 0x0
377
-incompatible_features 0x0
378
-compatible_features 0x0
379
-autoclear_features 0x0
380
+incompatible_features []
381
+compatible_features []
382
+autoclear_features []
383
refcount_order 4
384
header_length 72
385
386
@@ -XXX,XX +XXX,XX @@ refcount_table_offset 0x10000
387
refcount_table_clusters 1
388
nb_snapshots 0
389
snapshot_offset 0x0
390
-incompatible_features 0x0
391
-compatible_features 0x40000000000
392
-autoclear_features 0x40000000000
393
+incompatible_features []
394
+compatible_features [42]
395
+autoclear_features [42]
396
refcount_order 4
397
header_length 104
398
399
@@ -XXX,XX +XXX,XX @@ refcount_table_offset 0x10000
400
refcount_table_clusters 1
401
nb_snapshots 0
402
snapshot_offset 0x0
403
-incompatible_features 0x0
404
-compatible_features 0x0
405
-autoclear_features 0x0
406
+incompatible_features []
407
+compatible_features []
408
+autoclear_features []
409
refcount_order 4
410
header_length 72
411
412
@@ -XXX,XX +XXX,XX @@ refcount_table_offset 0x10000
413
refcount_table_clusters 1
414
nb_snapshots 0
415
snapshot_offset 0x0
416
-incompatible_features 0x0
417
-compatible_features 0x0
418
-autoclear_features 0x0
419
+incompatible_features []
420
+compatible_features []
421
+autoclear_features []
422
refcount_order 4
423
header_length 72
424
425
@@ -XXX,XX +XXX,XX @@ refcount_table_offset 0x10000
426
refcount_table_clusters 1
427
nb_snapshots 0
428
snapshot_offset 0x0
429
-incompatible_features 0x0
430
-compatible_features 0x1
431
-autoclear_features 0x0
432
+incompatible_features []
433
+compatible_features [0]
434
+autoclear_features []
435
refcount_order 4
436
header_length 104
437
438
@@ -XXX,XX +XXX,XX @@ refcount_table_offset 0x10000
439
refcount_table_clusters 1
440
nb_snapshots 0
441
snapshot_offset 0x0
442
-incompatible_features 0x1
443
-compatible_features 0x1
444
-autoclear_features 0x0
445
+incompatible_features [0]
446
+compatible_features [0]
447
+autoclear_features []
448
refcount_order 4
449
header_length 104
450
451
@@ -XXX,XX +XXX,XX @@ refcount_table_offset 0x80000
452
refcount_table_clusters 1
453
nb_snapshots 0
454
snapshot_offset 0x0
455
-incompatible_features 0x0
456
-compatible_features 0x0
457
-autoclear_features 0x0
458
+incompatible_features []
459
+compatible_features []
460
+autoclear_features []
461
refcount_order 4
462
header_length 104
463
464
diff --git a/tests/qemu-iotests/137.out b/tests/qemu-iotests/137.out
465
index XXXXXXX..XXXXXXX 100644
466
--- a/tests/qemu-iotests/137.out
467
+++ b/tests/qemu-iotests/137.out
468
@@ -XXX,XX +XXX,XX @@ qemu-io: Unsupported value 'blubb' for qcow2 option 'overlap-check'. Allowed are
469
wrote 512/512 bytes at offset 0
470
512 bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
471
./common.rc: Killed ( VALGRIND_QEMU="${VALGRIND_QEMU_IO}" _qemu_proc_exec "${VALGRIND_LOGFILE}" "$QEMU_IO_PROG" $QEMU_IO_ARGS "$@" )
472
-incompatible_features 0x0
473
+incompatible_features []
474
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=67108864
475
wrote 65536/65536 bytes at offset 0
33
wrote 65536/65536 bytes at offset 0
476
64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
34
64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
477
diff --git a/tests/qemu-iotests/qcow2.py b/tests/qemu-iotests/qcow2.py
35
QEMU X.Y.Z monitor - type 'help' for more information
478
index XXXXXXX..XXXXXXX 100755
36
-Image resized.
479
--- a/tests/qemu-iotests/qcow2.py
37
(qemu)
480
+++ b/tests/qemu-iotests/qcow2.py
38
+Image resized.
481
@@ -XXX,XX +XXX,XX @@ class QcowHeader:
39
(qemu) qemu-io drv0 map
482
[ uint64_t, '%#x', 'snapshot_offset' ],
40
64 KiB (0x10000) bytes allocated at offset 0 bytes (0x0)
483
41
*** done
484
# Version 3 header fields
485
- [ uint64_t, '%#x', 'incompatible_features' ],
486
- [ uint64_t, '%#x', 'compatible_features' ],
487
- [ uint64_t, '%#x', 'autoclear_features' ],
488
+ [ uint64_t, 'mask', 'incompatible_features' ],
489
+ [ uint64_t, 'mask', 'compatible_features' ],
490
+ [ uint64_t, 'mask', 'autoclear_features' ],
491
[ uint32_t, '%d', 'refcount_order' ],
492
[ uint32_t, '%d', 'header_length' ],
493
];
494
@@ -XXX,XX +XXX,XX @@ class QcowHeader:
495
496
def dump(self):
497
for f in QcowHeader.fields:
498
- print("%-25s" % f[2], f[1] % self.__dict__[f[2]])
499
+ value = self.__dict__[f[2]]
500
+ if f[1] == 'mask':
501
+ bits = []
502
+ for bit in range(64):
503
+ if value & (1 << bit):
504
+ bits.append(bit)
505
+ value_str = str(bits)
506
+ else:
507
+ value_str = f[1] % value
508
+
509
+ print("%-25s" % f[2], value_str)
510
print("")
511
512
def dump_extensions(self):
513
--
42
--
514
2.24.1
43
2.29.2
515
44
516
45
diff view generated by jsdifflib
Deleted patch
1
This test can run just fine with other values for refcount_bits, so we
2
should filter the value from qcow2.py's dump-header. In fact, we can
3
filter everything but the feature bits and header extensions, because
4
that is what the test is about.
5
1
6
(036 currently ignores user-specified image options, but that will be
7
fixed in the next patch.)
8
9
Signed-off-by: Max Reitz <mreitz@redhat.com>
10
Reviewed-by: Maxim Levitsky <mlevitsk@redhat.com>
11
Message-id: 20191107163708.833192-6-mreitz@redhat.com
12
Signed-off-by: Max Reitz <mreitz@redhat.com>
13
---
14
tests/qemu-iotests/036 | 9 ++++---
15
tests/qemu-iotests/036.out | 48 --------------------------------------
16
2 files changed, 6 insertions(+), 51 deletions(-)
17
18
diff --git a/tests/qemu-iotests/036 b/tests/qemu-iotests/036
19
index XXXXXXX..XXXXXXX 100755
20
--- a/tests/qemu-iotests/036
21
+++ b/tests/qemu-iotests/036
22
@@ -XXX,XX +XXX,XX @@ $PYTHON qcow2.py "$TEST_IMG" set-feature-bit incompatible 63
23
24
# Without feature table
25
$PYTHON qcow2.py "$TEST_IMG" del-header-ext 0x6803f857
26
-$PYTHON qcow2.py "$TEST_IMG" dump-header
27
+$PYTHON qcow2.py "$TEST_IMG" dump-header | grep features
28
+$PYTHON qcow2.py "$TEST_IMG" dump-header-exts
29
_img_info
30
31
# With feature table containing bit 63
32
@@ -XXX,XX +XXX,XX @@ echo === Create image with unknown autoclear feature bit ===
33
echo
34
_make_test_img 64M
35
$PYTHON qcow2.py "$TEST_IMG" set-feature-bit autoclear 63
36
-$PYTHON qcow2.py "$TEST_IMG" dump-header
37
+$PYTHON qcow2.py "$TEST_IMG" dump-header | grep features
38
+$PYTHON qcow2.py "$TEST_IMG" dump-header-exts
39
40
echo
41
echo === Repair image ===
42
echo
43
_check_test_img -r all
44
45
-$PYTHON qcow2.py "$TEST_IMG" dump-header
46
+$PYTHON qcow2.py "$TEST_IMG" dump-header | grep features
47
+$PYTHON qcow2.py "$TEST_IMG" dump-header-exts
48
49
# success, all done
50
echo "*** done"
51
diff --git a/tests/qemu-iotests/036.out b/tests/qemu-iotests/036.out
52
index XXXXXXX..XXXXXXX 100644
53
--- a/tests/qemu-iotests/036.out
54
+++ b/tests/qemu-iotests/036.out
55
@@ -XXX,XX +XXX,XX @@ QA output created by 036
56
=== Image with unknown incompatible feature bit ===
57
58
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=67108864
59
-magic 0x514649fb
60
-version 3
61
-backing_file_offset 0x0
62
-backing_file_size 0x0
63
-cluster_bits 16
64
-size 67108864
65
-crypt_method 0
66
-l1_size 1
67
-l1_table_offset 0x30000
68
-refcount_table_offset 0x10000
69
-refcount_table_clusters 1
70
-nb_snapshots 0
71
-snapshot_offset 0x0
72
incompatible_features [63]
73
compatible_features []
74
autoclear_features []
75
-refcount_order 4
76
-header_length 104
77
-
78
qemu-img: Could not open 'TEST_DIR/t.IMGFMT': Unsupported IMGFMT feature(s): Unknown incompatible feature: 8000000000000000
79
qemu-img: Could not open 'TEST_DIR/t.IMGFMT': Unsupported IMGFMT feature(s): Test feature
80
81
@@ -XXX,XX +XXX,XX @@ qemu-img: Could not open 'TEST_DIR/t.IMGFMT': Unsupported IMGFMT feature(s): tes
82
=== Create image with unknown autoclear feature bit ===
83
84
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=67108864
85
-magic 0x514649fb
86
-version 3
87
-backing_file_offset 0x0
88
-backing_file_size 0x0
89
-cluster_bits 16
90
-size 67108864
91
-crypt_method 0
92
-l1_size 1
93
-l1_table_offset 0x30000
94
-refcount_table_offset 0x10000
95
-refcount_table_clusters 1
96
-nb_snapshots 0
97
-snapshot_offset 0x0
98
incompatible_features []
99
compatible_features []
100
autoclear_features [63]
101
-refcount_order 4
102
-header_length 104
103
-
104
Header extension:
105
magic 0x6803f857
106
length 192
107
@@ -XXX,XX +XXX,XX @@ data <binary>
108
=== Repair image ===
109
110
No errors were found on the image.
111
-magic 0x514649fb
112
-version 3
113
-backing_file_offset 0x0
114
-backing_file_size 0x0
115
-cluster_bits 16
116
-size 67108864
117
-crypt_method 0
118
-l1_size 1
119
-l1_table_offset 0x30000
120
-refcount_table_offset 0x10000
121
-refcount_table_clusters 1
122
-nb_snapshots 0
123
-snapshot_offset 0x0
124
incompatible_features []
125
compatible_features []
126
autoclear_features []
127
-refcount_order 4
128
-header_length 104
129
-
130
Header extension:
131
magic 0x6803f857
132
length 192
133
--
134
2.24.1
135
136
diff view generated by jsdifflib
1
This will not work with external data files, so try to get tests working
1
With bash 5.1, the output of the following script changes:
2
without it as far as possible.
2
3
a=("double space")
4
a=${a[@]:0:1}
5
echo "$a"
6
7
from "double space" to "double space", i.e. all white space is
8
preserved as-is. This is probably what we actually want here (judging
9
from the "...to accommodate pathnames with spaces" comment), but before
10
5.1, we would have to quote the ${} slice to get the same behavior.
11
12
In any case, without quoting, the reference output of many iotests is
13
different between bash 5.1 and pre-5.1, which is not very good. The
14
output of 5.1 is what we want, so whatever we do to get pre-5.1 to the
15
same result, it means we have to fix the reference output of basically
16
all tests that invoke _send_qemu_cmd (except the ones that only use
17
single spaces in the commands they invoke).
18
19
Instead of quoting the ${} slice (cmd="${$@: 1:...}"), we can also just
20
not use array slicing and replace the whole thing with a simple "cmd=$1;
21
shift", which works because all callers quote the whole $cmd argument
22
anyway.
3
23
4
Signed-off-by: Max Reitz <mreitz@redhat.com>
24
Signed-off-by: Max Reitz <mreitz@redhat.com>
5
Reviewed-by: Maxim Levitsky <mlevitsk@redhat.com>
25
Message-Id: <20201217153803.101231-3-mreitz@redhat.com>
6
Message-id: 20191107163708.833192-17-mreitz@redhat.com
26
Reviewed-by: Kevin Wolf <kwolf@redhat.com>
7
Signed-off-by: Max Reitz <mreitz@redhat.com>
8
---
27
---
9
tests/qemu-iotests/063 | 12 ++++--------
28
tests/qemu-iotests/085.out | 167 ++++++++++++++++++++++++++++-----
10
tests/qemu-iotests/063.out | 3 ++-
29
tests/qemu-iotests/094.out | 10 +-
11
tests/qemu-iotests/085 | 9 +++------
30
tests/qemu-iotests/095.out | 4 +-
12
tests/qemu-iotests/085.out | 8 ++++----
31
tests/qemu-iotests/109.out | 88 ++++++++++++-----
13
4 files changed, 13 insertions(+), 19 deletions(-)
32
tests/qemu-iotests/117.out | 13 ++-
33
tests/qemu-iotests/127.out | 12 ++-
34
tests/qemu-iotests/140.out | 10 +-
35
tests/qemu-iotests/141.out | 128 +++++++++++++++++++------
36
tests/qemu-iotests/143.out | 4 +-
37
tests/qemu-iotests/144.out | 28 +++++-
38
tests/qemu-iotests/153.out | 18 ++--
39
tests/qemu-iotests/156.out | 39 ++++++--
40
tests/qemu-iotests/161.out | 18 +++-
41
tests/qemu-iotests/173.out | 25 ++++-
42
tests/qemu-iotests/182.out | 42 +++++++--
43
tests/qemu-iotests/183.out | 19 +++-
44
tests/qemu-iotests/185.out | 45 +++++++--
45
tests/qemu-iotests/191.out | 12 ++-
46
tests/qemu-iotests/223.out | 92 ++++++++++++------
47
tests/qemu-iotests/229.out | 13 ++-
48
tests/qemu-iotests/249.out | 16 +++-
49
tests/qemu-iotests/308.out | 103 +++++++++++++++++---
50
tests/qemu-iotests/312.out | 10 +-
51
tests/qemu-iotests/common.qemu | 11 +--
52
24 files changed, 728 insertions(+), 199 deletions(-)
14
53
15
diff --git a/tests/qemu-iotests/063 b/tests/qemu-iotests/063
16
index XXXXXXX..XXXXXXX 100755
17
--- a/tests/qemu-iotests/063
18
+++ b/tests/qemu-iotests/063
19
@@ -XXX,XX +XXX,XX @@ _unsupported_imgopts "subformat=monolithicFlat" \
20
_make_test_img 4M
21
22
echo "== Testing conversion with -n fails with no target file =="
23
-# check .orig file does not exist
24
-rm -f "$TEST_IMG.orig"
25
if $QEMU_IMG convert -f $IMGFMT -O $IMGFMT -n "$TEST_IMG" "$TEST_IMG.orig" >/dev/null 2>&1; then
26
exit 1
27
fi
28
29
echo "== Testing conversion with -n succeeds with a target file =="
30
-rm -f "$TEST_IMG.orig"
31
-cp "$TEST_IMG" "$TEST_IMG.orig"
32
+_rm_test_img "$TEST_IMG.orig"
33
+TEST_IMG="$TEST_IMG.orig" _make_test_img 4M
34
if ! $QEMU_IMG convert -f $IMGFMT -O $IMGFMT -n "$TEST_IMG" "$TEST_IMG.orig" ; then
35
exit 1
36
fi
37
@@ -XXX,XX +XXX,XX @@ fi
38
_check_test_img
39
40
echo "== Testing conversion to a smaller file fails =="
41
-rm -f "$TEST_IMG.orig"
42
-mv "$TEST_IMG" "$TEST_IMG.orig"
43
-_make_test_img 2M
44
-if $QEMU_IMG convert -f $IMGFMT -O $IMGFMT -n "$TEST_IMG.orig" "$TEST_IMG" >/dev/null 2>&1; then
45
+TEST_IMG="$TEST_IMG.target" _make_test_img 2M
46
+if $QEMU_IMG convert -f $IMGFMT -O $IMGFMT -n "$TEST_IMG" "$TEST_IMG.target" >/dev/null 2>&1; then
47
exit 1
48
fi
49
50
diff --git a/tests/qemu-iotests/063.out b/tests/qemu-iotests/063.out
51
index XXXXXXX..XXXXXXX 100644
52
--- a/tests/qemu-iotests/063.out
53
+++ b/tests/qemu-iotests/063.out
54
@@ -XXX,XX +XXX,XX @@ QA output created by 063
55
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=4194304
56
== Testing conversion with -n fails with no target file ==
57
== Testing conversion with -n succeeds with a target file ==
58
+Formatting 'TEST_DIR/t.IMGFMT.orig', fmt=IMGFMT size=4194304
59
== Testing conversion to raw is the same after conversion with -n ==
60
== Testing conversion back to original format ==
61
No errors were found on the image.
62
== Testing conversion to a smaller file fails ==
63
-Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=2097152
64
+Formatting 'TEST_DIR/t.IMGFMT.target', fmt=IMGFMT size=2097152
65
== Regression testing for copy offloading bug ==
66
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=1048576
67
Formatting 'TEST_DIR/t.IMGFMT.target', fmt=IMGFMT size=1048576
68
diff --git a/tests/qemu-iotests/085 b/tests/qemu-iotests/085
69
index XXXXXXX..XXXXXXX 100755
70
--- a/tests/qemu-iotests/085
71
+++ b/tests/qemu-iotests/085
72
@@ -XXX,XX +XXX,XX @@ add_snapshot_image()
73
{
74
base_image="${TEST_DIR}/$((${1}-1))-${snapshot_virt0}"
75
snapshot_file="${TEST_DIR}/${1}-${snapshot_virt0}"
76
- _make_test_img -u -b "${base_image}" "$size"
77
- mv "${TEST_IMG}" "${snapshot_file}"
78
+ TEST_IMG=$snapshot_file _make_test_img -u -b "${base_image}" "$size"
79
do_blockdev_add "$1" "'backing': null, " "${snapshot_file}"
80
}
81
82
@@ -XXX,XX +XXX,XX @@ blockdev_snapshot()
83
84
size=128M
85
86
-_make_test_img $size
87
-mv "${TEST_IMG}" "${TEST_IMG}.1"
88
-_make_test_img $size
89
-mv "${TEST_IMG}" "${TEST_IMG}.2"
90
+TEST_IMG="$TEST_IMG.1" _make_test_img $size
91
+TEST_IMG="$TEST_IMG.2" _make_test_img $size
92
93
echo
94
echo === Running QEMU ===
95
diff --git a/tests/qemu-iotests/085.out b/tests/qemu-iotests/085.out
54
diff --git a/tests/qemu-iotests/085.out b/tests/qemu-iotests/085.out
96
index XXXXXXX..XXXXXXX 100644
55
index XXXXXXX..XXXXXXX 100644
97
--- a/tests/qemu-iotests/085.out
56
--- a/tests/qemu-iotests/085.out
98
+++ b/tests/qemu-iotests/085.out
57
+++ b/tests/qemu-iotests/085.out
58
@@ -XXX,XX +XXX,XX @@ Formatting 'TEST_DIR/t.IMGFMT.2', fmt=IMGFMT size=134217728
59
60
=== Create a single snapshot on virtio0 ===
61
62
-{ 'execute': 'blockdev-snapshot-sync', 'arguments': { 'device': 'virtio0', 'snapshot-file':'TEST_DIR/1-snapshot-v0.IMGFMT', 'format': 'IMGFMT' } }
63
+{ 'execute': 'blockdev-snapshot-sync',
64
+ 'arguments': { 'device': 'virtio0',
65
+ 'snapshot-file':'TEST_DIR/1-snapshot-v0.IMGFMT',
66
+ 'format': 'IMGFMT' } }
67
Formatting 'TEST_DIR/1-snapshot-v0.qcow2', fmt=qcow2 cluster_size=65536 extended_l2=off compression_type=zlib size=134217728 backing_file=TEST_DIR/t.qcow2.1 backing_fmt=qcow2 lazy_refcounts=off refcount_bits=16
68
{"return": {}}
69
70
=== Invalid command - missing device and nodename ===
71
72
-{ 'execute': 'blockdev-snapshot-sync', 'arguments': { 'snapshot-file':'TEST_DIR/1-snapshot-v0.IMGFMT', 'format': 'IMGFMT' } }
73
+{ 'execute': 'blockdev-snapshot-sync',
74
+ 'arguments': { 'snapshot-file':'TEST_DIR/1-snapshot-v0.IMGFMT',
75
+ 'format': 'IMGFMT' } }
76
{"error": {"class": "GenericError", "desc": "Cannot find device= nor node_name="}}
77
78
=== Invalid command - missing snapshot-file ===
79
80
-{ 'execute': 'blockdev-snapshot-sync', 'arguments': { 'device': 'virtio0', 'format': 'IMGFMT' } }
81
+{ 'execute': 'blockdev-snapshot-sync',
82
+ 'arguments': { 'device': 'virtio0',
83
+ 'format': 'IMGFMT' } }
84
{"error": {"class": "GenericError", "desc": "Parameter 'snapshot-file' is missing"}}
85
86
87
=== Create several transactional group snapshots ===
88
89
-{ 'execute': 'transaction', 'arguments': {'actions': [ { 'type': 'blockdev-snapshot-sync', 'data' : { 'device': 'virtio0', 'snapshot-file': 'TEST_DIR/2-snapshot-v0.IMGFMT' } }, { 'type': 'blockdev-snapshot-sync', 'data' : { 'device': 'virtio1', 'snapshot-file': 'TEST_DIR/2-snapshot-v1.IMGFMT' } } ] } }
90
+{ 'execute': 'transaction', 'arguments':
91
+ {'actions': [
92
+ { 'type': 'blockdev-snapshot-sync', 'data' :
93
+ { 'device': 'virtio0',
94
+ 'snapshot-file': 'TEST_DIR/2-snapshot-v0.IMGFMT' } },
95
+ { 'type': 'blockdev-snapshot-sync', 'data' :
96
+ { 'device': 'virtio1',
97
+ 'snapshot-file': 'TEST_DIR/2-snapshot-v1.IMGFMT' } } ]
98
+ } }
99
Formatting 'TEST_DIR/2-snapshot-v0.qcow2', fmt=qcow2 cluster_size=65536 extended_l2=off compression_type=zlib size=134217728 backing_file=TEST_DIR/1-snapshot-v0.qcow2 backing_fmt=qcow2 lazy_refcounts=off refcount_bits=16
100
Formatting 'TEST_DIR/2-snapshot-v1.qcow2', fmt=qcow2 cluster_size=65536 extended_l2=off compression_type=zlib size=134217728 backing_file=TEST_DIR/t.qcow2.2 backing_fmt=qcow2 lazy_refcounts=off refcount_bits=16
101
{"return": {}}
102
-{ 'execute': 'transaction', 'arguments': {'actions': [ { 'type': 'blockdev-snapshot-sync', 'data' : { 'device': 'virtio0', 'snapshot-file': 'TEST_DIR/3-snapshot-v0.IMGFMT' } }, { 'type': 'blockdev-snapshot-sync', 'data' : { 'device': 'virtio1', 'snapshot-file': 'TEST_DIR/3-snapshot-v1.IMGFMT' } } ] } }
103
+{ 'execute': 'transaction', 'arguments':
104
+ {'actions': [
105
+ { 'type': 'blockdev-snapshot-sync', 'data' :
106
+ { 'device': 'virtio0',
107
+ 'snapshot-file': 'TEST_DIR/3-snapshot-v0.IMGFMT' } },
108
+ { 'type': 'blockdev-snapshot-sync', 'data' :
109
+ { 'device': 'virtio1',
110
+ 'snapshot-file': 'TEST_DIR/3-snapshot-v1.IMGFMT' } } ]
111
+ } }
112
Formatting 'TEST_DIR/3-snapshot-v0.qcow2', fmt=qcow2 cluster_size=65536 extended_l2=off compression_type=zlib size=134217728 backing_file=TEST_DIR/2-snapshot-v0.qcow2 backing_fmt=qcow2 lazy_refcounts=off refcount_bits=16
113
Formatting 'TEST_DIR/3-snapshot-v1.qcow2', fmt=qcow2 cluster_size=65536 extended_l2=off compression_type=zlib size=134217728 backing_file=TEST_DIR/2-snapshot-v1.qcow2 backing_fmt=qcow2 lazy_refcounts=off refcount_bits=16
114
{"return": {}}
115
-{ 'execute': 'transaction', 'arguments': {'actions': [ { 'type': 'blockdev-snapshot-sync', 'data' : { 'device': 'virtio0', 'snapshot-file': 'TEST_DIR/4-snapshot-v0.IMGFMT' } }, { 'type': 'blockdev-snapshot-sync', 'data' : { 'device': 'virtio1', 'snapshot-file': 'TEST_DIR/4-snapshot-v1.IMGFMT' } } ] } }
116
+{ 'execute': 'transaction', 'arguments':
117
+ {'actions': [
118
+ { 'type': 'blockdev-snapshot-sync', 'data' :
119
+ { 'device': 'virtio0',
120
+ 'snapshot-file': 'TEST_DIR/4-snapshot-v0.IMGFMT' } },
121
+ { 'type': 'blockdev-snapshot-sync', 'data' :
122
+ { 'device': 'virtio1',
123
+ 'snapshot-file': 'TEST_DIR/4-snapshot-v1.IMGFMT' } } ]
124
+ } }
125
Formatting 'TEST_DIR/4-snapshot-v0.qcow2', fmt=qcow2 cluster_size=65536 extended_l2=off compression_type=zlib size=134217728 backing_file=TEST_DIR/3-snapshot-v0.qcow2 backing_fmt=qcow2 lazy_refcounts=off refcount_bits=16
126
Formatting 'TEST_DIR/4-snapshot-v1.qcow2', fmt=qcow2 cluster_size=65536 extended_l2=off compression_type=zlib size=134217728 backing_file=TEST_DIR/3-snapshot-v1.qcow2 backing_fmt=qcow2 lazy_refcounts=off refcount_bits=16
127
{"return": {}}
128
-{ 'execute': 'transaction', 'arguments': {'actions': [ { 'type': 'blockdev-snapshot-sync', 'data' : { 'device': 'virtio0', 'snapshot-file': 'TEST_DIR/5-snapshot-v0.IMGFMT' } }, { 'type': 'blockdev-snapshot-sync', 'data' : { 'device': 'virtio1', 'snapshot-file': 'TEST_DIR/5-snapshot-v1.IMGFMT' } } ] } }
129
+{ 'execute': 'transaction', 'arguments':
130
+ {'actions': [
131
+ { 'type': 'blockdev-snapshot-sync', 'data' :
132
+ { 'device': 'virtio0',
133
+ 'snapshot-file': 'TEST_DIR/5-snapshot-v0.IMGFMT' } },
134
+ { 'type': 'blockdev-snapshot-sync', 'data' :
135
+ { 'device': 'virtio1',
136
+ 'snapshot-file': 'TEST_DIR/5-snapshot-v1.IMGFMT' } } ]
137
+ } }
138
Formatting 'TEST_DIR/5-snapshot-v0.qcow2', fmt=qcow2 cluster_size=65536 extended_l2=off compression_type=zlib size=134217728 backing_file=TEST_DIR/4-snapshot-v0.qcow2 backing_fmt=qcow2 lazy_refcounts=off refcount_bits=16
139
Formatting 'TEST_DIR/5-snapshot-v1.qcow2', fmt=qcow2 cluster_size=65536 extended_l2=off compression_type=zlib size=134217728 backing_file=TEST_DIR/4-snapshot-v1.qcow2 backing_fmt=qcow2 lazy_refcounts=off refcount_bits=16
140
{"return": {}}
141
-{ 'execute': 'transaction', 'arguments': {'actions': [ { 'type': 'blockdev-snapshot-sync', 'data' : { 'device': 'virtio0', 'snapshot-file': 'TEST_DIR/6-snapshot-v0.IMGFMT' } }, { 'type': 'blockdev-snapshot-sync', 'data' : { 'device': 'virtio1', 'snapshot-file': 'TEST_DIR/6-snapshot-v1.IMGFMT' } } ] } }
142
+{ 'execute': 'transaction', 'arguments':
143
+ {'actions': [
144
+ { 'type': 'blockdev-snapshot-sync', 'data' :
145
+ { 'device': 'virtio0',
146
+ 'snapshot-file': 'TEST_DIR/6-snapshot-v0.IMGFMT' } },
147
+ { 'type': 'blockdev-snapshot-sync', 'data' :
148
+ { 'device': 'virtio1',
149
+ 'snapshot-file': 'TEST_DIR/6-snapshot-v1.IMGFMT' } } ]
150
+ } }
151
Formatting 'TEST_DIR/6-snapshot-v0.qcow2', fmt=qcow2 cluster_size=65536 extended_l2=off compression_type=zlib size=134217728 backing_file=TEST_DIR/5-snapshot-v0.qcow2 backing_fmt=qcow2 lazy_refcounts=off refcount_bits=16
152
Formatting 'TEST_DIR/6-snapshot-v1.qcow2', fmt=qcow2 cluster_size=65536 extended_l2=off compression_type=zlib size=134217728 backing_file=TEST_DIR/5-snapshot-v1.qcow2 backing_fmt=qcow2 lazy_refcounts=off refcount_bits=16
153
{"return": {}}
154
-{ 'execute': 'transaction', 'arguments': {'actions': [ { 'type': 'blockdev-snapshot-sync', 'data' : { 'device': 'virtio0', 'snapshot-file': 'TEST_DIR/7-snapshot-v0.IMGFMT' } }, { 'type': 'blockdev-snapshot-sync', 'data' : { 'device': 'virtio1', 'snapshot-file': 'TEST_DIR/7-snapshot-v1.IMGFMT' } } ] } }
155
+{ 'execute': 'transaction', 'arguments':
156
+ {'actions': [
157
+ { 'type': 'blockdev-snapshot-sync', 'data' :
158
+ { 'device': 'virtio0',
159
+ 'snapshot-file': 'TEST_DIR/7-snapshot-v0.IMGFMT' } },
160
+ { 'type': 'blockdev-snapshot-sync', 'data' :
161
+ { 'device': 'virtio1',
162
+ 'snapshot-file': 'TEST_DIR/7-snapshot-v1.IMGFMT' } } ]
163
+ } }
164
Formatting 'TEST_DIR/7-snapshot-v0.qcow2', fmt=qcow2 cluster_size=65536 extended_l2=off compression_type=zlib size=134217728 backing_file=TEST_DIR/6-snapshot-v0.qcow2 backing_fmt=qcow2 lazy_refcounts=off refcount_bits=16
165
Formatting 'TEST_DIR/7-snapshot-v1.qcow2', fmt=qcow2 cluster_size=65536 extended_l2=off compression_type=zlib size=134217728 backing_file=TEST_DIR/6-snapshot-v1.qcow2 backing_fmt=qcow2 lazy_refcounts=off refcount_bits=16
166
{"return": {}}
167
-{ 'execute': 'transaction', 'arguments': {'actions': [ { 'type': 'blockdev-snapshot-sync', 'data' : { 'device': 'virtio0', 'snapshot-file': 'TEST_DIR/8-snapshot-v0.IMGFMT' } }, { 'type': 'blockdev-snapshot-sync', 'data' : { 'device': 'virtio1', 'snapshot-file': 'TEST_DIR/8-snapshot-v1.IMGFMT' } } ] } }
168
+{ 'execute': 'transaction', 'arguments':
169
+ {'actions': [
170
+ { 'type': 'blockdev-snapshot-sync', 'data' :
171
+ { 'device': 'virtio0',
172
+ 'snapshot-file': 'TEST_DIR/8-snapshot-v0.IMGFMT' } },
173
+ { 'type': 'blockdev-snapshot-sync', 'data' :
174
+ { 'device': 'virtio1',
175
+ 'snapshot-file': 'TEST_DIR/8-snapshot-v1.IMGFMT' } } ]
176
+ } }
177
Formatting 'TEST_DIR/8-snapshot-v0.qcow2', fmt=qcow2 cluster_size=65536 extended_l2=off compression_type=zlib size=134217728 backing_file=TEST_DIR/7-snapshot-v0.qcow2 backing_fmt=qcow2 lazy_refcounts=off refcount_bits=16
178
Formatting 'TEST_DIR/8-snapshot-v1.qcow2', fmt=qcow2 cluster_size=65536 extended_l2=off compression_type=zlib size=134217728 backing_file=TEST_DIR/7-snapshot-v1.qcow2 backing_fmt=qcow2 lazy_refcounts=off refcount_bits=16
179
{"return": {}}
180
-{ 'execute': 'transaction', 'arguments': {'actions': [ { 'type': 'blockdev-snapshot-sync', 'data' : { 'device': 'virtio0', 'snapshot-file': 'TEST_DIR/9-snapshot-v0.IMGFMT' } }, { 'type': 'blockdev-snapshot-sync', 'data' : { 'device': 'virtio1', 'snapshot-file': 'TEST_DIR/9-snapshot-v1.IMGFMT' } } ] } }
181
+{ 'execute': 'transaction', 'arguments':
182
+ {'actions': [
183
+ { 'type': 'blockdev-snapshot-sync', 'data' :
184
+ { 'device': 'virtio0',
185
+ 'snapshot-file': 'TEST_DIR/9-snapshot-v0.IMGFMT' } },
186
+ { 'type': 'blockdev-snapshot-sync', 'data' :
187
+ { 'device': 'virtio1',
188
+ 'snapshot-file': 'TEST_DIR/9-snapshot-v1.IMGFMT' } } ]
189
+ } }
190
Formatting 'TEST_DIR/9-snapshot-v0.qcow2', fmt=qcow2 cluster_size=65536 extended_l2=off compression_type=zlib size=134217728 backing_file=TEST_DIR/8-snapshot-v0.qcow2 backing_fmt=qcow2 lazy_refcounts=off refcount_bits=16
191
Formatting 'TEST_DIR/9-snapshot-v1.qcow2', fmt=qcow2 cluster_size=65536 extended_l2=off compression_type=zlib size=134217728 backing_file=TEST_DIR/8-snapshot-v1.qcow2 backing_fmt=qcow2 lazy_refcounts=off refcount_bits=16
192
{"return": {}}
193
-{ 'execute': 'transaction', 'arguments': {'actions': [ { 'type': 'blockdev-snapshot-sync', 'data' : { 'device': 'virtio0', 'snapshot-file': 'TEST_DIR/10-snapshot-v0.IMGFMT' } }, { 'type': 'blockdev-snapshot-sync', 'data' : { 'device': 'virtio1', 'snapshot-file': 'TEST_DIR/10-snapshot-v1.IMGFMT' } } ] } }
194
+{ 'execute': 'transaction', 'arguments':
195
+ {'actions': [
196
+ { 'type': 'blockdev-snapshot-sync', 'data' :
197
+ { 'device': 'virtio0',
198
+ 'snapshot-file': 'TEST_DIR/10-snapshot-v0.IMGFMT' } },
199
+ { 'type': 'blockdev-snapshot-sync', 'data' :
200
+ { 'device': 'virtio1',
201
+ 'snapshot-file': 'TEST_DIR/10-snapshot-v1.IMGFMT' } } ]
202
+ } }
203
Formatting 'TEST_DIR/10-snapshot-v0.qcow2', fmt=qcow2 cluster_size=65536 extended_l2=off compression_type=zlib size=134217728 backing_file=TEST_DIR/9-snapshot-v0.qcow2 backing_fmt=qcow2 lazy_refcounts=off refcount_bits=16
204
Formatting 'TEST_DIR/10-snapshot-v1.qcow2', fmt=qcow2 cluster_size=65536 extended_l2=off compression_type=zlib size=134217728 backing_file=TEST_DIR/9-snapshot-v1.qcow2 backing_fmt=qcow2 lazy_refcounts=off refcount_bits=16
205
{"return": {}}
206
@@ -XXX,XX +XXX,XX @@ Formatting 'TEST_DIR/10-snapshot-v1.qcow2', fmt=qcow2 cluster_size=65536 extende
207
=== Create a couple of snapshots using blockdev-snapshot ===
208
209
Formatting 'TEST_DIR/11-snapshot-v0.IMGFMT', fmt=IMGFMT size=134217728 backing_file=TEST_DIR/10-snapshot-v0.IMGFMT backing_fmt=IMGFMT
210
-{ 'execute': 'blockdev-add', 'arguments': { 'driver': 'IMGFMT', 'node-name': 'snap_11', 'backing': null, 'file': { 'driver': 'file', 'filename': 'TEST_DIR/11-snapshot-v0.IMGFMT', 'node-name': 'file_11' } } }
211
+{ 'execute': 'blockdev-add', 'arguments':
212
+ { 'driver': 'IMGFMT', 'node-name': 'snap_11', 'backing': null,
213
+ 'file':
214
+ { 'driver': 'file', 'filename': 'TEST_DIR/11-snapshot-v0.IMGFMT',
215
+ 'node-name': 'file_11' } } }
216
{"return": {}}
217
-{ 'execute': 'blockdev-snapshot', 'arguments': { 'node': 'virtio0', 'overlay':'snap_11' } }
218
+{ 'execute': 'blockdev-snapshot',
219
+ 'arguments': { 'node': 'virtio0',
220
+ 'overlay':'snap_11' } }
221
{"return": {}}
222
Formatting 'TEST_DIR/12-snapshot-v0.IMGFMT', fmt=IMGFMT size=134217728 backing_file=TEST_DIR/11-snapshot-v0.IMGFMT backing_fmt=IMGFMT
223
-{ 'execute': 'blockdev-add', 'arguments': { 'driver': 'IMGFMT', 'node-name': 'snap_12', 'backing': null, 'file': { 'driver': 'file', 'filename': 'TEST_DIR/12-snapshot-v0.IMGFMT', 'node-name': 'file_12' } } }
224
+{ 'execute': 'blockdev-add', 'arguments':
225
+ { 'driver': 'IMGFMT', 'node-name': 'snap_12', 'backing': null,
226
+ 'file':
227
+ { 'driver': 'file', 'filename': 'TEST_DIR/12-snapshot-v0.IMGFMT',
228
+ 'node-name': 'file_12' } } }
229
{"return": {}}
230
-{ 'execute': 'blockdev-snapshot', 'arguments': { 'node': 'virtio0', 'overlay':'snap_12' } }
231
+{ 'execute': 'blockdev-snapshot',
232
+ 'arguments': { 'node': 'virtio0',
233
+ 'overlay':'snap_12' } }
234
{"return": {}}
235
236
=== Invalid command - cannot create a snapshot using a file BDS ===
237
238
-{ 'execute': 'blockdev-snapshot', 'arguments': { 'node':'virtio0', 'overlay':'file_12' } }
239
+{ 'execute': 'blockdev-snapshot',
240
+ 'arguments': { 'node':'virtio0',
241
+ 'overlay':'file_12' }
242
+ }
243
{"error": {"class": "GenericError", "desc": "The overlay is already in use"}}
244
245
=== Invalid command - snapshot node used as active layer ===
246
247
-{ 'execute': 'blockdev-snapshot', 'arguments': { 'node': 'virtio0', 'overlay':'snap_12' } }
248
+{ 'execute': 'blockdev-snapshot',
249
+ 'arguments': { 'node': 'virtio0',
250
+ 'overlay':'snap_12' } }
251
{"error": {"class": "GenericError", "desc": "The overlay is already in use"}}
252
-{ 'execute': 'blockdev-snapshot', 'arguments': { 'node':'virtio0', 'overlay':'virtio0' } }
253
+{ 'execute': 'blockdev-snapshot',
254
+ 'arguments': { 'node':'virtio0',
255
+ 'overlay':'virtio0' }
256
+ }
257
{"error": {"class": "GenericError", "desc": "The overlay is already in use"}}
258
-{ 'execute': 'blockdev-snapshot', 'arguments': { 'node':'virtio0', 'overlay':'virtio1' } }
259
+{ 'execute': 'blockdev-snapshot',
260
+ 'arguments': { 'node':'virtio0',
261
+ 'overlay':'virtio1' }
262
+ }
263
{"error": {"class": "GenericError", "desc": "The overlay is already in use"}}
264
265
=== Invalid command - snapshot node used as backing hd ===
266
267
-{ 'execute': 'blockdev-snapshot', 'arguments': { 'node': 'virtio0', 'overlay':'snap_11' } }
268
+{ 'execute': 'blockdev-snapshot',
269
+ 'arguments': { 'node': 'virtio0',
270
+ 'overlay':'snap_11' } }
271
{"error": {"class": "GenericError", "desc": "The overlay is already in use"}}
272
273
=== Invalid command - snapshot node has a backing image ===
274
275
Formatting 'TEST_DIR/t.IMGFMT.base', fmt=IMGFMT size=134217728
276
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=134217728 backing_file=TEST_DIR/t.IMGFMT.base backing_fmt=IMGFMT
277
-{ 'execute': 'blockdev-add', 'arguments': { 'driver': 'IMGFMT', 'node-name': 'snap_13', 'file': { 'driver': 'file', 'filename': 'TEST_DIR/t.IMGFMT', 'node-name': 'file_13' } } }
278
-{"return": {}}
279
-{ 'execute': 'blockdev-snapshot', 'arguments': { 'node': 'virtio0', 'overlay':'snap_13' } }
280
+{ 'execute': 'blockdev-add', 'arguments':
281
+ { 'driver': 'IMGFMT', 'node-name': 'snap_13',
282
+ 'file':
283
+ { 'driver': 'file', 'filename': 'TEST_DIR/t.IMGFMT',
284
+ 'node-name': 'file_13' } } }
285
+{"return": {}}
286
+{ 'execute': 'blockdev-snapshot',
287
+ 'arguments': { 'node': 'virtio0',
288
+ 'overlay':'snap_13' } }
289
{"error": {"class": "GenericError", "desc": "The overlay already has a backing image"}}
290
291
=== Invalid command - The node does not exist ===
292
293
-{ 'execute': 'blockdev-snapshot', 'arguments': { 'node': 'virtio0', 'overlay':'snap_14' } }
294
+{ 'execute': 'blockdev-snapshot',
295
+ 'arguments': { 'node': 'virtio0',
296
+ 'overlay':'snap_14' } }
297
{"error": {"class": "GenericError", "desc": "Cannot find device=snap_14 nor node_name=snap_14"}}
298
-{ 'execute': 'blockdev-snapshot', 'arguments': { 'node':'nodevice', 'overlay':'snap_13' } }
299
+{ 'execute': 'blockdev-snapshot',
300
+ 'arguments': { 'node':'nodevice',
301
+ 'overlay':'snap_13' }
302
+ }
303
{"error": {"class": "GenericError", "desc": "Cannot find device=nodevice nor node_name=nodevice"}}
304
*** done
305
diff --git a/tests/qemu-iotests/094.out b/tests/qemu-iotests/094.out
306
index XXXXXXX..XXXXXXX 100644
307
--- a/tests/qemu-iotests/094.out
308
+++ b/tests/qemu-iotests/094.out
309
@@ -XXX,XX +XXX,XX @@ Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=67108864
310
Formatting 'TEST_DIR/source.IMGFMT', fmt=IMGFMT size=67108864
311
{'execute': 'qmp_capabilities'}
312
{"return": {}}
313
-{'execute': 'drive-mirror', 'arguments': {'device': 'src', 'target': 'nbd+unix:///?socket=SOCK_DIR/nbd', 'format': 'nbd', 'sync':'full', 'mode':'existing'}}
314
+{'execute': 'drive-mirror',
315
+ 'arguments': {'device': 'src',
316
+ 'target': 'nbd+unix:///?socket=SOCK_DIR/nbd',
317
+ 'format': 'nbd',
318
+ 'sync':'full',
319
+ 'mode':'existing'}}
320
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "created", "id": "src"}}
321
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "running", "id": "src"}}
322
{"return": {}}
323
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "ready", "id": "src"}}
324
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "BLOCK_JOB_READY", "data": {"device": "src", "len": 67108864, "offset": 67108864, "speed": 0, "type": "mirror"}}
325
-{'execute': 'block-job-complete', 'arguments': {'device': 'src'}}
326
+{'execute': 'block-job-complete',
327
+ 'arguments': {'device': 'src'}}
328
{"return": {}}
329
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "waiting", "id": "src"}}
330
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "pending", "id": "src"}}
331
diff --git a/tests/qemu-iotests/095.out b/tests/qemu-iotests/095.out
332
index XXXXXXX..XXXXXXX 100644
333
--- a/tests/qemu-iotests/095.out
334
+++ b/tests/qemu-iotests/095.out
335
@@ -XXX,XX +XXX,XX @@ virtual size: 5 MiB (5242880 bytes)
336
337
{ 'execute': 'qmp_capabilities' }
338
{"return": {}}
339
-{ 'execute': 'block-commit', 'arguments': { 'device': 'test', 'top': 'TEST_DIR/t.IMGFMT.snp1' } }
340
+{ 'execute': 'block-commit',
341
+ 'arguments': { 'device': 'test',
342
+ 'top': 'TEST_DIR/t.IMGFMT.snp1' } }
343
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "created", "id": "test"}}
344
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "running", "id": "test"}}
345
{"return": {}}
346
diff --git a/tests/qemu-iotests/109.out b/tests/qemu-iotests/109.out
347
index XXXXXXX..XXXXXXX 100644
348
--- a/tests/qemu-iotests/109.out
349
+++ b/tests/qemu-iotests/109.out
350
@@ -XXX,XX +XXX,XX @@ Formatting 'TEST_DIR/t.raw.src', fmt=IMGFMT size=67108864
351
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=SIZE
352
{ 'execute': 'qmp_capabilities' }
353
{"return": {}}
354
-{'execute':'drive-mirror', 'arguments':{ 'device': 'src', 'target': 'TEST_DIR/t.IMGFMT', 'mode': 'existing', 'sync': 'full'}}
355
+{'execute':'drive-mirror', 'arguments':{
356
+ 'device': 'src', 'target': 'TEST_DIR/t.IMGFMT',
357
+ 'mode': 'existing', 'sync': 'full'}}
358
WARNING: Image format was not specified for 'TEST_DIR/t.raw' and probing guessed raw.
359
Automatically detecting the format is dangerous for raw images, write operations on block 0 will be restricted.
360
Specify the 'raw' format explicitly to remove the restrictions.
361
@@ -XXX,XX +XXX,XX @@ read 512/512 bytes at offset 0
362
512 bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
363
{ 'execute': 'qmp_capabilities' }
364
{"return": {}}
365
-{'execute':'drive-mirror', 'arguments':{ 'device': 'src', 'target': 'TEST_DIR/t.IMGFMT', 'format': 'IMGFMT', 'mode': 'existing', 'sync': 'full'}}
366
+{'execute':'drive-mirror', 'arguments':{
367
+ 'device': 'src', 'target': 'TEST_DIR/t.IMGFMT', 'format': 'IMGFMT',
368
+ 'mode': 'existing', 'sync': 'full'}}
369
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "created", "id": "src"}}
370
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "running", "id": "src"}}
371
{"return": {}}
372
@@ -XXX,XX +XXX,XX @@ Formatting 'TEST_DIR/t.raw.src', fmt=IMGFMT size=67108864
373
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=SIZE
374
{ 'execute': 'qmp_capabilities' }
375
{"return": {}}
376
-{'execute':'drive-mirror', 'arguments':{ 'device': 'src', 'target': 'TEST_DIR/t.IMGFMT', 'mode': 'existing', 'sync': 'full'}}
377
+{'execute':'drive-mirror', 'arguments':{
378
+ 'device': 'src', 'target': 'TEST_DIR/t.IMGFMT',
379
+ 'mode': 'existing', 'sync': 'full'}}
380
WARNING: Image format was not specified for 'TEST_DIR/t.raw' and probing guessed raw.
381
Automatically detecting the format is dangerous for raw images, write operations on block 0 will be restricted.
382
Specify the 'raw' format explicitly to remove the restrictions.
383
@@ -XXX,XX +XXX,XX @@ read 512/512 bytes at offset 0
384
512 bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
385
{ 'execute': 'qmp_capabilities' }
386
{"return": {}}
387
-{'execute':'drive-mirror', 'arguments':{ 'device': 'src', 'target': 'TEST_DIR/t.IMGFMT', 'format': 'IMGFMT', 'mode': 'existing', 'sync': 'full'}}
388
+{'execute':'drive-mirror', 'arguments':{
389
+ 'device': 'src', 'target': 'TEST_DIR/t.IMGFMT', 'format': 'IMGFMT',
390
+ 'mode': 'existing', 'sync': 'full'}}
391
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "created", "id": "src"}}
392
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "running", "id": "src"}}
393
{"return": {}}
394
@@ -XXX,XX +XXX,XX @@ Formatting 'TEST_DIR/t.raw.src', fmt=IMGFMT size=67108864
395
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=SIZE
396
{ 'execute': 'qmp_capabilities' }
397
{"return": {}}
398
-{'execute':'drive-mirror', 'arguments':{ 'device': 'src', 'target': 'TEST_DIR/t.IMGFMT', 'mode': 'existing', 'sync': 'full'}}
399
+{'execute':'drive-mirror', 'arguments':{
400
+ 'device': 'src', 'target': 'TEST_DIR/t.IMGFMT',
401
+ 'mode': 'existing', 'sync': 'full'}}
402
WARNING: Image format was not specified for 'TEST_DIR/t.raw' and probing guessed raw.
403
Automatically detecting the format is dangerous for raw images, write operations on block 0 will be restricted.
404
Specify the 'raw' format explicitly to remove the restrictions.
405
@@ -XXX,XX +XXX,XX @@ read 512/512 bytes at offset 0
406
512 bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
407
{ 'execute': 'qmp_capabilities' }
408
{"return": {}}
409
-{'execute':'drive-mirror', 'arguments':{ 'device': 'src', 'target': 'TEST_DIR/t.IMGFMT', 'format': 'IMGFMT', 'mode': 'existing', 'sync': 'full'}}
410
+{'execute':'drive-mirror', 'arguments':{
411
+ 'device': 'src', 'target': 'TEST_DIR/t.IMGFMT', 'format': 'IMGFMT',
412
+ 'mode': 'existing', 'sync': 'full'}}
413
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "created", "id": "src"}}
414
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "running", "id": "src"}}
415
{"return": {}}
416
@@ -XXX,XX +XXX,XX @@ Formatting 'TEST_DIR/t.raw.src', fmt=IMGFMT size=67108864
417
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=SIZE
418
{ 'execute': 'qmp_capabilities' }
419
{"return": {}}
420
-{'execute':'drive-mirror', 'arguments':{ 'device': 'src', 'target': 'TEST_DIR/t.IMGFMT', 'mode': 'existing', 'sync': 'full'}}
421
+{'execute':'drive-mirror', 'arguments':{
422
+ 'device': 'src', 'target': 'TEST_DIR/t.IMGFMT',
423
+ 'mode': 'existing', 'sync': 'full'}}
424
WARNING: Image format was not specified for 'TEST_DIR/t.raw' and probing guessed raw.
425
Automatically detecting the format is dangerous for raw images, write operations on block 0 will be restricted.
426
Specify the 'raw' format explicitly to remove the restrictions.
427
@@ -XXX,XX +XXX,XX @@ read 512/512 bytes at offset 0
428
512 bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
429
{ 'execute': 'qmp_capabilities' }
430
{"return": {}}
431
-{'execute':'drive-mirror', 'arguments':{ 'device': 'src', 'target': 'TEST_DIR/t.IMGFMT', 'format': 'IMGFMT', 'mode': 'existing', 'sync': 'full'}}
432
+{'execute':'drive-mirror', 'arguments':{
433
+ 'device': 'src', 'target': 'TEST_DIR/t.IMGFMT', 'format': 'IMGFMT',
434
+ 'mode': 'existing', 'sync': 'full'}}
435
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "created", "id": "src"}}
436
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "running", "id": "src"}}
437
{"return": {}}
438
@@ -XXX,XX +XXX,XX @@ Formatting 'TEST_DIR/t.raw.src', fmt=IMGFMT size=67108864
439
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=SIZE
440
{ 'execute': 'qmp_capabilities' }
441
{"return": {}}
442
-{'execute':'drive-mirror', 'arguments':{ 'device': 'src', 'target': 'TEST_DIR/t.IMGFMT', 'mode': 'existing', 'sync': 'full'}}
443
+{'execute':'drive-mirror', 'arguments':{
444
+ 'device': 'src', 'target': 'TEST_DIR/t.IMGFMT',
445
+ 'mode': 'existing', 'sync': 'full'}}
446
WARNING: Image format was not specified for 'TEST_DIR/t.raw' and probing guessed raw.
447
Automatically detecting the format is dangerous for raw images, write operations on block 0 will be restricted.
448
Specify the 'raw' format explicitly to remove the restrictions.
449
@@ -XXX,XX +XXX,XX @@ read 512/512 bytes at offset 0
450
512 bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
451
{ 'execute': 'qmp_capabilities' }
452
{"return": {}}
453
-{'execute':'drive-mirror', 'arguments':{ 'device': 'src', 'target': 'TEST_DIR/t.IMGFMT', 'format': 'IMGFMT', 'mode': 'existing', 'sync': 'full'}}
454
+{'execute':'drive-mirror', 'arguments':{
455
+ 'device': 'src', 'target': 'TEST_DIR/t.IMGFMT', 'format': 'IMGFMT',
456
+ 'mode': 'existing', 'sync': 'full'}}
457
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "created", "id": "src"}}
458
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "running", "id": "src"}}
459
{"return": {}}
460
@@ -XXX,XX +XXX,XX @@ Formatting 'TEST_DIR/t.raw.src', fmt=IMGFMT size=67108864
461
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=SIZE
462
{ 'execute': 'qmp_capabilities' }
463
{"return": {}}
464
-{'execute':'drive-mirror', 'arguments':{ 'device': 'src', 'target': 'TEST_DIR/t.IMGFMT', 'mode': 'existing', 'sync': 'full'}}
465
+{'execute':'drive-mirror', 'arguments':{
466
+ 'device': 'src', 'target': 'TEST_DIR/t.IMGFMT',
467
+ 'mode': 'existing', 'sync': 'full'}}
468
WARNING: Image format was not specified for 'TEST_DIR/t.raw' and probing guessed raw.
469
Automatically detecting the format is dangerous for raw images, write operations on block 0 will be restricted.
470
Specify the 'raw' format explicitly to remove the restrictions.
471
@@ -XXX,XX +XXX,XX @@ read 512/512 bytes at offset 0
472
512 bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
473
{ 'execute': 'qmp_capabilities' }
474
{"return": {}}
475
-{'execute':'drive-mirror', 'arguments':{ 'device': 'src', 'target': 'TEST_DIR/t.IMGFMT', 'format': 'IMGFMT', 'mode': 'existing', 'sync': 'full'}}
476
+{'execute':'drive-mirror', 'arguments':{
477
+ 'device': 'src', 'target': 'TEST_DIR/t.IMGFMT', 'format': 'IMGFMT',
478
+ 'mode': 'existing', 'sync': 'full'}}
479
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "created", "id": "src"}}
480
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "running", "id": "src"}}
481
{"return": {}}
482
@@ -XXX,XX +XXX,XX @@ Images are identical.
483
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=SIZE
484
{ 'execute': 'qmp_capabilities' }
485
{"return": {}}
486
-{'execute':'drive-mirror', 'arguments':{ 'device': 'src', 'target': 'TEST_DIR/t.IMGFMT', 'mode': 'existing', 'sync': 'full'}}
487
+{'execute':'drive-mirror', 'arguments':{
488
+ 'device': 'src', 'target': 'TEST_DIR/t.IMGFMT',
489
+ 'mode': 'existing', 'sync': 'full'}}
490
WARNING: Image format was not specified for 'TEST_DIR/t.raw' and probing guessed raw.
491
Automatically detecting the format is dangerous for raw images, write operations on block 0 will be restricted.
492
Specify the 'raw' format explicitly to remove the restrictions.
493
@@ -XXX,XX +XXX,XX @@ read 512/512 bytes at offset 0
494
512 bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
495
{ 'execute': 'qmp_capabilities' }
496
{"return": {}}
497
-{'execute':'drive-mirror', 'arguments':{ 'device': 'src', 'target': 'TEST_DIR/t.IMGFMT', 'format': 'IMGFMT', 'mode': 'existing', 'sync': 'full'}}
498
+{'execute':'drive-mirror', 'arguments':{
499
+ 'device': 'src', 'target': 'TEST_DIR/t.IMGFMT', 'format': 'IMGFMT',
500
+ 'mode': 'existing', 'sync': 'full'}}
501
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "created", "id": "src"}}
502
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "running", "id": "src"}}
503
{"return": {}}
504
@@ -XXX,XX +XXX,XX @@ Images are identical.
505
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=SIZE
506
{ 'execute': 'qmp_capabilities' }
507
{"return": {}}
508
-{'execute':'drive-mirror', 'arguments':{ 'device': 'src', 'target': 'TEST_DIR/t.IMGFMT', 'mode': 'existing', 'sync': 'full'}}
509
+{'execute':'drive-mirror', 'arguments':{
510
+ 'device': 'src', 'target': 'TEST_DIR/t.IMGFMT',
511
+ 'mode': 'existing', 'sync': 'full'}}
512
WARNING: Image format was not specified for 'TEST_DIR/t.raw' and probing guessed raw.
513
Automatically detecting the format is dangerous for raw images, write operations on block 0 will be restricted.
514
Specify the 'raw' format explicitly to remove the restrictions.
515
@@ -XXX,XX +XXX,XX @@ read 512/512 bytes at offset 0
516
512 bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
517
{ 'execute': 'qmp_capabilities' }
518
{"return": {}}
519
-{'execute':'drive-mirror', 'arguments':{ 'device': 'src', 'target': 'TEST_DIR/t.IMGFMT', 'format': 'IMGFMT', 'mode': 'existing', 'sync': 'full'}}
520
+{'execute':'drive-mirror', 'arguments':{
521
+ 'device': 'src', 'target': 'TEST_DIR/t.IMGFMT', 'format': 'IMGFMT',
522
+ 'mode': 'existing', 'sync': 'full'}}
523
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "created", "id": "src"}}
524
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "running", "id": "src"}}
525
{"return": {}}
526
@@ -XXX,XX +XXX,XX @@ Images are identical.
527
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=SIZE
528
{ 'execute': 'qmp_capabilities' }
529
{"return": {}}
530
-{'execute':'drive-mirror', 'arguments':{ 'device': 'src', 'target': 'TEST_DIR/t.IMGFMT', 'mode': 'existing', 'sync': 'full'}}
531
+{'execute':'drive-mirror', 'arguments':{
532
+ 'device': 'src', 'target': 'TEST_DIR/t.IMGFMT',
533
+ 'mode': 'existing', 'sync': 'full'}}
534
WARNING: Image format was not specified for 'TEST_DIR/t.raw' and probing guessed raw.
535
Automatically detecting the format is dangerous for raw images, write operations on block 0 will be restricted.
536
Specify the 'raw' format explicitly to remove the restrictions.
537
@@ -XXX,XX +XXX,XX @@ read 512/512 bytes at offset 0
538
512 bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
539
{ 'execute': 'qmp_capabilities' }
540
{"return": {}}
541
-{'execute':'drive-mirror', 'arguments':{ 'device': 'src', 'target': 'TEST_DIR/t.IMGFMT', 'format': 'IMGFMT', 'mode': 'existing', 'sync': 'full'}}
542
+{'execute':'drive-mirror', 'arguments':{
543
+ 'device': 'src', 'target': 'TEST_DIR/t.IMGFMT', 'format': 'IMGFMT',
544
+ 'mode': 'existing', 'sync': 'full'}}
545
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "created", "id": "src"}}
546
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "running", "id": "src"}}
547
{"return": {}}
548
@@ -XXX,XX +XXX,XX @@ Images are identical.
549
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=SIZE
550
{ 'execute': 'qmp_capabilities' }
551
{"return": {}}
552
-{'execute':'drive-mirror', 'arguments':{ 'device': 'src', 'target': 'TEST_DIR/t.IMGFMT', 'mode': 'existing', 'sync': 'full'}}
553
+{'execute':'drive-mirror', 'arguments':{
554
+ 'device': 'src', 'target': 'TEST_DIR/t.IMGFMT',
555
+ 'mode': 'existing', 'sync': 'full'}}
556
WARNING: Image format was not specified for 'TEST_DIR/t.raw' and probing guessed raw.
557
Automatically detecting the format is dangerous for raw images, write operations on block 0 will be restricted.
558
Specify the 'raw' format explicitly to remove the restrictions.
559
@@ -XXX,XX +XXX,XX @@ read 512/512 bytes at offset 0
560
512 bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
561
{ 'execute': 'qmp_capabilities' }
562
{"return": {}}
563
-{'execute':'drive-mirror', 'arguments':{ 'device': 'src', 'target': 'TEST_DIR/t.IMGFMT', 'format': 'IMGFMT', 'mode': 'existing', 'sync': 'full'}}
564
+{'execute':'drive-mirror', 'arguments':{
565
+ 'device': 'src', 'target': 'TEST_DIR/t.IMGFMT', 'format': 'IMGFMT',
566
+ 'mode': 'existing', 'sync': 'full'}}
567
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "created", "id": "src"}}
568
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "running", "id": "src"}}
569
{"return": {}}
570
@@ -XXX,XX +XXX,XX @@ Images are identical.
571
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=SIZE
572
{ 'execute': 'qmp_capabilities' }
573
{"return": {}}
574
-{'execute':'drive-mirror', 'arguments':{ 'device': 'src', 'target': 'TEST_DIR/t.IMGFMT', 'mode': 'existing', 'sync': 'full'}}
575
+{'execute':'drive-mirror', 'arguments':{
576
+ 'device': 'src', 'target': 'TEST_DIR/t.IMGFMT',
577
+ 'mode': 'existing', 'sync': 'full'}}
578
WARNING: Image format was not specified for 'TEST_DIR/t.raw' and probing guessed raw.
579
Automatically detecting the format is dangerous for raw images, write operations on block 0 will be restricted.
580
Specify the 'raw' format explicitly to remove the restrictions.
581
@@ -XXX,XX +XXX,XX @@ WARNING: Image format was not specified for 'TEST_DIR/t.raw' and probing guessed
582
Images are identical.
583
{ 'execute': 'qmp_capabilities' }
584
{"return": {}}
585
-{'execute':'drive-mirror', 'arguments':{ 'device': 'src', 'target': 'TEST_DIR/t.IMGFMT', 'format': 'IMGFMT', 'mode': 'existing', 'sync': 'full'}}
586
+{'execute':'drive-mirror', 'arguments':{
587
+ 'device': 'src', 'target': 'TEST_DIR/t.IMGFMT', 'format': 'IMGFMT',
588
+ 'mode': 'existing', 'sync': 'full'}}
589
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "created", "id": "src"}}
590
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "running", "id": "src"}}
591
{"return": {}}
592
diff --git a/tests/qemu-iotests/117.out b/tests/qemu-iotests/117.out
593
index XXXXXXX..XXXXXXX 100644
594
--- a/tests/qemu-iotests/117.out
595
+++ b/tests/qemu-iotests/117.out
596
@@ -XXX,XX +XXX,XX @@ QA output created by 117
597
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=65536
598
{ 'execute': 'qmp_capabilities' }
599
{"return": {}}
600
-{ 'execute': 'blockdev-add', 'arguments': { 'node-name': 'protocol', 'driver': 'file', 'filename': 'TEST_DIR/t.IMGFMT' } }
601
+{ 'execute': 'blockdev-add',
602
+ 'arguments': { 'node-name': 'protocol',
603
+ 'driver': 'file',
604
+ 'filename': 'TEST_DIR/t.IMGFMT' } }
605
{"return": {}}
606
-{ 'execute': 'blockdev-add', 'arguments': { 'node-name': 'format', 'driver': 'IMGFMT', 'file': 'protocol' } }
607
+{ 'execute': 'blockdev-add',
608
+ 'arguments': { 'node-name': 'format',
609
+ 'driver': 'IMGFMT',
610
+ 'file': 'protocol' } }
611
{"return": {}}
612
-{ 'execute': 'human-monitor-command', 'arguments': { 'command-line': 'qemu-io format "write -P 42 0 64k"' } }
613
+{ 'execute': 'human-monitor-command',
614
+ 'arguments': { 'command-line': 'qemu-io format "write -P 42 0 64k"' } }
615
wrote 65536/65536 bytes at offset 0
616
64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
617
{"return": ""}
618
diff --git a/tests/qemu-iotests/127.out b/tests/qemu-iotests/127.out
619
index XXXXXXX..XXXXXXX 100644
620
--- a/tests/qemu-iotests/127.out
621
+++ b/tests/qemu-iotests/127.out
622
@@ -XXX,XX +XXX,XX @@ wrote 42/42 bytes at offset 0
623
42 bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
624
{ 'execute': 'qmp_capabilities' }
625
{"return": {}}
626
-{ 'execute': 'drive-mirror', 'arguments': { 'job-id': 'mirror', 'device': 'source', 'target': 'TEST_DIR/t.IMGFMT.overlay1', 'mode': 'existing', 'sync': 'top' } }
627
+{ 'execute': 'drive-mirror',
628
+ 'arguments': {
629
+ 'job-id': 'mirror',
630
+ 'device': 'source',
631
+ 'target': 'TEST_DIR/t.IMGFMT.overlay1',
632
+ 'mode': 'existing',
633
+ 'sync': 'top'
634
+ } }
635
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "created", "id": "mirror"}}
636
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "running", "id": "mirror"}}
637
{"return": {}}
638
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "ready", "id": "mirror"}}
639
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "BLOCK_JOB_READY", "data": {"device": "mirror", "len": 65536, "offset": 65536, "speed": 0, "type": "mirror"}}
640
-{ 'execute': 'block-job-complete', 'arguments': { 'device': 'mirror' } }
641
+{ 'execute': 'block-job-complete',
642
+ 'arguments': { 'device': 'mirror' } }
643
{"return": {}}
644
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "waiting", "id": "mirror"}}
645
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "pending", "id": "mirror"}}
646
diff --git a/tests/qemu-iotests/140.out b/tests/qemu-iotests/140.out
647
index XXXXXXX..XXXXXXX 100644
648
--- a/tests/qemu-iotests/140.out
649
+++ b/tests/qemu-iotests/140.out
650
@@ -XXX,XX +XXX,XX @@ wrote 65536/65536 bytes at offset 0
651
64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
652
{ 'execute': 'qmp_capabilities' }
653
{"return": {}}
654
-{ 'execute': 'nbd-server-start', 'arguments': { 'addr': { 'type': 'unix', 'data': { 'path': 'SOCK_DIR/nbd' }}}}
655
+{ 'execute': 'nbd-server-start',
656
+ 'arguments': { 'addr': { 'type': 'unix',
657
+ 'data': { 'path': 'SOCK_DIR/nbd' }}}}
658
{"return": {}}
659
-{ 'execute': 'nbd-server-add', 'arguments': { 'device': 'drv' }}
660
+{ 'execute': 'nbd-server-add',
661
+ 'arguments': { 'device': 'drv' }}
662
{"return": {}}
663
read 65536/65536 bytes at offset 0
664
64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
665
-{ 'execute': 'eject', 'arguments': { 'device': 'drv' }}
666
+{ 'execute': 'eject',
667
+ 'arguments': { 'device': 'drv' }}
668
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "BLOCK_EXPORT_DELETED", "data": {"id": "drv"}}
669
qemu-io: can't open device nbd+unix:///drv?socket=SOCK_DIR/nbd: Requested export not available
670
server reported: export 'drv' not present
671
diff --git a/tests/qemu-iotests/141.out b/tests/qemu-iotests/141.out
672
index XXXXXXX..XXXXXXX 100644
673
--- a/tests/qemu-iotests/141.out
674
+++ b/tests/qemu-iotests/141.out
675
@@ -XXX,XX +XXX,XX @@ Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=1048576 backing_file=TEST_DIR/m.
676
677
=== Testing drive-backup ===
678
679
-{'execute': 'blockdev-add', 'arguments': { 'node-name': 'drv0', 'driver': 'IMGFMT', 'file': { 'driver': 'file', 'filename': 'TEST_DIR/t.IMGFMT' }}}
680
-{"return": {}}
681
-{'execute': 'drive-backup', 'arguments': {'job-id': 'job0', 'device': 'drv0', 'target': 'TEST_DIR/o.IMGFMT', 'format': 'IMGFMT', 'sync': 'none'}}
682
+{'execute': 'blockdev-add',
683
+ 'arguments': {
684
+ 'node-name': 'drv0',
685
+ 'driver': 'IMGFMT',
686
+ 'file': {
687
+ 'driver': 'file',
688
+ 'filename': 'TEST_DIR/t.IMGFMT'
689
+ }}}
690
+{"return": {}}
691
+{'execute': 'drive-backup',
692
+'arguments': {'job-id': 'job0',
693
+'device': 'drv0',
694
+'target': 'TEST_DIR/o.IMGFMT',
695
+'format': 'IMGFMT',
696
+'sync': 'none'}}
697
Formatting 'TEST_DIR/o.IMGFMT', fmt=IMGFMT size=1048576 backing_file=TEST_DIR/t.IMGFMT backing_fmt=IMGFMT
698
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "created", "id": "job0"}}
699
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "running", "id": "job0"}}
700
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "paused", "id": "job0"}}
701
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "running", "id": "job0"}}
702
-{'execute': 'blockdev-del', 'arguments': {'node-name': 'drv0'}}
703
+{'execute': 'blockdev-del',
704
+ 'arguments': {'node-name': 'drv0'}}
705
{"error": {"class": "GenericError", "desc": "Node 'drv0' is busy: node is used as backing hd of 'NODE_NAME'"}}
706
-{'execute': 'block-job-cancel', 'arguments': {'device': 'job0'}}
707
+{'execute': 'block-job-cancel',
708
+ 'arguments': {'device': 'job0'}}
709
{"return": {}}
710
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "aborting", "id": "job0"}}
711
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "BLOCK_JOB_CANCELLED", "data": {"device": "job0", "len": 1048576, "offset": 0, "speed": 0, "type": "backup"}}
712
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "concluded", "id": "job0"}}
713
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "null", "id": "job0"}}
714
-{'execute': 'blockdev-del', 'arguments': {'node-name': 'drv0'}}
715
+{'execute': 'blockdev-del',
716
+ 'arguments': {'node-name': 'drv0'}}
717
{"return": {}}
718
719
=== Testing drive-mirror ===
720
721
-{'execute': 'blockdev-add', 'arguments': { 'node-name': 'drv0', 'driver': 'IMGFMT', 'file': { 'driver': 'file', 'filename': 'TEST_DIR/t.IMGFMT' }}}
722
-{"return": {}}
723
-{'execute': 'drive-mirror', 'arguments': {'job-id': 'job0', 'device': 'drv0', 'target': 'TEST_DIR/o.IMGFMT', 'format': 'IMGFMT', 'sync': 'none'}}
724
+{'execute': 'blockdev-add',
725
+ 'arguments': {
726
+ 'node-name': 'drv0',
727
+ 'driver': 'IMGFMT',
728
+ 'file': {
729
+ 'driver': 'file',
730
+ 'filename': 'TEST_DIR/t.IMGFMT'
731
+ }}}
732
+{"return": {}}
733
+{'execute': 'drive-mirror',
734
+'arguments': {'job-id': 'job0',
735
+'device': 'drv0',
736
+'target': 'TEST_DIR/o.IMGFMT',
737
+'format': 'IMGFMT',
738
+'sync': 'none'}}
739
Formatting 'TEST_DIR/o.IMGFMT', fmt=IMGFMT size=1048576 backing_file=TEST_DIR/t.IMGFMT backing_fmt=IMGFMT
740
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "created", "id": "job0"}}
741
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "running", "id": "job0"}}
742
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "ready", "id": "job0"}}
743
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "BLOCK_JOB_READY", "data": {"device": "job0", "len": 0, "offset": 0, "speed": 0, "type": "mirror"}}
744
-{'execute': 'blockdev-del', 'arguments': {'node-name': 'drv0'}}
745
+{'execute': 'blockdev-del',
746
+ 'arguments': {'node-name': 'drv0'}}
747
{"error": {"class": "GenericError", "desc": "Node 'drv0' is busy: block device is in use by block job: mirror"}}
748
-{'execute': 'block-job-cancel', 'arguments': {'device': 'job0'}}
749
+{'execute': 'block-job-cancel',
750
+ 'arguments': {'device': 'job0'}}
751
{"return": {}}
752
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "waiting", "id": "job0"}}
753
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "pending", "id": "job0"}}
754
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "BLOCK_JOB_COMPLETED", "data": {"device": "job0", "len": 0, "offset": 0, "speed": 0, "type": "mirror"}}
755
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "concluded", "id": "job0"}}
756
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "null", "id": "job0"}}
757
-{'execute': 'blockdev-del', 'arguments': {'node-name': 'drv0'}}
758
+{'execute': 'blockdev-del',
759
+ 'arguments': {'node-name': 'drv0'}}
760
{"return": {}}
761
762
=== Testing active block-commit ===
763
764
-{'execute': 'blockdev-add', 'arguments': { 'node-name': 'drv0', 'driver': 'IMGFMT', 'file': { 'driver': 'file', 'filename': 'TEST_DIR/t.IMGFMT' }}}
765
-{"return": {}}
766
-{'execute': 'block-commit', 'arguments': {'job-id': 'job0', 'device': 'drv0'}}
767
+{'execute': 'blockdev-add',
768
+ 'arguments': {
769
+ 'node-name': 'drv0',
770
+ 'driver': 'IMGFMT',
771
+ 'file': {
772
+ 'driver': 'file',
773
+ 'filename': 'TEST_DIR/t.IMGFMT'
774
+ }}}
775
+{"return": {}}
776
+{'execute': 'block-commit',
777
+'arguments': {'job-id': 'job0', 'device': 'drv0'}}
778
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "created", "id": "job0"}}
779
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "running", "id": "job0"}}
780
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "ready", "id": "job0"}}
781
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "BLOCK_JOB_READY", "data": {"device": "job0", "len": 0, "offset": 0, "speed": 0, "type": "commit"}}
782
-{'execute': 'blockdev-del', 'arguments': {'node-name': 'drv0'}}
783
+{'execute': 'blockdev-del',
784
+ 'arguments': {'node-name': 'drv0'}}
785
{"error": {"class": "GenericError", "desc": "Node 'drv0' is busy: block device is in use by block job: commit"}}
786
-{'execute': 'block-job-cancel', 'arguments': {'device': 'job0'}}
787
+{'execute': 'block-job-cancel',
788
+ 'arguments': {'device': 'job0'}}
789
{"return": {}}
790
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "waiting", "id": "job0"}}
791
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "pending", "id": "job0"}}
792
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "BLOCK_JOB_COMPLETED", "data": {"device": "job0", "len": 0, "offset": 0, "speed": 0, "type": "commit"}}
793
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "concluded", "id": "job0"}}
794
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "null", "id": "job0"}}
795
-{'execute': 'blockdev-del', 'arguments': {'node-name': 'drv0'}}
796
+{'execute': 'blockdev-del',
797
+ 'arguments': {'node-name': 'drv0'}}
798
{"return": {}}
799
800
=== Testing non-active block-commit ===
801
802
wrote 1048576/1048576 bytes at offset 0
803
1 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
804
-{'execute': 'blockdev-add', 'arguments': { 'node-name': 'drv0', 'driver': 'IMGFMT', 'file': { 'driver': 'file', 'filename': 'TEST_DIR/t.IMGFMT' }}}
805
-{"return": {}}
806
-{'execute': 'block-commit', 'arguments': {'job-id': 'job0', 'device': 'drv0', 'top': 'TEST_DIR/m.IMGFMT', 'speed': 1}}
807
+{'execute': 'blockdev-add',
808
+ 'arguments': {
809
+ 'node-name': 'drv0',
810
+ 'driver': 'IMGFMT',
811
+ 'file': {
812
+ 'driver': 'file',
813
+ 'filename': 'TEST_DIR/t.IMGFMT'
814
+ }}}
815
+{"return": {}}
816
+{'execute': 'block-commit',
817
+'arguments': {'job-id': 'job0',
818
+'device': 'drv0',
819
+'top': 'TEST_DIR/m.IMGFMT',
820
+'speed': 1}}
821
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "created", "id": "job0"}}
822
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "running", "id": "job0"}}
823
-{'execute': 'blockdev-del', 'arguments': {'node-name': 'drv0'}}
824
+{'execute': 'blockdev-del',
825
+ 'arguments': {'node-name': 'drv0'}}
826
{"error": {"class": "GenericError", "desc": "Node drv0 is in use"}}
827
-{'execute': 'block-job-cancel', 'arguments': {'device': 'job0'}}
828
+{'execute': 'block-job-cancel',
829
+ 'arguments': {'device': 'job0'}}
830
{"return": {}}
831
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "aborting", "id": "job0"}}
832
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "BLOCK_JOB_CANCELLED", "data": {"device": "job0", "len": 1048576, "offset": 524288, "speed": 1, "type": "commit"}}
833
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "concluded", "id": "job0"}}
834
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "null", "id": "job0"}}
835
-{'execute': 'blockdev-del', 'arguments': {'node-name': 'drv0'}}
836
+{'execute': 'blockdev-del',
837
+ 'arguments': {'node-name': 'drv0'}}
838
{"return": {}}
839
840
=== Testing block-stream ===
841
842
wrote 1048576/1048576 bytes at offset 0
843
1 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
844
-{'execute': 'blockdev-add', 'arguments': { 'node-name': 'drv0', 'driver': 'IMGFMT', 'file': { 'driver': 'file', 'filename': 'TEST_DIR/t.IMGFMT' }}}
845
-{"return": {}}
846
-{'execute': 'block-stream', 'arguments': {'job-id': 'job0', 'device': 'drv0', 'speed': 1}}
847
+{'execute': 'blockdev-add',
848
+ 'arguments': {
849
+ 'node-name': 'drv0',
850
+ 'driver': 'IMGFMT',
851
+ 'file': {
852
+ 'driver': 'file',
853
+ 'filename': 'TEST_DIR/t.IMGFMT'
854
+ }}}
855
+{"return": {}}
856
+{'execute': 'block-stream',
857
+'arguments': {'job-id': 'job0',
858
+'device': 'drv0',
859
+'speed': 1}}
860
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "created", "id": "job0"}}
861
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "running", "id": "job0"}}
862
-{'execute': 'blockdev-del', 'arguments': {'node-name': 'drv0'}}
863
+{'execute': 'blockdev-del',
864
+ 'arguments': {'node-name': 'drv0'}}
865
{"error": {"class": "GenericError", "desc": "Node drv0 is in use"}}
866
-{'execute': 'block-job-cancel', 'arguments': {'device': 'job0'}}
867
+{'execute': 'block-job-cancel',
868
+ 'arguments': {'device': 'job0'}}
869
{"return": {}}
870
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "aborting", "id": "job0"}}
871
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "BLOCK_JOB_CANCELLED", "data": {"device": "job0", "len": 1048576, "offset": 524288, "speed": 1, "type": "stream"}}
872
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "concluded", "id": "job0"}}
873
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "null", "id": "job0"}}
874
-{'execute': 'blockdev-del', 'arguments': {'node-name': 'drv0'}}
875
+{'execute': 'blockdev-del',
876
+ 'arguments': {'node-name': 'drv0'}}
877
{"return": {}}
878
*** done
879
diff --git a/tests/qemu-iotests/143.out b/tests/qemu-iotests/143.out
880
index XXXXXXX..XXXXXXX 100644
881
--- a/tests/qemu-iotests/143.out
882
+++ b/tests/qemu-iotests/143.out
99
@@ -XXX,XX +XXX,XX @@
883
@@ -XXX,XX +XXX,XX @@
100
QA output created by 085
884
QA output created by 143
101
-Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=134217728
885
{ 'execute': 'qmp_capabilities' }
102
-Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=134217728
886
{"return": {}}
103
+Formatting 'TEST_DIR/t.IMGFMT.1', fmt=IMGFMT size=134217728
887
-{ 'execute': 'nbd-server-start', 'arguments': { 'addr': { 'type': 'unix', 'data': { 'path': 'SOCK_DIR/nbd' }}}}
104
+Formatting 'TEST_DIR/t.IMGFMT.2', fmt=IMGFMT size=134217728
888
+{ 'execute': 'nbd-server-start',
105
889
+ 'arguments': { 'addr': { 'type': 'unix',
106
=== Running QEMU ===
890
+ 'data': { 'path': 'SOCK_DIR/nbd' }}}}
107
891
{"return": {}}
108
@@ -XXX,XX +XXX,XX @@ Formatting 'TEST_DIR/10-snapshot-v1.qcow2', fmt=qcow2 size=134217728 backing_fil
892
qemu-io: can't open device nbd+unix:///no_such_export?socket=SOCK_DIR/nbd: Requested export not available
109
893
server reported: export 'no_such_export' not present
110
=== Create a couple of snapshots using blockdev-snapshot ===
894
diff --git a/tests/qemu-iotests/144.out b/tests/qemu-iotests/144.out
111
895
index XXXXXXX..XXXXXXX 100644
112
-Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=134217728 backing_file=TEST_DIR/10-snapshot-v0.IMGFMT
896
--- a/tests/qemu-iotests/144.out
113
+Formatting 'TEST_DIR/11-snapshot-v0.IMGFMT', fmt=IMGFMT size=134217728 backing_file=TEST_DIR/10-snapshot-v0.IMGFMT
897
+++ b/tests/qemu-iotests/144.out
114
{ 'execute': 'blockdev-add', 'arguments': { 'driver': 'IMGFMT', 'node-name': 'snap_11', 'backing': null, 'file': { 'driver': 'file', 'filename': 'TEST_DIR/11-snapshot-v0.IMGFMT', 'node-name': 'file_11' } } }
898
@@ -XXX,XX +XXX,XX @@ Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=536870912
115
{"return": {}}
899
116
{ 'execute': 'blockdev-snapshot', 'arguments': { 'node': 'virtio0', 'overlay':'snap_11' } }
900
{ 'execute': 'qmp_capabilities' }
117
{"return": {}}
901
{"return": {}}
118
-Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=134217728 backing_file=TEST_DIR/11-snapshot-v0.IMGFMT
902
-{ 'execute': 'blockdev-snapshot-sync', 'arguments': { 'device': 'virtio0', 'snapshot-file':'TEST_DIR/tmp.IMGFMT', 'format': 'IMGFMT' } }
119
+Formatting 'TEST_DIR/12-snapshot-v0.IMGFMT', fmt=IMGFMT size=134217728 backing_file=TEST_DIR/11-snapshot-v0.IMGFMT
903
+{ 'execute': 'blockdev-snapshot-sync',
120
{ 'execute': 'blockdev-add', 'arguments': { 'driver': 'IMGFMT', 'node-name': 'snap_12', 'backing': null, 'file': { 'driver': 'file', 'filename': 'TEST_DIR/12-snapshot-v0.IMGFMT', 'node-name': 'file_12' } } }
904
+ 'arguments': {
121
{"return": {}}
905
+ 'device': 'virtio0',
122
{ 'execute': 'blockdev-snapshot', 'arguments': { 'node': 'virtio0', 'overlay':'snap_12' } }
906
+ 'snapshot-file':'TEST_DIR/tmp.IMGFMT',
907
+ 'format': 'IMGFMT'
908
+ }
909
+ }
910
Formatting 'TEST_DIR/tmp.qcow2', fmt=qcow2 cluster_size=65536 extended_l2=off compression_type=zlib size=536870912 backing_file=TEST_DIR/t.qcow2 backing_fmt=qcow2 lazy_refcounts=off refcount_bits=16
911
{"return": {}}
912
913
=== Performing block-commit on active layer ===
914
915
-{ 'execute': 'block-commit', 'arguments': { 'device': 'virtio0' } }
916
+{ 'execute': 'block-commit',
917
+ 'arguments': {
918
+ 'device': 'virtio0'
919
+ }
920
+ }
921
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "created", "id": "virtio0"}}
922
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "running", "id": "virtio0"}}
923
{"return": {}}
924
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "ready", "id": "virtio0"}}
925
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "BLOCK_JOB_READY", "data": {"device": "virtio0", "len": 0, "offset": 0, "speed": 0, "type": "commit"}}
926
-{ 'execute': 'block-job-complete', 'arguments': { 'device': 'virtio0' } }
927
+{ 'execute': 'block-job-complete',
928
+ 'arguments': {
929
+ 'device': 'virtio0'
930
+ }
931
+ }
932
{"return": {}}
933
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "waiting", "id": "virtio0"}}
934
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "pending", "id": "virtio0"}}
935
@@ -XXX,XX +XXX,XX @@ Formatting 'TEST_DIR/tmp.qcow2', fmt=qcow2 cluster_size=65536 extended_l2=off co
936
937
=== Performing Live Snapshot 2 ===
938
939
-{ 'execute': 'blockdev-snapshot-sync', 'arguments': { 'device': 'virtio0', 'snapshot-file':'TEST_DIR/tmp2.IMGFMT', 'format': 'IMGFMT' } }
940
+{ 'execute': 'blockdev-snapshot-sync',
941
+ 'arguments': {
942
+ 'device': 'virtio0',
943
+ 'snapshot-file':'TEST_DIR/tmp2.IMGFMT',
944
+ 'format': 'IMGFMT'
945
+ }
946
+ }
947
Formatting 'TEST_DIR/tmp2.qcow2', fmt=qcow2 cluster_size=65536 extended_l2=off compression_type=zlib size=536870912 backing_file=TEST_DIR/t.qcow2 backing_fmt=qcow2 lazy_refcounts=off refcount_bits=16
948
{"return": {}}
949
*** done
950
diff --git a/tests/qemu-iotests/153.out b/tests/qemu-iotests/153.out
951
index XXXXXXX..XXXXXXX 100644
952
--- a/tests/qemu-iotests/153.out
953
+++ b/tests/qemu-iotests/153.out
954
@@ -XXX,XX +XXX,XX @@ _qemu_img_wrapper commit -b TEST_DIR/t.qcow2.b TEST_DIR/t.qcow2.c
955
{ 'execute': 'qmp_capabilities' }
956
{"return": {}}
957
Adding drive
958
-{ 'execute': 'human-monitor-command', 'arguments': { 'command-line': 'drive_add 0 if=none,id=d0,file=TEST_DIR/t.IMGFMT' } }
959
+{ 'execute': 'human-monitor-command',
960
+ 'arguments': { 'command-line': 'drive_add 0 if=none,id=d0,file=TEST_DIR/t.IMGFMT' } }
961
{"return": "OKrn"}
962
963
_qemu_io_wrapper TEST_DIR/t.qcow2 -c write 0 512
964
@@ -XXX,XX +XXX,XX @@ Creating overlay with qemu-img when the guest is running should be allowed
965
966
_qemu_img_wrapper create -f qcow2 -b TEST_DIR/t.qcow2 -F qcow2 TEST_DIR/t.qcow2.overlay
967
== Closing an image should unlock it ==
968
-{ 'execute': 'human-monitor-command', 'arguments': { 'command-line': 'drive_del d0' } }
969
+{ 'execute': 'human-monitor-command',
970
+ 'arguments': { 'command-line': 'drive_del d0' } }
971
{"return": ""}
972
973
_qemu_io_wrapper TEST_DIR/t.qcow2 -c write 0 512
974
Adding two and closing one
975
-{ 'execute': 'human-monitor-command', 'arguments': { 'command-line': 'drive_add 0 if=none,id=d0,file=TEST_DIR/t.IMGFMT,readonly=on' } }
976
+{ 'execute': 'human-monitor-command',
977
+ 'arguments': { 'command-line': 'drive_add 0 if=none,id=d0,file=TEST_DIR/t.IMGFMT,readonly=on' } }
978
{"return": "OKrn"}
979
-{ 'execute': 'human-monitor-command', 'arguments': { 'command-line': 'drive_add 0 if=none,id=d1,file=TEST_DIR/t.IMGFMT,readonly=on' } }
980
+{ 'execute': 'human-monitor-command',
981
+ 'arguments': { 'command-line': 'drive_add 0 if=none,id=d1,file=TEST_DIR/t.IMGFMT,readonly=on' } }
982
{"return": "OKrn"}
983
984
_qemu_img_wrapper info TEST_DIR/t.qcow2
985
-{ 'execute': 'human-monitor-command', 'arguments': { 'command-line': 'drive_del d0' } }
986
+{ 'execute': 'human-monitor-command',
987
+ 'arguments': { 'command-line': 'drive_del d0' } }
988
{"return": ""}
989
990
_qemu_io_wrapper TEST_DIR/t.qcow2 -c write 0 512
991
qemu-io: can't open device TEST_DIR/t.qcow2: Failed to get "write" lock
992
Is another process using the image [TEST_DIR/t.qcow2]?
993
Closing the other
994
-{ 'execute': 'human-monitor-command', 'arguments': { 'command-line': 'drive_del d1' } }
995
+{ 'execute': 'human-monitor-command',
996
+ 'arguments': { 'command-line': 'drive_del d1' } }
997
{"return": ""}
998
999
_qemu_io_wrapper TEST_DIR/t.qcow2 -c write 0 512
1000
diff --git a/tests/qemu-iotests/156.out b/tests/qemu-iotests/156.out
1001
index XXXXXXX..XXXXXXX 100644
1002
--- a/tests/qemu-iotests/156.out
1003
+++ b/tests/qemu-iotests/156.out
1004
@@ -XXX,XX +XXX,XX @@ wrote 196608/196608 bytes at offset 65536
1005
{ 'execute': 'qmp_capabilities' }
1006
{"return": {}}
1007
Formatting 'TEST_DIR/t.IMGFMT.overlay', fmt=IMGFMT size=1048576 backing_file=TEST_DIR/t.IMGFMT backing_fmt=IMGFMT
1008
-{ 'execute': 'blockdev-snapshot-sync', 'arguments': { 'device': 'source', 'snapshot-file': 'TEST_DIR/t.IMGFMT.overlay', 'format': 'IMGFMT', 'mode': 'existing' } }
1009
+{ 'execute': 'blockdev-snapshot-sync',
1010
+ 'arguments': { 'device': 'source',
1011
+ 'snapshot-file': 'TEST_DIR/t.IMGFMT.overlay',
1012
+ 'format': 'IMGFMT',
1013
+ 'mode': 'existing' } }
1014
{"return": {}}
1015
-{ 'execute': 'human-monitor-command', 'arguments': { 'command-line': 'qemu-io source "write -P 3 128k 128k"' } }
1016
+{ 'execute': 'human-monitor-command',
1017
+ 'arguments': { 'command-line':
1018
+ 'qemu-io source "write -P 3 128k 128k"' } }
1019
wrote 131072/131072 bytes at offset 131072
1020
128 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
1021
{"return": ""}
1022
Formatting 'TEST_DIR/t.IMGFMT.target.overlay', fmt=IMGFMT size=1048576 backing_file=TEST_DIR/t.IMGFMT.target backing_fmt=IMGFMT
1023
-{ 'execute': 'drive-mirror', 'arguments': { 'device': 'source', 'target': 'TEST_DIR/t.IMGFMT.target.overlay', 'mode': 'existing', 'sync': 'top' } }
1024
+{ 'execute': 'drive-mirror',
1025
+ 'arguments': { 'device': 'source',
1026
+ 'target': 'TEST_DIR/t.IMGFMT.target.overlay',
1027
+ 'mode': 'existing',
1028
+ 'sync': 'top' } }
1029
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "created", "id": "source"}}
1030
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "running", "id": "source"}}
1031
{"return": {}}
1032
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "ready", "id": "source"}}
1033
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "BLOCK_JOB_READY", "data": {"device": "source", "len": 131072, "offset": 131072, "speed": 0, "type": "mirror"}}
1034
-{ 'execute': 'human-monitor-command', 'arguments': { 'command-line': 'qemu-io source "write -P 4 192k 64k"' } }
1035
+{ 'execute': 'human-monitor-command',
1036
+ 'arguments': { 'command-line':
1037
+ 'qemu-io source "write -P 4 192k 64k"' } }
1038
wrote 65536/65536 bytes at offset 196608
1039
64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
1040
{"return": ""}
1041
-{ 'execute': 'block-job-complete', 'arguments': { 'device': 'source' } }
1042
+{ 'execute': 'block-job-complete',
1043
+ 'arguments': { 'device': 'source' } }
1044
{"return": {}}
1045
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "waiting", "id": "source"}}
1046
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "pending", "id": "source"}}
1047
@@ -XXX,XX +XXX,XX @@ wrote 65536/65536 bytes at offset 196608
1048
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "concluded", "id": "source"}}
1049
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "null", "id": "source"}}
1050
1051
-{ 'execute': 'human-monitor-command', 'arguments': { 'command-line': 'qemu-io source "read -P 1 0k 64k"' } }
1052
+{ 'execute': 'human-monitor-command',
1053
+ 'arguments': { 'command-line':
1054
+ 'qemu-io source "read -P 1 0k 64k"' } }
1055
read 65536/65536 bytes at offset 0
1056
64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
1057
{"return": ""}
1058
-{ 'execute': 'human-monitor-command', 'arguments': { 'command-line': 'qemu-io source "read -P 2 64k 64k"' } }
1059
+{ 'execute': 'human-monitor-command',
1060
+ 'arguments': { 'command-line':
1061
+ 'qemu-io source "read -P 2 64k 64k"' } }
1062
read 65536/65536 bytes at offset 65536
1063
64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
1064
{"return": ""}
1065
-{ 'execute': 'human-monitor-command', 'arguments': { 'command-line': 'qemu-io source "read -P 3 128k 64k"' } }
1066
+{ 'execute': 'human-monitor-command',
1067
+ 'arguments': { 'command-line':
1068
+ 'qemu-io source "read -P 3 128k 64k"' } }
1069
read 65536/65536 bytes at offset 131072
1070
64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
1071
{"return": ""}
1072
-{ 'execute': 'human-monitor-command', 'arguments': { 'command-line': 'qemu-io source "read -P 4 192k 64k"' } }
1073
+{ 'execute': 'human-monitor-command',
1074
+ 'arguments': { 'command-line':
1075
+ 'qemu-io source "read -P 4 192k 64k"' } }
1076
read 65536/65536 bytes at offset 196608
1077
64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
1078
{"return": ""}
1079
diff --git a/tests/qemu-iotests/161.out b/tests/qemu-iotests/161.out
1080
index XXXXXXX..XXXXXXX 100644
1081
--- a/tests/qemu-iotests/161.out
1082
+++ b/tests/qemu-iotests/161.out
1083
@@ -XXX,XX +XXX,XX @@ Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=1048576 backing_file=TEST_DIR/t.
1084
1085
{ 'execute': 'qmp_capabilities' }
1086
{"return": {}}
1087
-{ 'execute': 'human-monitor-command', 'arguments': { 'command-line': 'qemu-io none0 "reopen -o backing.detect-zeroes=on"' } }
1088
+{ 'execute': 'human-monitor-command',
1089
+ 'arguments': { 'command-line':
1090
+ 'qemu-io none0 "reopen -o backing.detect-zeroes=on"' } }
1091
{"return": ""}
1092
1093
*** Stream and then change an option on the backing file
1094
1095
{ 'execute': 'qmp_capabilities' }
1096
{"return": {}}
1097
-{ 'execute': 'block-stream', 'arguments': { 'device': 'none0', 'base': 'TEST_DIR/t.IMGFMT.base' } }
1098
+{ 'execute': 'block-stream', 'arguments': { 'device': 'none0',
1099
+ 'base': 'TEST_DIR/t.IMGFMT.base' } }
1100
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "created", "id": "none0"}}
1101
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "running", "id": "none0"}}
1102
{"return": {}}
1103
-{ 'execute': 'human-monitor-command', 'arguments': { 'command-line': 'qemu-io none0 "reopen -o backing.detect-zeroes=on"' } }
1104
+{ 'execute': 'human-monitor-command',
1105
+ 'arguments': { 'command-line':
1106
+ 'qemu-io none0 "reopen -o backing.detect-zeroes=on"' } }
1107
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "waiting", "id": "none0"}}
1108
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "pending", "id": "none0"}}
1109
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "BLOCK_JOB_COMPLETED", "data": {"device": "none0", "len": 1048576, "offset": 1048576, "speed": 0, "type": "stream"}}
1110
@@ -XXX,XX +XXX,XX @@ Formatting 'TEST_DIR/t.IMGFMT.int', fmt=IMGFMT size=1048576 backing_file=TEST_DI
1111
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=1048576 backing_file=TEST_DIR/t.IMGFMT.int backing_fmt=IMGFMT
1112
{ 'execute': 'qmp_capabilities' }
1113
{"return": {}}
1114
-{ 'execute': 'block-commit', 'arguments': { 'device': 'none0', 'top': 'TEST_DIR/t.IMGFMT.int' } }
1115
+{ 'execute': 'block-commit', 'arguments': { 'device': 'none0',
1116
+ 'top': 'TEST_DIR/t.IMGFMT.int' } }
1117
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "created", "id": "none0"}}
1118
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "running", "id": "none0"}}
1119
{"return": {}}
1120
-{ 'execute': 'human-monitor-command', 'arguments': { 'command-line': 'qemu-io none0 "reopen -o backing.detect-zeroes=on"' } }
1121
+{ 'execute': 'human-monitor-command',
1122
+ 'arguments': { 'command-line':
1123
+ 'qemu-io none0 "reopen -o backing.detect-zeroes=on"' } }
1124
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "waiting", "id": "none0"}}
1125
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "pending", "id": "none0"}}
1126
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "BLOCK_JOB_COMPLETED", "data": {"device": "none0", "len": 1048576, "offset": 1048576, "speed": 0, "type": "commit"}}
1127
diff --git a/tests/qemu-iotests/173.out b/tests/qemu-iotests/173.out
1128
index XXXXXXX..XXXXXXX 100644
1129
--- a/tests/qemu-iotests/173.out
1130
+++ b/tests/qemu-iotests/173.out
1131
@@ -XXX,XX +XXX,XX @@ Formatting 'TEST_DIR/image.snp1', fmt=IMGFMT size=104857600
1132
1133
{ 'execute': 'qmp_capabilities' }
1134
{"return": {}}
1135
-{ 'arguments': { 'device': 'disk2', 'format': 'IMGFMT', 'mode': 'existing', 'snapshot-file': 'TEST_DIR/image.snp1', 'snapshot-node-name': 'snp1' }, 'execute': 'blockdev-snapshot-sync' }
1136
+{ 'arguments': {
1137
+ 'device': 'disk2',
1138
+ 'format': 'IMGFMT',
1139
+ 'mode': 'existing',
1140
+ 'snapshot-file': 'TEST_DIR/image.snp1',
1141
+ 'snapshot-node-name': 'snp1'
1142
+ },
1143
+ 'execute': 'blockdev-snapshot-sync'
1144
+ }
1145
{"return": {}}
1146
-{ 'arguments': { 'backing-file': 'image.base', 'device': 'disk2', 'image-node-name': 'snp1' }, 'execute': 'change-backing-file' }
1147
+{ 'arguments': {
1148
+ 'backing-file': 'image.base',
1149
+ 'device': 'disk2',
1150
+ 'image-node-name': 'snp1'
1151
+ },
1152
+ 'execute': 'change-backing-file'
1153
+ }
1154
{"return": {}}
1155
-{ 'arguments': { 'base': 'TEST_DIR/image.base', 'device': 'disk2' }, 'execute': 'block-stream' }
1156
+{ 'arguments': {
1157
+ 'base': 'TEST_DIR/image.base',
1158
+ 'device': 'disk2'
1159
+ },
1160
+ 'execute': 'block-stream'
1161
+ }
1162
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "created", "id": "disk2"}}
1163
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "running", "id": "disk2"}}
1164
{"return": {}}
1165
diff --git a/tests/qemu-iotests/182.out b/tests/qemu-iotests/182.out
1166
index XXXXXXX..XXXXXXX 100644
1167
--- a/tests/qemu-iotests/182.out
1168
+++ b/tests/qemu-iotests/182.out
1169
@@ -XXX,XX +XXX,XX @@ Is another process using the image [TEST_DIR/t.qcow2]?
1170
1171
{'execute': 'qmp_capabilities'}
1172
{"return": {}}
1173
-{'execute': 'blockdev-add', 'arguments': { 'node-name': 'node0', 'driver': 'file', 'filename': 'TEST_DIR/t.IMGFMT', 'locking': 'on' } }
1174
-{"return": {}}
1175
-{'execute': 'blockdev-snapshot-sync', 'arguments': { 'node-name': 'node0', 'snapshot-file': 'TEST_DIR/t.IMGFMT.overlay', 'snapshot-node-name': 'node1' } }
1176
+{'execute': 'blockdev-add',
1177
+ 'arguments': {
1178
+ 'node-name': 'node0',
1179
+ 'driver': 'file',
1180
+ 'filename': 'TEST_DIR/t.IMGFMT',
1181
+ 'locking': 'on'
1182
+ } }
1183
+{"return": {}}
1184
+{'execute': 'blockdev-snapshot-sync',
1185
+ 'arguments': {
1186
+ 'node-name': 'node0',
1187
+ 'snapshot-file': 'TEST_DIR/t.IMGFMT.overlay',
1188
+ 'snapshot-node-name': 'node1'
1189
+ } }
1190
Formatting 'TEST_DIR/t.qcow2.overlay', fmt=qcow2 cluster_size=65536 extended_l2=off compression_type=zlib size=197120 backing_file=TEST_DIR/t.qcow2 backing_fmt=file lazy_refcounts=off refcount_bits=16
1191
{"return": {}}
1192
-{'execute': 'blockdev-add', 'arguments': { 'node-name': 'node1', 'driver': 'file', 'filename': 'TEST_DIR/t.IMGFMT', 'locking': 'on' } }
1193
-{"return": {}}
1194
-{'execute': 'nbd-server-start', 'arguments': { 'addr': { 'type': 'unix', 'data': { 'path': 'SOCK_DIR/nbd.socket' } } } }
1195
-{"return": {}}
1196
-{'execute': 'nbd-server-add', 'arguments': { 'device': 'node1' } }
1197
+{'execute': 'blockdev-add',
1198
+ 'arguments': {
1199
+ 'node-name': 'node1',
1200
+ 'driver': 'file',
1201
+ 'filename': 'TEST_DIR/t.IMGFMT',
1202
+ 'locking': 'on'
1203
+ } }
1204
+{"return": {}}
1205
+{'execute': 'nbd-server-start',
1206
+ 'arguments': {
1207
+ 'addr': {
1208
+ 'type': 'unix',
1209
+ 'data': {
1210
+ 'path': 'SOCK_DIR/nbd.socket'
1211
+ } } } }
1212
+{"return": {}}
1213
+{'execute': 'nbd-server-add',
1214
+ 'arguments': {
1215
+ 'device': 'node1'
1216
+ } }
1217
{"return": {}}
1218
1219
=== Testing failure to loosen restrictions ===
1220
diff --git a/tests/qemu-iotests/183.out b/tests/qemu-iotests/183.out
1221
index XXXXXXX..XXXXXXX 100644
1222
--- a/tests/qemu-iotests/183.out
1223
+++ b/tests/qemu-iotests/183.out
1224
@@ -XXX,XX +XXX,XX @@ Formatting 'TEST_DIR/t.IMGFMT.dest', fmt=IMGFMT size=67108864
1225
1226
=== Write something on the source ===
1227
1228
-{ 'execute': 'human-monitor-command', 'arguments': { 'command-line': 'qemu-io disk "write -P 0x55 0 64k"' } }
1229
+{ 'execute': 'human-monitor-command',
1230
+ 'arguments': { 'command-line':
1231
+ 'qemu-io disk "write -P 0x55 0 64k"' } }
1232
wrote 65536/65536 bytes at offset 0
1233
64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
1234
{"return": ""}
1235
-{ 'execute': 'human-monitor-command', 'arguments': { 'command-line': 'qemu-io disk "read -P 0x55 0 64k"' } }
1236
+{ 'execute': 'human-monitor-command',
1237
+ 'arguments': { 'command-line':
1238
+ 'qemu-io disk "read -P 0x55 0 64k"' } }
1239
read 65536/65536 bytes at offset 0
1240
64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
1241
{"return": ""}
1242
1243
=== Do block migration to destination ===
1244
1245
-{ 'execute': 'migrate', 'arguments': { 'uri': 'unix:SOCK_DIR/migrate', 'blk': true } }
1246
+{ 'execute': 'migrate',
1247
+ 'arguments': { 'uri': 'unix:SOCK_DIR/migrate', 'blk': true } }
1248
{"return": {}}
1249
{ 'execute': 'query-status' }
1250
{"return": {"status": "postmigrate", "singlestep": false, "running": false}}
1251
@@ -XXX,XX +XXX,XX @@ read 65536/65536 bytes at offset 0
1252
{ 'execute': 'query-status' }
1253
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "RESUME"}
1254
{"return": {"status": "running", "singlestep": false, "running": true}}
1255
-{ 'execute': 'human-monitor-command', 'arguments': { 'command-line': 'qemu-io disk "read -P 0x55 0 64k"' } }
1256
+{ 'execute': 'human-monitor-command',
1257
+ 'arguments': { 'command-line':
1258
+ 'qemu-io disk "read -P 0x55 0 64k"' } }
1259
read 65536/65536 bytes at offset 0
1260
64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
1261
{"return": ""}
1262
-{ 'execute': 'human-monitor-command', 'arguments': { 'command-line': 'qemu-io disk "write -P 0x66 1M 64k"' } }
1263
+{ 'execute': 'human-monitor-command',
1264
+ 'arguments': { 'command-line':
1265
+ 'qemu-io disk "write -P 0x66 1M 64k"' } }
1266
wrote 65536/65536 bytes at offset 1048576
1267
64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
1268
{"return": ""}
1269
diff --git a/tests/qemu-iotests/185.out b/tests/qemu-iotests/185.out
1270
index XXXXXXX..XXXXXXX 100644
1271
--- a/tests/qemu-iotests/185.out
1272
+++ b/tests/qemu-iotests/185.out
1273
@@ -XXX,XX +XXX,XX @@ Formatting 'TEST_DIR/t.IMGFMT.base', fmt=IMGFMT size=67108864
1274
1275
=== Creating backing chain ===
1276
1277
-{ 'execute': 'blockdev-snapshot-sync', 'arguments': { 'device': 'disk', 'snapshot-file': 'TEST_DIR/t.IMGFMT.mid', 'format': 'IMGFMT', 'mode': 'absolute-paths' } }
1278
+{ 'execute': 'blockdev-snapshot-sync',
1279
+ 'arguments': { 'device': 'disk',
1280
+ 'snapshot-file': 'TEST_DIR/t.IMGFMT.mid',
1281
+ 'format': 'IMGFMT',
1282
+ 'mode': 'absolute-paths' } }
1283
Formatting 'TEST_DIR/t.qcow2.mid', fmt=qcow2 cluster_size=65536 extended_l2=off compression_type=zlib size=67108864 backing_file=TEST_DIR/t.qcow2.base backing_fmt=qcow2 lazy_refcounts=off refcount_bits=16
1284
{"return": {}}
1285
-{ 'execute': 'human-monitor-command', 'arguments': { 'command-line': 'qemu-io disk "write 0 4M"' } }
1286
+{ 'execute': 'human-monitor-command',
1287
+ 'arguments': { 'command-line':
1288
+ 'qemu-io disk "write 0 4M"' } }
1289
wrote 4194304/4194304 bytes at offset 0
1290
4 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
1291
{"return": ""}
1292
-{ 'execute': 'blockdev-snapshot-sync', 'arguments': { 'device': 'disk', 'snapshot-file': 'TEST_DIR/t.IMGFMT', 'format': 'IMGFMT', 'mode': 'absolute-paths' } }
1293
+{ 'execute': 'blockdev-snapshot-sync',
1294
+ 'arguments': { 'device': 'disk',
1295
+ 'snapshot-file': 'TEST_DIR/t.IMGFMT',
1296
+ 'format': 'IMGFMT',
1297
+ 'mode': 'absolute-paths' } }
1298
Formatting 'TEST_DIR/t.qcow2', fmt=qcow2 cluster_size=65536 extended_l2=off compression_type=zlib size=67108864 backing_file=TEST_DIR/t.qcow2.mid backing_fmt=qcow2 lazy_refcounts=off refcount_bits=16
1299
{"return": {}}
1300
1301
=== Start commit job and exit qemu ===
1302
1303
-{ 'execute': 'block-commit', 'arguments': { 'device': 'disk', 'base':'TEST_DIR/t.IMGFMT.base', 'top': 'TEST_DIR/t.IMGFMT.mid', 'speed': 65536 } }
1304
+{ 'execute': 'block-commit',
1305
+ 'arguments': { 'device': 'disk',
1306
+ 'base':'TEST_DIR/t.IMGFMT.base',
1307
+ 'top': 'TEST_DIR/t.IMGFMT.mid',
1308
+ 'speed': 65536 } }
1309
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "created", "id": "disk"}}
1310
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "running", "id": "disk"}}
1311
{"return": {}}
1312
@@ -XXX,XX +XXX,XX @@ Formatting 'TEST_DIR/t.qcow2', fmt=qcow2 cluster_size=65536 extended_l2=off comp
1313
1314
{ 'execute': 'qmp_capabilities' }
1315
{"return": {}}
1316
-{ 'execute': 'block-commit', 'arguments': { 'device': 'disk', 'base':'TEST_DIR/t.IMGFMT.base', 'speed': 65536 } }
1317
+{ 'execute': 'block-commit',
1318
+ 'arguments': { 'device': 'disk',
1319
+ 'base':'TEST_DIR/t.IMGFMT.base',
1320
+ 'speed': 65536 } }
1321
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "created", "id": "disk"}}
1322
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "running", "id": "disk"}}
1323
{"return": {}}
1324
@@ -XXX,XX +XXX,XX @@ Formatting 'TEST_DIR/t.qcow2', fmt=qcow2 cluster_size=65536 extended_l2=off comp
1325
1326
{ 'execute': 'qmp_capabilities' }
1327
{"return": {}}
1328
-{ 'execute': 'drive-mirror', 'arguments': { 'device': 'disk', 'target': 'TEST_DIR/t.IMGFMT.copy', 'format': 'IMGFMT', 'sync': 'full', 'speed': 65536 } }
1329
+{ 'execute': 'drive-mirror',
1330
+ 'arguments': { 'device': 'disk',
1331
+ 'target': 'TEST_DIR/t.IMGFMT.copy',
1332
+ 'format': 'IMGFMT',
1333
+ 'sync': 'full',
1334
+ 'speed': 65536 } }
1335
Formatting 'TEST_DIR/t.qcow2.copy', fmt=qcow2 cluster_size=65536 extended_l2=off compression_type=zlib size=67108864 lazy_refcounts=off refcount_bits=16
1336
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "created", "id": "disk"}}
1337
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "running", "id": "disk"}}
1338
@@ -XXX,XX +XXX,XX @@ Formatting 'TEST_DIR/t.qcow2.copy', fmt=qcow2 cluster_size=65536 extended_l2=off
1339
1340
{ 'execute': 'qmp_capabilities' }
1341
{"return": {}}
1342
-{ 'execute': 'drive-backup', 'arguments': { 'device': 'disk', 'target': 'TEST_DIR/t.IMGFMT.copy', 'format': 'IMGFMT', 'sync': 'full', 'speed': 65536 } }
1343
+{ 'execute': 'drive-backup',
1344
+ 'arguments': { 'device': 'disk',
1345
+ 'target': 'TEST_DIR/t.IMGFMT.copy',
1346
+ 'format': 'IMGFMT',
1347
+ 'sync': 'full',
1348
+ 'speed': 65536 } }
1349
Formatting 'TEST_DIR/t.qcow2.copy', fmt=qcow2 cluster_size=65536 extended_l2=off compression_type=zlib size=67108864 lazy_refcounts=off refcount_bits=16
1350
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "created", "id": "disk"}}
1351
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "running", "id": "disk"}}
1352
@@ -XXX,XX +XXX,XX @@ Formatting 'TEST_DIR/t.qcow2.copy', fmt=qcow2 cluster_size=65536 extended_l2=off
1353
1354
{ 'execute': 'qmp_capabilities' }
1355
{"return": {}}
1356
-{ 'execute': 'block-stream', 'arguments': { 'device': 'disk', 'speed': 65536 } }
1357
+{ 'execute': 'block-stream',
1358
+ 'arguments': { 'device': 'disk',
1359
+ 'speed': 65536 } }
1360
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "created", "id": "disk"}}
1361
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "running", "id": "disk"}}
1362
{"return": {}}
1363
diff --git a/tests/qemu-iotests/191.out b/tests/qemu-iotests/191.out
1364
index XXXXXXX..XXXXXXX 100644
1365
--- a/tests/qemu-iotests/191.out
1366
+++ b/tests/qemu-iotests/191.out
1367
@@ -XXX,XX +XXX,XX @@ wrote 65536/65536 bytes at offset 1048576
1368
1369
=== Perform commit job ===
1370
1371
-{ 'execute': 'block-commit', 'arguments': { 'job-id': 'commit0', 'device': 'top', 'base':'TEST_DIR/t.IMGFMT.base', 'top': 'TEST_DIR/t.IMGFMT.mid' } }
1372
+{ 'execute': 'block-commit',
1373
+ 'arguments': { 'job-id': 'commit0',
1374
+ 'device': 'top',
1375
+ 'base':'TEST_DIR/t.IMGFMT.base',
1376
+ 'top': 'TEST_DIR/t.IMGFMT.mid' } }
1377
{
1378
"timestamp": {
1379
"seconds": TIMESTAMP,
1380
@@ -XXX,XX +XXX,XX @@ wrote 65536/65536 bytes at offset 1048576
1381
1382
=== Perform commit job ===
1383
1384
-{ 'execute': 'block-commit', 'arguments': { 'job-id': 'commit0', 'device': 'top', 'base':'TEST_DIR/t.IMGFMT.base', 'top': 'TEST_DIR/t.IMGFMT.mid' } }
1385
+{ 'execute': 'block-commit',
1386
+ 'arguments': { 'job-id': 'commit0',
1387
+ 'device': 'top',
1388
+ 'base':'TEST_DIR/t.IMGFMT.base',
1389
+ 'top': 'TEST_DIR/t.IMGFMT.mid' } }
1390
{
1391
"timestamp": {
1392
"seconds": TIMESTAMP,
1393
diff --git a/tests/qemu-iotests/223.out b/tests/qemu-iotests/223.out
1394
index XXXXXXX..XXXXXXX 100644
1395
--- a/tests/qemu-iotests/223.out
1396
+++ b/tests/qemu-iotests/223.out
1397
@@ -XXX,XX +XXX,XX @@ wrote 2097152/2097152 bytes at offset 2097152
1398
1399
{"execute":"qmp_capabilities"}
1400
{"return": {}}
1401
-{"execute":"blockdev-add", "arguments":{"driver":"IMGFMT", "node-name":"n", "file":{"driver":"file", "filename":"TEST_DIR/t.IMGFMT"}}}
1402
+{"execute":"blockdev-add",
1403
+ "arguments":{"driver":"IMGFMT", "node-name":"n",
1404
+ "file":{"driver":"file", "filename":"TEST_DIR/t.IMGFMT"}}}
1405
{"return": {}}
1406
-{"execute":"block-dirty-bitmap-disable", "arguments":{"node":"n", "name":"b"}}
1407
+{"execute":"block-dirty-bitmap-disable",
1408
+ "arguments":{"node":"n", "name":"b"}}
1409
{"return": {}}
1410
1411
=== Set up NBD with normal access ===
1412
1413
-{"execute":"nbd-server-add", "arguments":{"device":"n"}}
1414
+{"execute":"nbd-server-add",
1415
+ "arguments":{"device":"n"}}
1416
{"error": {"class": "GenericError", "desc": "NBD server not running"}}
1417
-{"execute":"nbd-server-start", "arguments":{"addr":{"type":"unix", "data":{"path":"SOCK_DIR/nbd"}}}}
1418
+{"execute":"nbd-server-start",
1419
+ "arguments":{"addr":{"type":"unix",
1420
+ "data":{"path":"SOCK_DIR/nbd"}}}}
1421
{"return": {}}
1422
-{"execute":"nbd-server-start", "arguments":{"addr":{"type":"unix", "data":{"path":"SOCK_DIR/nbd1"}}}}
1423
+{"execute":"nbd-server-start",
1424
+ "arguments":{"addr":{"type":"unix",
1425
+ "data":{"path":"SOCK_DIR/nbd1"}}}}
1426
{"error": {"class": "GenericError", "desc": "NBD server already running"}}
1427
exports available: 0
1428
-{"execute":"nbd-server-add", "arguments":{"device":"n", "bitmap":"b"}}
1429
+{"execute":"nbd-server-add",
1430
+ "arguments":{"device":"n", "bitmap":"b"}}
1431
{"return": {}}
1432
-{"execute":"nbd-server-add", "arguments":{"device":"nosuch"}}
1433
+{"execute":"nbd-server-add",
1434
+ "arguments":{"device":"nosuch"}}
1435
{"error": {"class": "GenericError", "desc": "Cannot find device=nosuch nor node_name=nosuch"}}
1436
-{"execute":"nbd-server-add", "arguments":{"device":"n"}}
1437
+{"execute":"nbd-server-add",
1438
+ "arguments":{"device":"n"}}
1439
{"error": {"class": "GenericError", "desc": "Block export id 'n' is already in use"}}
1440
-{"execute":"nbd-server-add", "arguments":{"device":"n", "name":"n2", "bitmap":"b2"}}
1441
+{"execute":"nbd-server-add",
1442
+ "arguments":{"device":"n", "name":"n2",
1443
+ "bitmap":"b2"}}
1444
{"error": {"class": "GenericError", "desc": "Enabled bitmap 'b2' incompatible with readonly export"}}
1445
-{"execute":"nbd-server-add", "arguments":{"device":"n", "name":"n2", "bitmap":"b3"}}
1446
+{"execute":"nbd-server-add",
1447
+ "arguments":{"device":"n", "name":"n2",
1448
+ "bitmap":"b3"}}
1449
{"error": {"class": "GenericError", "desc": "Bitmap 'b3' is not found"}}
1450
-{"execute":"nbd-server-add", "arguments":{"device":"n", "name":"n2", "writable":true, "description":"some text", "bitmap":"b2"}}
1451
+{"execute":"nbd-server-add",
1452
+ "arguments":{"device":"n", "name":"n2", "writable":true,
1453
+ "description":"some text", "bitmap":"b2"}}
1454
{"return": {}}
1455
exports available: 2
1456
export: 'n'
1457
@@ -XXX,XX +XXX,XX @@ read 2097152/2097152 bytes at offset 2097152
1458
1459
=== End qemu NBD server ===
1460
1461
-{"execute":"nbd-server-remove", "arguments":{"name":"n"}}
1462
+{"execute":"nbd-server-remove",
1463
+ "arguments":{"name":"n"}}
1464
{"return": {}}
1465
-{"execute":"nbd-server-remove", "arguments":{"name":"n2"}}
1466
+{"execute":"nbd-server-remove",
1467
+ "arguments":{"name":"n2"}}
1468
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "BLOCK_EXPORT_DELETED", "data": {"id": "n"}}
1469
{"return": {}}
1470
-{"execute":"nbd-server-remove", "arguments":{"name":"n2"}}
1471
+{"execute":"nbd-server-remove",
1472
+ "arguments":{"name":"n2"}}
1473
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "BLOCK_EXPORT_DELETED", "data": {"id": "n2"}}
1474
{"error": {"class": "GenericError", "desc": "Export 'n2' is not found"}}
1475
{"execute":"nbd-server-stop"}
1476
@@ -XXX,XX +XXX,XX @@ read 2097152/2097152 bytes at offset 2097152
1477
1478
=== Set up NBD with iothread access ===
1479
1480
-{"execute":"x-blockdev-set-iothread", "arguments":{"node-name":"n", "iothread":"io0"}}
1481
+{"execute":"x-blockdev-set-iothread",
1482
+ "arguments":{"node-name":"n", "iothread":"io0"}}
1483
{"return": {}}
1484
-{"execute":"nbd-server-add", "arguments":{"device":"n"}}
1485
+{"execute":"nbd-server-add",
1486
+ "arguments":{"device":"n"}}
1487
{"error": {"class": "GenericError", "desc": "NBD server not running"}}
1488
-{"execute":"nbd-server-start", "arguments":{"addr":{"type":"unix", "data":{"path":"SOCK_DIR/nbd"}}}}
1489
+{"execute":"nbd-server-start",
1490
+ "arguments":{"addr":{"type":"unix",
1491
+ "data":{"path":"SOCK_DIR/nbd"}}}}
1492
{"return": {}}
1493
-{"execute":"nbd-server-start", "arguments":{"addr":{"type":"unix", "data":{"path":"SOCK_DIR/nbd1"}}}}
1494
+{"execute":"nbd-server-start",
1495
+ "arguments":{"addr":{"type":"unix",
1496
+ "data":{"path":"SOCK_DIR/nbd1"}}}}
1497
{"error": {"class": "GenericError", "desc": "NBD server already running"}}
1498
exports available: 0
1499
-{"execute":"nbd-server-add", "arguments":{"device":"n", "bitmap":"b"}}
1500
+{"execute":"nbd-server-add",
1501
+ "arguments":{"device":"n", "bitmap":"b"}}
1502
{"return": {}}
1503
-{"execute":"nbd-server-add", "arguments":{"device":"nosuch"}}
1504
+{"execute":"nbd-server-add",
1505
+ "arguments":{"device":"nosuch"}}
1506
{"error": {"class": "GenericError", "desc": "Cannot find device=nosuch nor node_name=nosuch"}}
1507
-{"execute":"nbd-server-add", "arguments":{"device":"n"}}
1508
+{"execute":"nbd-server-add",
1509
+ "arguments":{"device":"n"}}
1510
{"error": {"class": "GenericError", "desc": "Block export id 'n' is already in use"}}
1511
-{"execute":"nbd-server-add", "arguments":{"device":"n", "name":"n2", "bitmap":"b2"}}
1512
+{"execute":"nbd-server-add",
1513
+ "arguments":{"device":"n", "name":"n2",
1514
+ "bitmap":"b2"}}
1515
{"error": {"class": "GenericError", "desc": "Enabled bitmap 'b2' incompatible with readonly export"}}
1516
-{"execute":"nbd-server-add", "arguments":{"device":"n", "name":"n2", "bitmap":"b3"}}
1517
+{"execute":"nbd-server-add",
1518
+ "arguments":{"device":"n", "name":"n2",
1519
+ "bitmap":"b3"}}
1520
{"error": {"class": "GenericError", "desc": "Bitmap 'b3' is not found"}}
1521
-{"execute":"nbd-server-add", "arguments":{"device":"n", "name":"n2", "writable":true, "description":"some text", "bitmap":"b2"}}
1522
+{"execute":"nbd-server-add",
1523
+ "arguments":{"device":"n", "name":"n2", "writable":true,
1524
+ "description":"some text", "bitmap":"b2"}}
1525
{"return": {}}
1526
exports available: 2
1527
export: 'n'
1528
@@ -XXX,XX +XXX,XX @@ read 2097152/2097152 bytes at offset 2097152
1529
1530
=== End qemu NBD server ===
1531
1532
-{"execute":"nbd-server-remove", "arguments":{"name":"n"}}
1533
+{"execute":"nbd-server-remove",
1534
+ "arguments":{"name":"n"}}
1535
{"return": {}}
1536
-{"execute":"nbd-server-remove", "arguments":{"name":"n2"}}
1537
+{"execute":"nbd-server-remove",
1538
+ "arguments":{"name":"n2"}}
1539
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "BLOCK_EXPORT_DELETED", "data": {"id": "n"}}
1540
{"return": {}}
1541
-{"execute":"nbd-server-remove", "arguments":{"name":"n2"}}
1542
+{"execute":"nbd-server-remove",
1543
+ "arguments":{"name":"n2"}}
1544
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "BLOCK_EXPORT_DELETED", "data": {"id": "n2"}}
1545
{"error": {"class": "GenericError", "desc": "Export 'n2' is not found"}}
1546
{"execute":"nbd-server-stop"}
1547
diff --git a/tests/qemu-iotests/229.out b/tests/qemu-iotests/229.out
1548
index XXXXXXX..XXXXXXX 100644
1549
--- a/tests/qemu-iotests/229.out
1550
+++ b/tests/qemu-iotests/229.out
1551
@@ -XXX,XX +XXX,XX @@ wrote 2097152/2097152 bytes at offset 0
1552
1553
=== Starting drive-mirror, causing error & stop ===
1554
1555
-{'execute': 'drive-mirror', 'arguments': {'device': 'testdisk', 'format': 'IMGFMT', 'target': 'blkdebug:TEST_DIR/blkdebug.conf:TEST_DIR/t.IMGFMT.dest', 'sync': 'full', 'mode': 'existing', 'on-source-error': 'stop', 'on-target-error': 'stop' }}
1556
+{'execute': 'drive-mirror',
1557
+ 'arguments': {'device': 'testdisk',
1558
+ 'format': 'IMGFMT',
1559
+ 'target': 'blkdebug:TEST_DIR/blkdebug.conf:TEST_DIR/t.IMGFMT.dest',
1560
+ 'sync': 'full',
1561
+ 'mode': 'existing',
1562
+ 'on-source-error': 'stop',
1563
+ 'on-target-error': 'stop' }}
1564
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "created", "id": "testdisk"}}
1565
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "running", "id": "testdisk"}}
1566
{"return": {}}
1567
@@ -XXX,XX +XXX,XX @@ wrote 2097152/2097152 bytes at offset 0
1568
1569
=== Force cancel job paused in error state ===
1570
1571
-{'execute': 'block-job-cancel', 'arguments': { 'device': 'testdisk', 'force': true}}
1572
+{'execute': 'block-job-cancel',
1573
+ 'arguments': { 'device': 'testdisk',
1574
+ 'force': true}}
1575
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "running", "id": "testdisk"}}
1576
{"return": {}}
1577
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "aborting", "id": "testdisk"}}
1578
diff --git a/tests/qemu-iotests/249.out b/tests/qemu-iotests/249.out
1579
index XXXXXXX..XXXXXXX 100644
1580
--- a/tests/qemu-iotests/249.out
1581
+++ b/tests/qemu-iotests/249.out
1582
@@ -XXX,XX +XXX,XX @@ Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=1048576 backing_file=TEST_DIR/t.
1583
1584
=== Send a write command to a drive opened in read-only mode (1)
1585
1586
-{ 'execute': 'human-monitor-command', 'arguments': {'command-line': 'qemu-io none0 "aio_write 0 2k"'}}
1587
+{ 'execute': 'human-monitor-command',
1588
+ 'arguments': {'command-line': 'qemu-io none0 "aio_write 0 2k"'}}
1589
{"return": "Block node is read-onlyrn"}
1590
1591
=== Run block-commit on base using an invalid filter node name
1592
1593
-{ 'execute': 'block-commit', 'arguments': {'job-id': 'job0', 'device': 'none1', 'top-node': 'int', 'filter-node-name': '1234'}}
1594
+{ 'execute': 'block-commit',
1595
+ 'arguments': {'job-id': 'job0', 'device': 'none1', 'top-node': 'int',
1596
+ 'filter-node-name': '1234'}}
1597
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "created", "id": "job0"}}
1598
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "null", "id": "job0"}}
1599
{"error": {"class": "GenericError", "desc": "Invalid node name"}}
1600
1601
=== Send a write command to a drive opened in read-only mode (2)
1602
1603
-{ 'execute': 'human-monitor-command', 'arguments': {'command-line': 'qemu-io none0 "aio_write 0 2k"'}}
1604
+{ 'execute': 'human-monitor-command',
1605
+ 'arguments': {'command-line': 'qemu-io none0 "aio_write 0 2k"'}}
1606
{"return": "Block node is read-onlyrn"}
1607
1608
=== Run block-commit on base using the default filter node name
1609
1610
-{ 'execute': 'block-commit', 'arguments': {'job-id': 'job0', 'device': 'none1', 'top-node': 'int'}}
1611
+{ 'execute': 'block-commit',
1612
+ 'arguments': {'job-id': 'job0', 'device': 'none1', 'top-node': 'int'}}
1613
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "created", "id": "job0"}}
1614
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "running", "id": "job0"}}
1615
{"return": {}}
1616
@@ -XXX,XX +XXX,XX @@ Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=1048576 backing_file=TEST_DIR/t.
1617
1618
=== Send a write command to a drive opened in read-only mode (3)
1619
1620
-{ 'execute': 'human-monitor-command', 'arguments': {'command-line': 'qemu-io none0 "aio_write 0 2k"'}}
1621
+{ 'execute': 'human-monitor-command',
1622
+ 'arguments': {'command-line': 'qemu-io none0 "aio_write 0 2k"'}}
1623
{"return": "Block node is read-onlyrn"}
1624
*** done
1625
diff --git a/tests/qemu-iotests/308.out b/tests/qemu-iotests/308.out
1626
index XXXXXXX..XXXXXXX 100644
1627
--- a/tests/qemu-iotests/308.out
1628
+++ b/tests/qemu-iotests/308.out
1629
@@ -XXX,XX +XXX,XX @@ wrote 67108864/67108864 bytes at offset 0
1630
64 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
1631
{'execute': 'qmp_capabilities'}
1632
{"return": {}}
1633
-{'execute': 'blockdev-add', 'arguments': { 'driver': 'file', 'node-name': 'node-protocol', 'filename': 'TEST_DIR/t.IMGFMT' } }
1634
+{'execute': 'blockdev-add',
1635
+ 'arguments': {
1636
+ 'driver': 'file',
1637
+ 'node-name': 'node-protocol',
1638
+ 'filename': 'TEST_DIR/t.IMGFMT'
1639
+ } }
1640
{"return": {}}
1641
-{'execute': 'blockdev-add', 'arguments': { 'driver': 'IMGFMT', 'node-name': 'node-format', 'file': 'node-protocol' } }
1642
+{'execute': 'blockdev-add',
1643
+ 'arguments': {
1644
+ 'driver': 'IMGFMT',
1645
+ 'node-name': 'node-format',
1646
+ 'file': 'node-protocol'
1647
+ } }
1648
{"return": {}}
1649
1650
=== Mountpoint not present ===
1651
-{'execute': 'block-export-add', 'arguments': { 'type': 'fuse', 'id': 'export-err', 'node-name': 'node-format', 'mountpoint': 'TEST_DIR/t.IMGFMT.fuse' } }
1652
+{'execute': 'block-export-add',
1653
+ 'arguments': {
1654
+ 'type': 'fuse',
1655
+ 'id': 'export-err',
1656
+ 'node-name': 'node-format',
1657
+ 'mountpoint': 'TEST_DIR/t.IMGFMT.fuse'
1658
+ } }
1659
{"error": {"class": "GenericError", "desc": "Failed to stat 'TEST_DIR/t.IMGFMT.fuse': No such file or directory"}}
1660
1661
=== Mountpoint is a directory ===
1662
-{'execute': 'block-export-add', 'arguments': { 'type': 'fuse', 'id': 'export-err', 'node-name': 'node-format', 'mountpoint': 'TEST_DIR/t.IMGFMT.fuse' } }
1663
+{'execute': 'block-export-add',
1664
+ 'arguments': {
1665
+ 'type': 'fuse',
1666
+ 'id': 'export-err',
1667
+ 'node-name': 'node-format',
1668
+ 'mountpoint': 'TEST_DIR/t.IMGFMT.fuse'
1669
+ } }
1670
{"error": {"class": "GenericError", "desc": "'TEST_DIR/t.IMGFMT.fuse' is not a regular file"}}
1671
1672
=== Mountpoint is a regular file ===
1673
-{'execute': 'block-export-add', 'arguments': { 'type': 'fuse', 'id': 'export-mp', 'node-name': 'node-format', 'mountpoint': 'TEST_DIR/t.IMGFMT.fuse' } }
1674
+{'execute': 'block-export-add',
1675
+ 'arguments': {
1676
+ 'type': 'fuse',
1677
+ 'id': 'export-mp',
1678
+ 'node-name': 'node-format',
1679
+ 'mountpoint': 'TEST_DIR/t.IMGFMT.fuse'
1680
+ } }
1681
{"return": {}}
1682
Images are identical.
1683
1684
=== Mount over existing file ===
1685
-{'execute': 'block-export-add', 'arguments': { 'type': 'fuse', 'id': 'export-img', 'node-name': 'node-format', 'mountpoint': 'TEST_DIR/t.IMGFMT' } }
1686
+{'execute': 'block-export-add',
1687
+ 'arguments': {
1688
+ 'type': 'fuse',
1689
+ 'id': 'export-img',
1690
+ 'node-name': 'node-format',
1691
+ 'mountpoint': 'TEST_DIR/t.IMGFMT'
1692
+ } }
1693
{"return": {}}
1694
Images are identical.
1695
1696
=== Double export ===
1697
-{'execute': 'block-export-add', 'arguments': { 'type': 'fuse', 'id': 'export-err', 'node-name': 'node-format', 'mountpoint': 'TEST_DIR/t.IMGFMT.fuse' } }
1698
+{'execute': 'block-export-add',
1699
+ 'arguments': {
1700
+ 'type': 'fuse',
1701
+ 'id': 'export-err',
1702
+ 'node-name': 'node-format',
1703
+ 'mountpoint': 'TEST_DIR/t.IMGFMT.fuse'
1704
+ } }
1705
{"error": {"class": "GenericError", "desc": "There already is a FUSE export on 'TEST_DIR/t.IMGFMT.fuse'"}}
1706
1707
=== Remove export ===
1708
virtual size: 64 MiB (67108864 bytes)
1709
-{'execute': 'block-export-del', 'arguments': { 'id': 'export-mp' } }
1710
+{'execute': 'block-export-del',
1711
+ 'arguments': {
1712
+ 'id': 'export-mp'
1713
+ } }
1714
{"return": {}}
1715
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "BLOCK_EXPORT_DELETED", "data": {"id": "export-mp"}}
1716
virtual size: 0 B (0 bytes)
1717
1718
=== Writable export ===
1719
-{'execute': 'block-export-add', 'arguments': { 'type': 'fuse', 'id': 'export-mp', 'node-name': 'node-format', 'mountpoint': 'TEST_DIR/t.IMGFMT.fuse', 'writable': true } }
1720
+{'execute': 'block-export-add',
1721
+ 'arguments': {
1722
+ 'type': 'fuse',
1723
+ 'id': 'export-mp',
1724
+ 'node-name': 'node-format',
1725
+ 'mountpoint': 'TEST_DIR/t.IMGFMT.fuse', 'writable': true
1726
+ } }
1727
{"return": {}}
1728
write failed: Permission denied
1729
wrote 65536/65536 bytes at offset 1048576
1730
@@ -XXX,XX +XXX,XX @@ wrote 65536/65536 bytes at offset 1048576
1731
64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
1732
1733
=== Resizing exports ===
1734
-{'execute': 'block-export-del', 'arguments': { 'id': 'export-mp' } }
1735
+{'execute': 'block-export-del',
1736
+ 'arguments': {
1737
+ 'id': 'export-mp'
1738
+ } }
1739
{"return": {}}
1740
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "BLOCK_EXPORT_DELETED", "data": {"id": "export-mp"}}
1741
-{'execute': 'block-export-del', 'arguments': { 'id': 'export-img' } }
1742
+{'execute': 'block-export-del',
1743
+ 'arguments': {
1744
+ 'id': 'export-img'
1745
+ } }
1746
{"return": {}}
1747
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "BLOCK_EXPORT_DELETED", "data": {"id": "export-img"}}
1748
-{'execute': 'blockdev-del', 'arguments': { 'node-name': 'node-format' } }
1749
+{'execute': 'blockdev-del',
1750
+ 'arguments': {
1751
+ 'node-name': 'node-format'
1752
+ } }
1753
{"return": {}}
1754
-{'execute': 'block-export-add', 'arguments': { 'type': 'fuse', 'id': 'export-mp', 'node-name': 'node-protocol', 'mountpoint': 'TEST_DIR/t.IMGFMT.fuse', 'writable': true } }
1755
+{'execute': 'block-export-add',
1756
+ 'arguments': {
1757
+ 'type': 'fuse',
1758
+ 'id': 'export-mp',
1759
+ 'node-name': 'node-protocol',
1760
+ 'mountpoint': 'TEST_DIR/t.IMGFMT.fuse', 'writable': true
1761
+ } }
1762
{"return": {}}
1763
1764
--- Try growing non-growable export ---
1765
@@ -XXX,XX +XXX,XX @@ OK: Post-truncate image size is as expected
1766
OK: Disk usage grew with fallocate
1767
1768
--- Try growing growable export ---
1769
-{'execute': 'block-export-del', 'arguments': { 'id': 'export-mp' } }
1770
+{'execute': 'block-export-del',
1771
+ 'arguments': {
1772
+ 'id': 'export-mp'
1773
+ } }
1774
{"return": {}}
1775
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "BLOCK_EXPORT_DELETED", "data": {"id": "export-mp"}}
1776
-{'execute': 'block-export-add', 'arguments': { 'type': 'fuse', 'id': 'export-mp', 'node-name': 'node-protocol', 'mountpoint': 'TEST_DIR/t.IMGFMT.fuse', 'writable': true, 'growable': true } }
1777
+{'execute': 'block-export-add',
1778
+ 'arguments': {
1779
+ 'type': 'fuse',
1780
+ 'id': 'export-mp',
1781
+ 'node-name': 'node-protocol',
1782
+ 'mountpoint': 'TEST_DIR/t.IMGFMT.fuse', 'writable': true, 'growable': true
1783
+ } }
1784
{"return": {}}
1785
65536+0 records in
1786
65536+0 records out
1787
diff --git a/tests/qemu-iotests/312.out b/tests/qemu-iotests/312.out
1788
index XXXXXXX..XXXXXXX 100644
1789
--- a/tests/qemu-iotests/312.out
1790
+++ b/tests/qemu-iotests/312.out
1791
@@ -XXX,XX +XXX,XX @@ read 65536/65536 bytes at offset 2424832
1792
1793
{ 'execute': 'qmp_capabilities' }
1794
{"return": {}}
1795
-{'execute': 'drive-mirror', 'arguments': {'device': 'virtio0', 'format': 'IMGFMT', 'target': 'TEST_DIR/t.IMGFMT.3', 'sync': 'full', 'mode': 'existing' }}
1796
+{'execute': 'drive-mirror',
1797
+ 'arguments': {'device': 'virtio0',
1798
+ 'format': 'IMGFMT',
1799
+ 'target': 'TEST_DIR/t.IMGFMT.3',
1800
+ 'sync': 'full',
1801
+ 'mode': 'existing' }}
1802
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "created", "id": "virtio0"}}
1803
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "running", "id": "virtio0"}}
1804
{"return": {}}
1805
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "ready", "id": "virtio0"}}
1806
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "BLOCK_JOB_READY", "data": {"device": "virtio0", "len": 10485760, "offset": 10485760, "speed": 0, "type": "mirror"}}
1807
-{ 'execute': 'block-job-complete', 'arguments': { 'device': 'virtio0' } }
1808
+{ 'execute': 'block-job-complete',
1809
+ 'arguments': { 'device': 'virtio0' } }
1810
{"return": {}}
1811
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "waiting", "id": "virtio0"}}
1812
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "JOB_STATUS_CHANGE", "data": {"status": "pending", "id": "virtio0"}}
1813
diff --git a/tests/qemu-iotests/common.qemu b/tests/qemu-iotests/common.qemu
1814
index XXXXXXX..XXXXXXX 100644
1815
--- a/tests/qemu-iotests/common.qemu
1816
+++ b/tests/qemu-iotests/common.qemu
1817
@@ -XXX,XX +XXX,XX @@ _send_qemu_cmd()
1818
count=${qemu_cmd_repeat}
1819
use_error="no"
1820
fi
1821
- # This array element extraction is done to accommodate pathnames with spaces
1822
- if [ -z "${success_or_failure}" ]; then
1823
- cmd=${@: 1:${#@}-1}
1824
- shift $(($# - 1))
1825
- else
1826
- cmd=${@: 1:${#@}-2}
1827
- shift $(($# - 2))
1828
- fi
1829
+
1830
+ cmd=$1
1831
+ shift
1832
1833
# Display QMP being sent, but not HMP (since HMP already echoes its
1834
# input back to output); decide based on leading '{'
123
--
1835
--
124
2.24.1
1836
2.29.2
125
1837
126
1838
diff view generated by jsdifflib