1
The following changes since commit bf159f0bdc7b8e7aa8342dedb3829ca744c1b612:
1
The following changes since commit cf7ca7d5b9faca13f1f8e3ea92cfb2f741eb0c0e:
2
2
3
Merge remote-tracking branch 'remotes/edgar/tags/edgar/xilinx-next-2021-01-27.for-upstream' into staging (2021-01-27 17:40:25 +0000)
3
Merge remote-tracking branch 'remotes/stefanha-gitlab/tags/tracing-pull-request' into staging (2021-02-01 16:28:00 +0000)
4
4
5
are available in the Git repository at:
5
are available in the Git repository at:
6
6
7
git://repo.or.cz/qemu/kevin.git tags/for-upstream
7
git://repo.or.cz/qemu/kevin.git tags/for-upstream
8
8
9
for you to fetch changes up to a44be0334beae3a9affb4a3a92cc6852993d7a84:
9
for you to fetch changes up to 26513a01741f51650f5dd716681995359794ba6f:
10
10
11
iotests: rename and move 169 and 199 tests (2021-01-27 20:53:14 +0100)
11
block: Fix VM size column width in bdrv_snapshot_dump() (2021-02-02 17:23:55 +0100)
12
12
13
----------------------------------------------------------------
13
----------------------------------------------------------------
14
Block layer patches:
14
Block layer patches:
15
15
16
- Fix crash on write to read-only devices
16
- Fix double processing of nodes in bdrv_set_aio_context()
17
- iotests: Rewrite 'check' in Python, get rid of 'groups' and allow
17
- Fix potential hang in block export shutdown
18
non-numeric test case names
18
- block/nvme: Minor tracing improvements
19
- iotests: Some more fixups for the 'check' rewrite
20
- MAINTAINERS: Add Vladimir as co-maintainer for Block Jobs
19
21
20
----------------------------------------------------------------
22
----------------------------------------------------------------
21
Kevin Wolf (2):
23
Kevin Wolf (3):
22
block: Separate blk_is_writable() and blk_supports_write_perm()
24
iotests: Revert emulator selection to old behaviour
23
virtio-scsi-test: Test writing to scsi-cd device
25
iotests: Fix -makecheck output
26
block: Fix VM size column width in bdrv_snapshot_dump()
24
27
25
Vladimir Sementsov-Ogievskiy (6):
28
Philippe Mathieu-Daudé (2):
26
iotests: 146: drop extra whitespaces from .out file
29
block/nvme: Properly display doorbell stride length in trace event
27
iotests: add findtests.py
30
block/nvme: Trace NVMe spec version supported by the controller
28
iotests: add testenv.py
29
iotests: add testrunner.py
30
iotests: rewrite check into python
31
iotests: rename and move 169 and 199 tests
32
31
33
docs/devel/testing.rst | 50 +-
32
Sergio Lopez (2):
34
include/sysemu/block-backend.h | 3 +-
33
block: Avoid processing BDS twice in bdrv_set_aio_context_ignore()
35
block/block-backend.c | 19 +-
34
block: move blk_exp_close_all() to qemu_cleanup()
36
hw/block/dataplane/xen-block.c | 2 +-
35
37
hw/block/fdc.c | 9 +-
36
Vladimir Sementsov-Ogievskiy (3):
38
hw/block/m25p80.c | 6 +-
37
MAINTAINERS: Add Vladimir as co-maintainer for Block Jobs
39
hw/block/nand.c | 2 +-
38
iotests/297: pylint: ignore too many statements
40
hw/block/nvme-ns.c | 7 +-
39
iotests: check: return 1 on failure
41
hw/block/onenand.c | 2 +-
40
42
hw/block/pflash_cfi01.c | 2 +-
41
block.c | 35 +++++++++++++++++++++++++++--------
43
hw/block/pflash_cfi02.c | 2 +-
42
block/nvme.c | 8 +++++++-
44
hw/block/swim.c | 6 +-
43
block/qapi.c | 4 ++--
45
hw/block/virtio-blk.c | 6 +-
44
qemu-nbd.c | 1 +
46
hw/block/xen-block.c | 2 +-
45
softmmu/runstate.c | 9 +++++++++
47
hw/ide/core.c | 2 +-
46
storage-daemon/qemu-storage-daemon.c | 1 +
48
hw/misc/sifive_u_otp.c | 2 +-
47
tests/qemu-iotests/testenv.py | 2 +-
49
hw/ppc/pnv_pnor.c | 2 +-
48
tests/qemu-iotests/testrunner.py | 10 +++++++---
50
hw/scsi/scsi-disk.c | 10 +-
49
MAINTAINERS | 10 ++++++++++
51
hw/scsi/scsi-generic.c | 4 +-
50
block/trace-events | 1 +
52
hw/sd/sd.c | 6 +-
51
tests/qemu-iotests/check | 5 ++++-
53
hw/usb/dev-storage.c | 4 +-
52
tests/qemu-iotests/pylintrc | 2 ++
54
tests/qtest/virtio-scsi-test.c | 39 +
53
12 files changed, 72 insertions(+), 16 deletions(-)
55
tests/qemu-iotests/findtests.py | 159 +++
56
tests/qemu-iotests/iotests.py | 8 +
57
tests/qemu-iotests/testenv.py | 281 +++++
58
tests/qemu-iotests/testrunner.py | 367 +++++++
59
Makefile | 1 -
60
tests/check-block.sh | 3 +-
61
tests/qemu-iotests/146.out | 780 +++++++-------
62
tests/qemu-iotests/check | 1095 +++-----------------
63
tests/qemu-iotests/common.env.in | 3 -
64
tests/qemu-iotests/group | 323 ------
65
tests/qemu-iotests/meson.build | 3 -
66
.../{199 => tests/migrate-bitmaps-postcopy-test} | 0
67
.../migrate-bitmaps-postcopy-test.out} | 0
68
.../{169 => tests/migrate-bitmaps-test} | 0
69
.../{169.out => tests/migrate-bitmaps-test.out} | 0
70
37 files changed, 1481 insertions(+), 1729 deletions(-)
71
create mode 100644 tests/qemu-iotests/findtests.py
72
create mode 100644 tests/qemu-iotests/testenv.py
73
create mode 100644 tests/qemu-iotests/testrunner.py
74
delete mode 100644 tests/qemu-iotests/common.env.in
75
delete mode 100644 tests/qemu-iotests/group
76
rename tests/qemu-iotests/{199 => tests/migrate-bitmaps-postcopy-test} (100%)
77
rename tests/qemu-iotests/{199.out => tests/migrate-bitmaps-postcopy-test.out} (100%)
78
rename tests/qemu-iotests/{169 => tests/migrate-bitmaps-test} (100%)
79
rename tests/qemu-iotests/{169.out => tests/migrate-bitmaps-test.out} (100%)
80
54
81
55
diff view generated by jsdifflib
1
From: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
1
From: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
2
2
3
Rename bitmaps migration tests and move them to tests subdirectory to
3
I'm developing Qemu backup for several years, and finally new backup
4
demonstrate new human-friendly test naming.
4
architecture, including block-copy generic engine and backup-top filter
5
landed upstream, great thanks to reviewers and especially to
6
Max Reitz!
7
8
I also have plans of moving other block-jobs onto block-copy, so that
9
we finally have one generic block copying path, fast and well-formed.
10
11
So, now I suggest to bring all parts of backup architecture into
12
"Block Jobs" subsystem (actually, aio_task is shared with qcow2 and
13
qemu-co-shared-resource can be reused somewhere else, but I'd keep an
14
eye on them in context of block-jobs) and add myself as co-maintainer.
5
15
6
Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
16
Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
7
Message-Id: <20210125185056.129513-7-vsementsov@virtuozzo.com>
17
Message-Id: <20210128144144.27617-1-vsementsov@virtuozzo.com>
18
Reviewed-by: Markus Armbruster <armbru@redhat.com>
19
Reviewed-by: John Snow <jsnow@redhat.com>
20
Reviewed-by: Max Reitz <mreitz@redhat.com>
8
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
21
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
9
---
22
---
10
tests/qemu-iotests/{199 => tests/migrate-bitmaps-postcopy-test} | 0
23
MAINTAINERS | 10 ++++++++++
11
.../{199.out => tests/migrate-bitmaps-postcopy-test.out} | 0
24
1 file changed, 10 insertions(+)
12
tests/qemu-iotests/{169 => tests/migrate-bitmaps-test} | 0
13
tests/qemu-iotests/{169.out => tests/migrate-bitmaps-test.out} | 0
14
4 files changed, 0 insertions(+), 0 deletions(-)
15
rename tests/qemu-iotests/{199 => tests/migrate-bitmaps-postcopy-test} (100%)
16
rename tests/qemu-iotests/{199.out => tests/migrate-bitmaps-postcopy-test.out} (100%)
17
rename tests/qemu-iotests/{169 => tests/migrate-bitmaps-test} (100%)
18
rename tests/qemu-iotests/{169.out => tests/migrate-bitmaps-test.out} (100%)
19
25
20
diff --git a/tests/qemu-iotests/199 b/tests/qemu-iotests/tests/migrate-bitmaps-postcopy-test
26
diff --git a/MAINTAINERS b/MAINTAINERS
21
similarity index 100%
27
index XXXXXXX..XXXXXXX 100644
22
rename from tests/qemu-iotests/199
28
--- a/MAINTAINERS
23
rename to tests/qemu-iotests/tests/migrate-bitmaps-postcopy-test
29
+++ b/MAINTAINERS
24
diff --git a/tests/qemu-iotests/199.out b/tests/qemu-iotests/tests/migrate-bitmaps-postcopy-test.out
30
@@ -XXX,XX +XXX,XX @@ F: scsi/*
25
similarity index 100%
31
26
rename from tests/qemu-iotests/199.out
32
Block Jobs
27
rename to tests/qemu-iotests/tests/migrate-bitmaps-postcopy-test.out
33
M: John Snow <jsnow@redhat.com>
28
diff --git a/tests/qemu-iotests/169 b/tests/qemu-iotests/tests/migrate-bitmaps-test
34
+M: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
29
similarity index 100%
35
L: qemu-block@nongnu.org
30
rename from tests/qemu-iotests/169
36
S: Supported
31
rename to tests/qemu-iotests/tests/migrate-bitmaps-test
37
F: blockjob.c
32
diff --git a/tests/qemu-iotests/169.out b/tests/qemu-iotests/tests/migrate-bitmaps-test.out
38
@@ -XXX,XX +XXX,XX @@ F: block/commit.c
33
similarity index 100%
39
F: block/stream.c
34
rename from tests/qemu-iotests/169.out
40
F: block/mirror.c
35
rename to tests/qemu-iotests/tests/migrate-bitmaps-test.out
41
F: qapi/job.json
42
+F: block/block-copy.c
43
+F: include/block/block-copy.c
44
+F: block/backup-top.h
45
+F: block/backup-top.c
46
+F: include/block/aio_task.h
47
+F: block/aio_task.c
48
+F: util/qemu-co-shared-resource.c
49
+F: include/qemu/co-shared-resource.h
50
T: git https://gitlab.com/jsnow/qemu.git jobs
51
+T: git https://src.openvz.org/scm/~vsementsov/qemu.git jobs
52
53
Block QAPI, monitor, command line
54
M: Markus Armbruster <armbru@redhat.com>
36
--
55
--
37
2.29.2
56
2.29.2
38
57
39
58
diff view generated by jsdifflib
1
Currently, blk_is_read_only() tells whether a given BlockBackend can
1
From: Sergio Lopez <slp@redhat.com>
2
only be used in read-only mode because its root node is read-only. Some
3
callers actually try to answer a slightly different question: Is the
4
BlockBackend configured to be writable, by taking write permissions on
5
the root node?
6
2
7
This can differ, for example, for CD-ROM devices which don't take write
3
Some graphs may contain an indirect reference to the first BDS in the
8
permissions, but may be backed by a writable image file. scsi-cd allows
4
chain that can be reached while walking it bottom->up from one its
9
write requests to the drive if blk_is_read_only() returns false.
5
children.
10
However, the write request will immediately run into an assertion
11
failure because the write permission is missing.
12
6
13
This patch introduces separate functions for both questions.
7
Doubling-processing of a BDS is especially problematic for the
14
blk_supports_write_perm() answers the question whether the block
8
aio_notifiers, as they might attempt to work on both the old and the
15
node/image file can support writable devices, whereas blk_is_writable()
9
new AIO contexts.
16
tells whether the BlockBackend is currently configured to be writable.
17
10
18
All calls of blk_is_read_only() are converted to one of the two new
11
To avoid this problem, add every child and parent to the ignore list
19
functions.
12
before actually processing them.
20
13
21
Fixes: https://bugs.launchpad.net/bugs/1906693
14
Suggested-by: Kevin Wolf <kwolf@redhat.com>
22
Cc: qemu-stable@nongnu.org
15
Signed-off-by: Sergio Lopez <slp@redhat.com>
23
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
16
Message-Id: <20210201125032.44713-2-slp@redhat.com>
24
Message-Id: <20210118123448.307825-2-kwolf@redhat.com>
25
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
26
Reviewed-by: Max Reitz <mreitz@redhat.com>
27
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
17
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
28
---
18
---
29
include/sysemu/block-backend.h | 3 ++-
19
block.c | 34 +++++++++++++++++++++++++++-------
30
block/block-backend.c | 19 ++++++++++++++++---
20
1 file changed, 27 insertions(+), 7 deletions(-)
31
hw/block/dataplane/xen-block.c | 2 +-
32
hw/block/fdc.c | 9 +++++----
33
hw/block/m25p80.c | 6 +++---
34
hw/block/nand.c | 2 +-
35
hw/block/nvme-ns.c | 7 ++++---
36
hw/block/onenand.c | 2 +-
37
hw/block/pflash_cfi01.c | 2 +-
38
hw/block/pflash_cfi02.c | 2 +-
39
hw/block/swim.c | 6 +++---
40
hw/block/virtio-blk.c | 6 +++---
41
hw/block/xen-block.c | 2 +-
42
hw/ide/core.c | 2 +-
43
hw/misc/sifive_u_otp.c | 2 +-
44
hw/ppc/pnv_pnor.c | 2 +-
45
hw/scsi/scsi-disk.c | 10 +++++-----
46
hw/scsi/scsi-generic.c | 4 ++--
47
hw/sd/sd.c | 6 +++---
48
hw/usb/dev-storage.c | 4 ++--
49
20 files changed, 57 insertions(+), 41 deletions(-)
50
21
51
diff --git a/include/sysemu/block-backend.h b/include/sysemu/block-backend.h
22
diff --git a/block.c b/block.c
52
index XXXXXXX..XXXXXXX 100644
23
index XXXXXXX..XXXXXXX 100644
53
--- a/include/sysemu/block-backend.h
24
--- a/block.c
54
+++ b/include/sysemu/block-backend.h
25
+++ b/block.c
55
@@ -XXX,XX +XXX,XX @@ BlockErrorAction blk_get_error_action(BlockBackend *blk, bool is_read,
26
@@ -XXX,XX +XXX,XX @@ void bdrv_set_aio_context_ignore(BlockDriverState *bs,
56
int error);
27
AioContext *new_context, GSList **ignore)
57
void blk_error_action(BlockBackend *blk, BlockErrorAction action,
28
{
58
bool is_read, int error);
29
AioContext *old_context = bdrv_get_aio_context(bs);
59
-bool blk_is_read_only(BlockBackend *blk);
30
- BdrvChild *child;
60
+bool blk_supports_write_perm(BlockBackend *blk);
31
+ GSList *children_to_process = NULL;
61
+bool blk_is_writable(BlockBackend *blk);
32
+ GSList *parents_to_process = NULL;
62
bool blk_is_sg(BlockBackend *blk);
33
+ GSList *entry;
63
bool blk_enable_write_cache(BlockBackend *blk);
34
+ BdrvChild *child, *parent;
64
void blk_set_enable_write_cache(BlockBackend *blk, bool wce);
35
65
diff --git a/block/block-backend.c b/block/block-backend.c
36
g_assert(qemu_get_current_aio_context() == qemu_get_aio_context());
66
index XXXXXXX..XXXXXXX 100644
37
67
--- a/block/block-backend.c
38
@@ -XXX,XX +XXX,XX @@ void bdrv_set_aio_context_ignore(BlockDriverState *bs,
68
+++ b/block/block-backend.c
39
continue;
69
@@ -XXX,XX +XXX,XX @@ void blk_error_action(BlockBackend *blk, BlockErrorAction action,
40
}
41
*ignore = g_slist_prepend(*ignore, child);
42
- bdrv_set_aio_context_ignore(child->bs, new_context, ignore);
43
+ children_to_process = g_slist_prepend(children_to_process, child);
70
}
44
}
71
}
45
- QLIST_FOREACH(child, &bs->parents, next_parent) {
72
46
- if (g_slist_find(*ignore, child)) {
73
-bool blk_is_read_only(BlockBackend *blk)
47
+
74
+/*
48
+ QLIST_FOREACH(parent, &bs->parents, next_parent) {
75
+ * Returns true if the BlockBackend can support taking write permissions
49
+ if (g_slist_find(*ignore, parent)) {
76
+ * (because its root node is not read-only).
50
continue;
77
+ */
51
}
78
+bool blk_supports_write_perm(BlockBackend *blk)
52
- assert(child->klass->set_aio_ctx);
79
{
53
- *ignore = g_slist_prepend(*ignore, child);
80
BlockDriverState *bs = blk_bs(blk);
54
- child->klass->set_aio_ctx(child, new_context, ignore);
81
55
+ *ignore = g_slist_prepend(*ignore, parent);
82
if (bs) {
56
+ parents_to_process = g_slist_prepend(parents_to_process, parent);
83
- return bdrv_is_read_only(bs);
57
+ }
84
+ return !bdrv_is_read_only(bs);
58
+
85
} else {
59
+ for (entry = children_to_process;
86
- return blk->root_state.read_only;
60
+ entry != NULL;
87
+ return !blk->root_state.read_only;
61
+ entry = g_slist_next(entry)) {
62
+ child = entry->data;
63
+ bdrv_set_aio_context_ignore(child->bs, new_context, ignore);
64
+ }
65
+ g_slist_free(children_to_process);
66
+
67
+ for (entry = parents_to_process;
68
+ entry != NULL;
69
+ entry = g_slist_next(entry)) {
70
+ parent = entry->data;
71
+ assert(parent->klass->set_aio_ctx);
72
+ parent->klass->set_aio_ctx(parent, new_context, ignore);
88
}
73
}
89
}
74
+ g_slist_free(parents_to_process);
90
75
91
+/*
76
bdrv_detach_aio_context(bs);
92
+ * Returns true if the BlockBackend can be written to in its current
93
+ * configuration (i.e. if write permission have been requested)
94
+ */
95
+bool blk_is_writable(BlockBackend *blk)
96
+{
97
+ return blk->perm & BLK_PERM_WRITE;
98
+}
99
+
100
bool blk_is_sg(BlockBackend *blk)
101
{
102
BlockDriverState *bs = blk_bs(blk);
103
diff --git a/hw/block/dataplane/xen-block.c b/hw/block/dataplane/xen-block.c
104
index XXXXXXX..XXXXXXX 100644
105
--- a/hw/block/dataplane/xen-block.c
106
+++ b/hw/block/dataplane/xen-block.c
107
@@ -XXX,XX +XXX,XX @@ static int xen_block_parse_request(XenBlockRequest *request)
108
};
109
110
if (request->req.operation != BLKIF_OP_READ &&
111
- blk_is_read_only(dataplane->blk)) {
112
+ !blk_is_writable(dataplane->blk)) {
113
error_report("error: write req for ro device");
114
goto err;
115
}
116
diff --git a/hw/block/fdc.c b/hw/block/fdc.c
117
index XXXXXXX..XXXXXXX 100644
118
--- a/hw/block/fdc.c
119
+++ b/hw/block/fdc.c
120
@@ -XXX,XX +XXX,XX @@ static void fd_revalidate(FDrive *drv)
121
122
FLOPPY_DPRINTF("revalidate\n");
123
if (drv->blk != NULL) {
124
- drv->ro = blk_is_read_only(drv->blk);
125
+ drv->ro = !blk_is_writable(drv->blk);
126
if (!blk_is_inserted(drv->blk)) {
127
FLOPPY_DPRINTF("No disk in drive\n");
128
drv->disk = FLOPPY_DRIVE_TYPE_NONE;
129
@@ -XXX,XX +XXX,XX @@ static void fd_change_cb(void *opaque, bool load, Error **errp)
130
blk_set_perm(drive->blk, 0, BLK_PERM_ALL, &error_abort);
131
} else {
132
if (!blkconf_apply_backend_options(drive->conf,
133
- blk_is_read_only(drive->blk), false,
134
- errp)) {
135
+ !blk_supports_write_perm(drive->blk),
136
+ false, errp)) {
137
return;
138
}
139
}
140
@@ -XXX,XX +XXX,XX @@ static void floppy_drive_realize(DeviceState *qdev, Error **errp)
141
* read-only node later */
142
read_only = true;
143
} else {
144
- read_only = !blk_bs(dev->conf.blk) || blk_is_read_only(dev->conf.blk);
145
+ read_only = !blk_bs(dev->conf.blk) ||
146
+ !blk_supports_write_perm(dev->conf.blk);
147
}
148
149
if (!blkconf_blocksizes(&dev->conf, errp)) {
150
diff --git a/hw/block/m25p80.c b/hw/block/m25p80.c
151
index XXXXXXX..XXXXXXX 100644
152
--- a/hw/block/m25p80.c
153
+++ b/hw/block/m25p80.c
154
@@ -XXX,XX +XXX,XX @@ static void flash_sync_page(Flash *s, int page)
155
{
156
QEMUIOVector *iov;
157
158
- if (!s->blk || blk_is_read_only(s->blk)) {
159
+ if (!s->blk || !blk_is_writable(s->blk)) {
160
return;
161
}
162
163
@@ -XXX,XX +XXX,XX @@ static inline void flash_sync_area(Flash *s, int64_t off, int64_t len)
164
{
165
QEMUIOVector *iov;
166
167
- if (!s->blk || blk_is_read_only(s->blk)) {
168
+ if (!s->blk || !blk_is_writable(s->blk)) {
169
return;
170
}
171
172
@@ -XXX,XX +XXX,XX @@ static void m25p80_realize(SSIPeripheral *ss, Error **errp)
173
174
if (s->blk) {
175
uint64_t perm = BLK_PERM_CONSISTENT_READ |
176
- (blk_is_read_only(s->blk) ? 0 : BLK_PERM_WRITE);
177
+ (blk_supports_write_perm(s->blk) ? BLK_PERM_WRITE : 0);
178
ret = blk_set_perm(s->blk, perm, BLK_PERM_ALL, errp);
179
if (ret < 0) {
180
return;
181
diff --git a/hw/block/nand.c b/hw/block/nand.c
182
index XXXXXXX..XXXXXXX 100644
183
--- a/hw/block/nand.c
184
+++ b/hw/block/nand.c
185
@@ -XXX,XX +XXX,XX @@ static void nand_realize(DeviceState *dev, Error **errp)
186
pagesize = 1 << s->oob_shift;
187
s->mem_oob = 1;
188
if (s->blk) {
189
- if (blk_is_read_only(s->blk)) {
190
+ if (!blk_supports_write_perm(s->blk)) {
191
error_setg(errp, "Can't use a read-only drive");
192
return;
193
}
194
diff --git a/hw/block/nvme-ns.c b/hw/block/nvme-ns.c
195
index XXXXXXX..XXXXXXX 100644
196
--- a/hw/block/nvme-ns.c
197
+++ b/hw/block/nvme-ns.c
198
@@ -XXX,XX +XXX,XX @@ static void nvme_ns_init(NvmeNamespace *ns)
199
200
static int nvme_ns_init_blk(NvmeCtrl *n, NvmeNamespace *ns, Error **errp)
201
{
202
+ bool read_only;
203
+
204
if (!blkconf_blocksizes(&ns->blkconf, errp)) {
205
return -1;
206
}
207
208
- if (!blkconf_apply_backend_options(&ns->blkconf,
209
- blk_is_read_only(ns->blkconf.blk),
210
- false, errp)) {
211
+ read_only = !blk_supports_write_perm(ns->blkconf.blk);
212
+ if (!blkconf_apply_backend_options(&ns->blkconf, read_only, false, errp)) {
213
return -1;
214
}
215
216
diff --git a/hw/block/onenand.c b/hw/block/onenand.c
217
index XXXXXXX..XXXXXXX 100644
218
--- a/hw/block/onenand.c
219
+++ b/hw/block/onenand.c
220
@@ -XXX,XX +XXX,XX @@ static void onenand_realize(DeviceState *dev, Error **errp)
221
s->image = memset(g_malloc(size + (size >> 5)),
222
0xff, size + (size >> 5));
223
} else {
224
- if (blk_is_read_only(s->blk)) {
225
+ if (!blk_supports_write_perm(s->blk)) {
226
error_setg(errp, "Can't use a read-only drive");
227
return;
228
}
229
diff --git a/hw/block/pflash_cfi01.c b/hw/block/pflash_cfi01.c
230
index XXXXXXX..XXXXXXX 100644
231
--- a/hw/block/pflash_cfi01.c
232
+++ b/hw/block/pflash_cfi01.c
233
@@ -XXX,XX +XXX,XX @@ static void pflash_cfi01_realize(DeviceState *dev, Error **errp)
234
235
if (pfl->blk) {
236
uint64_t perm;
237
- pfl->ro = blk_is_read_only(pfl->blk);
238
+ pfl->ro = !blk_supports_write_perm(pfl->blk);
239
perm = BLK_PERM_CONSISTENT_READ | (pfl->ro ? 0 : BLK_PERM_WRITE);
240
ret = blk_set_perm(pfl->blk, perm, BLK_PERM_ALL, errp);
241
if (ret < 0) {
242
diff --git a/hw/block/pflash_cfi02.c b/hw/block/pflash_cfi02.c
243
index XXXXXXX..XXXXXXX 100644
244
--- a/hw/block/pflash_cfi02.c
245
+++ b/hw/block/pflash_cfi02.c
246
@@ -XXX,XX +XXX,XX @@ static void pflash_cfi02_realize(DeviceState *dev, Error **errp)
247
248
if (pfl->blk) {
249
uint64_t perm;
250
- pfl->ro = blk_is_read_only(pfl->blk);
251
+ pfl->ro = !blk_supports_write_perm(pfl->blk);
252
perm = BLK_PERM_CONSISTENT_READ | (pfl->ro ? 0 : BLK_PERM_WRITE);
253
ret = blk_set_perm(pfl->blk, perm, BLK_PERM_ALL, errp);
254
if (ret < 0) {
255
diff --git a/hw/block/swim.c b/hw/block/swim.c
256
index XXXXXXX..XXXXXXX 100644
257
--- a/hw/block/swim.c
258
+++ b/hw/block/swim.c
259
@@ -XXX,XX +XXX,XX @@ static void swim_change_cb(void *opaque, bool load, Error **errp)
260
blk_set_perm(drive->blk, 0, BLK_PERM_ALL, &error_abort);
261
} else {
262
if (!blkconf_apply_backend_options(drive->conf,
263
- blk_is_read_only(drive->blk), false,
264
- errp)) {
265
+ !blk_supports_write_perm(drive->blk),
266
+ false, errp)) {
267
return;
268
}
269
}
270
@@ -XXX,XX +XXX,XX @@ static void swim_drive_realize(DeviceState *qdev, Error **errp)
271
dev->conf.werror = BLOCKDEV_ON_ERROR_AUTO;
272
273
if (!blkconf_apply_backend_options(&dev->conf,
274
- blk_is_read_only(dev->conf.blk),
275
+ !blk_supports_write_perm(dev->conf.blk),
276
false, errp)) {
277
return;
278
}
279
diff --git a/hw/block/virtio-blk.c b/hw/block/virtio-blk.c
280
index XXXXXXX..XXXXXXX 100644
281
--- a/hw/block/virtio-blk.c
282
+++ b/hw/block/virtio-blk.c
283
@@ -XXX,XX +XXX,XX @@ static uint64_t virtio_blk_get_features(VirtIODevice *vdev, uint64_t features,
284
virtio_has_feature(features, VIRTIO_BLK_F_CONFIG_WCE))) {
285
virtio_add_feature(&features, VIRTIO_BLK_F_WCE);
286
}
287
- if (blk_is_read_only(s->blk)) {
288
+ if (!blk_is_writable(s->blk)) {
289
virtio_add_feature(&features, VIRTIO_BLK_F_RO);
290
}
291
if (s->conf.num_queues > 1) {
292
@@ -XXX,XX +XXX,XX @@ static void virtio_blk_device_realize(DeviceState *dev, Error **errp)
293
}
294
295
if (!blkconf_apply_backend_options(&conf->conf,
296
- blk_is_read_only(conf->conf.blk), true,
297
- errp)) {
298
+ !blk_supports_write_perm(conf->conf.blk),
299
+ true, errp)) {
300
return;
301
}
302
s->original_wce = blk_enable_write_cache(conf->conf.blk);
303
diff --git a/hw/block/xen-block.c b/hw/block/xen-block.c
304
index XXXXXXX..XXXXXXX 100644
305
--- a/hw/block/xen-block.c
306
+++ b/hw/block/xen-block.c
307
@@ -XXX,XX +XXX,XX @@ static void xen_disk_realize(XenBlockDevice *blockdev, Error **errp)
308
return;
309
}
310
311
- blockdev->info = blk_is_read_only(conf->blk) ? VDISK_READONLY : 0;
312
+ blockdev->info = blk_supports_write_perm(conf->blk) ? 0 : VDISK_READONLY;
313
}
314
315
static void xen_disk_class_init(ObjectClass *class, void *data)
316
diff --git a/hw/ide/core.c b/hw/ide/core.c
317
index XXXXXXX..XXXXXXX 100644
318
--- a/hw/ide/core.c
319
+++ b/hw/ide/core.c
320
@@ -XXX,XX +XXX,XX @@ int ide_init_drive(IDEState *s, BlockBackend *blk, IDEDriveKind kind,
321
error_setg(errp, "Device needs media, but drive is empty");
322
return -1;
323
}
324
- if (blk_is_read_only(blk)) {
325
+ if (!blk_is_writable(blk)) {
326
error_setg(errp, "Can't use a read-only drive");
327
return -1;
328
}
329
diff --git a/hw/misc/sifive_u_otp.c b/hw/misc/sifive_u_otp.c
330
index XXXXXXX..XXXXXXX 100644
331
--- a/hw/misc/sifive_u_otp.c
332
+++ b/hw/misc/sifive_u_otp.c
333
@@ -XXX,XX +XXX,XX @@ static void sifive_u_otp_realize(DeviceState *dev, Error **errp)
334
335
if (s->blk) {
336
perm = BLK_PERM_CONSISTENT_READ |
337
- (blk_is_read_only(s->blk) ? 0 : BLK_PERM_WRITE);
338
+ (blk_supports_write_perm(s->blk) ? BLK_PERM_WRITE : 0);
339
ret = blk_set_perm(s->blk, perm, BLK_PERM_ALL, errp);
340
if (ret < 0) {
341
return;
342
diff --git a/hw/ppc/pnv_pnor.c b/hw/ppc/pnv_pnor.c
343
index XXXXXXX..XXXXXXX 100644
344
--- a/hw/ppc/pnv_pnor.c
345
+++ b/hw/ppc/pnv_pnor.c
346
@@ -XXX,XX +XXX,XX @@ static void pnv_pnor_realize(DeviceState *dev, Error **errp)
347
348
if (s->blk) {
349
uint64_t perm = BLK_PERM_CONSISTENT_READ |
350
- (blk_is_read_only(s->blk) ? 0 : BLK_PERM_WRITE);
351
+ (blk_supports_write_perm(s->blk) ? BLK_PERM_WRITE : 0);
352
ret = blk_set_perm(s->blk, perm, BLK_PERM_ALL, errp);
353
if (ret < 0) {
354
return;
355
diff --git a/hw/scsi/scsi-disk.c b/hw/scsi/scsi-disk.c
356
index XXXXXXX..XXXXXXX 100644
357
--- a/hw/scsi/scsi-disk.c
358
+++ b/hw/scsi/scsi-disk.c
359
@@ -XXX,XX +XXX,XX @@ static int scsi_disk_emulate_mode_sense(SCSIDiskReq *r, uint8_t *outbuf)
360
361
if (s->qdev.type == TYPE_DISK) {
362
dev_specific_param = s->features & (1 << SCSI_DISK_F_DPOFUA) ? 0x10 : 0;
363
- if (blk_is_read_only(s->qdev.conf.blk)) {
364
+ if (!blk_is_writable(s->qdev.conf.blk)) {
365
dev_specific_param |= 0x80; /* Readonly. */
366
}
367
} else {
368
@@ -XXX,XX +XXX,XX @@ static void scsi_disk_emulate_unmap(SCSIDiskReq *r, uint8_t *inbuf)
369
goto invalid_param_len;
370
}
371
372
- if (blk_is_read_only(s->qdev.conf.blk)) {
373
+ if (!blk_is_writable(s->qdev.conf.blk)) {
374
block_acct_invalid(blk_get_stats(s->qdev.conf.blk), BLOCK_ACCT_UNMAP);
375
scsi_check_condition(r, SENSE_CODE(WRITE_PROTECTED));
376
return;
377
@@ -XXX,XX +XXX,XX @@ static void scsi_disk_emulate_write_same(SCSIDiskReq *r, uint8_t *inbuf)
378
return;
379
}
380
381
- if (blk_is_read_only(s->qdev.conf.blk)) {
382
+ if (!blk_is_writable(s->qdev.conf.blk)) {
383
scsi_check_condition(r, SENSE_CODE(WRITE_PROTECTED));
384
return;
385
}
386
@@ -XXX,XX +XXX,XX @@ static int32_t scsi_disk_dma_command(SCSIRequest *req, uint8_t *buf)
387
case WRITE_VERIFY_10:
388
case WRITE_VERIFY_12:
389
case WRITE_VERIFY_16:
390
- if (blk_is_read_only(s->qdev.conf.blk)) {
391
+ if (!blk_is_writable(s->qdev.conf.blk)) {
392
scsi_check_condition(r, SENSE_CODE(WRITE_PROTECTED));
393
return 0;
394
}
395
@@ -XXX,XX +XXX,XX @@ static void scsi_realize(SCSIDevice *dev, Error **errp)
396
}
397
}
398
399
- read_only = blk_is_read_only(s->qdev.conf.blk);
400
+ read_only = !blk_supports_write_perm(s->qdev.conf.blk);
401
if (dev->type == TYPE_ROM) {
402
read_only = true;
403
}
404
diff --git a/hw/scsi/scsi-generic.c b/hw/scsi/scsi-generic.c
405
index XXXXXXX..XXXXXXX 100644
406
--- a/hw/scsi/scsi-generic.c
407
+++ b/hw/scsi/scsi-generic.c
408
@@ -XXX,XX +XXX,XX @@ static void scsi_read_complete(void * opaque, int ret)
409
* readonly.
410
*/
411
if ((s->type == TYPE_DISK || s->type == TYPE_TAPE || s->type == TYPE_ZBC) &&
412
- blk_is_read_only(s->conf.blk) &&
413
+ !blk_is_writable(s->conf.blk) &&
414
(r->req.cmd.buf[0] == MODE_SENSE ||
415
r->req.cmd.buf[0] == MODE_SENSE_10) &&
416
(r->req.cmd.buf[1] & 0x8) == 0) {
417
@@ -XXX,XX +XXX,XX @@ static void scsi_generic_realize(SCSIDevice *s, Error **errp)
418
return;
419
}
420
if (!blkconf_apply_backend_options(&s->conf,
421
- blk_is_read_only(s->conf.blk),
422
+ !blk_supports_write_perm(s->conf.blk),
423
true, errp)) {
424
return;
425
}
426
diff --git a/hw/sd/sd.c b/hw/sd/sd.c
427
index XXXXXXX..XXXXXXX 100644
428
--- a/hw/sd/sd.c
429
+++ b/hw/sd/sd.c
430
@@ -XXX,XX +XXX,XX @@ static void sd_reset(DeviceState *dev)
431
sd_set_sdstatus(sd);
432
433
g_free(sd->wp_groups);
434
- sd->wp_switch = sd->blk ? blk_is_read_only(sd->blk) : false;
435
+ sd->wp_switch = sd->blk ? !blk_is_writable(sd->blk) : false;
436
sd->wpgrps_size = sect;
437
sd->wp_groups = bitmap_new(sd->wpgrps_size);
438
memset(sd->function_group, 0, sizeof(sd->function_group));
439
@@ -XXX,XX +XXX,XX @@ void sd_set_cb(SDState *sd, qemu_irq readonly, qemu_irq insert)
440
{
441
sd->readonly_cb = readonly;
442
sd->inserted_cb = insert;
443
- qemu_set_irq(readonly, sd->blk ? blk_is_read_only(sd->blk) : 0);
444
+ qemu_set_irq(readonly, sd->blk ? !blk_is_writable(sd->blk) : 0);
445
qemu_set_irq(insert, sd->blk ? blk_is_inserted(sd->blk) : 0);
446
}
447
448
@@ -XXX,XX +XXX,XX @@ static void sd_realize(DeviceState *dev, Error **errp)
449
if (sd->blk) {
450
int64_t blk_size;
451
452
- if (blk_is_read_only(sd->blk)) {
453
+ if (!blk_supports_write_perm(sd->blk)) {
454
error_setg(errp, "Cannot use read-only drive as SD card");
455
return;
456
}
457
diff --git a/hw/usb/dev-storage.c b/hw/usb/dev-storage.c
458
index XXXXXXX..XXXXXXX 100644
459
--- a/hw/usb/dev-storage.c
460
+++ b/hw/usb/dev-storage.c
461
@@ -XXX,XX +XXX,XX @@ static void usb_msd_storage_realize(USBDevice *dev, Error **errp)
462
return;
463
}
464
465
- if (!blkconf_apply_backend_options(&s->conf, blk_is_read_only(blk), true,
466
- errp)) {
467
+ if (!blkconf_apply_backend_options(&s->conf, !blk_supports_write_perm(blk),
468
+ true, errp)) {
469
return;
470
}
471
77
472
--
78
--
473
2.29.2
79
2.29.2
474
80
475
81
diff view generated by jsdifflib
1
This tests that trying to write to a (read-only) scsi-cd device backed
1
From: Sergio Lopez <slp@redhat.com>
2
by a read-write image file doesn't crash and results in the correct
3
error.
4
2
5
This is a regression test for https://bugs.launchpad.net/bugs/1906693.
3
Move blk_exp_close_all() from bdrv_close() to qemu_cleanup(), before
4
bdrv_drain_all_begin().
6
5
7
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
6
Export drivers may have coroutines yielding at some point in the block
8
Message-Id: <20210118123448.307825-3-kwolf@redhat.com>
7
layer, so we need to shut them down before draining the block layer,
9
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
8
as otherwise they may get stuck blk_wait_while_drained().
10
Reviewed-by: Max Reitz <mreitz@redhat.com>
9
10
RHBZ: https://bugzilla.redhat.com/show_bug.cgi?id=1900505
11
Signed-off-by: Sergio Lopez <slp@redhat.com>
12
Message-Id: <20210201125032.44713-3-slp@redhat.com>
11
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
13
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
12
---
14
---
13
tests/qtest/virtio-scsi-test.c | 39 ++++++++++++++++++++++++++++++++++
15
block.c | 1 -
14
1 file changed, 39 insertions(+)
16
qemu-nbd.c | 1 +
17
softmmu/runstate.c | 9 +++++++++
18
storage-daemon/qemu-storage-daemon.c | 1 +
19
4 files changed, 11 insertions(+), 1 deletion(-)
15
20
16
diff --git a/tests/qtest/virtio-scsi-test.c b/tests/qtest/virtio-scsi-test.c
21
diff --git a/block.c b/block.c
17
index XXXXXXX..XXXXXXX 100644
22
index XXXXXXX..XXXXXXX 100644
18
--- a/tests/qtest/virtio-scsi-test.c
23
--- a/block.c
19
+++ b/tests/qtest/virtio-scsi-test.c
24
+++ b/block.c
20
@@ -XXX,XX +XXX,XX @@ static void test_unaligned_write_same(void *obj, void *data,
25
@@ -XXX,XX +XXX,XX @@ static void bdrv_close(BlockDriverState *bs)
21
qvirtio_scsi_pci_free(vs);
26
void bdrv_close_all(void)
27
{
28
assert(job_next(NULL) == NULL);
29
- blk_exp_close_all();
30
31
/* Drop references from requests still in flight, such as canceled block
32
* jobs whose AIO context has not been polled yet */
33
diff --git a/qemu-nbd.c b/qemu-nbd.c
34
index XXXXXXX..XXXXXXX 100644
35
--- a/qemu-nbd.c
36
+++ b/qemu-nbd.c
37
@@ -XXX,XX +XXX,XX @@ static const char *socket_activation_validate_opts(const char *device,
38
static void qemu_nbd_shutdown(void)
39
{
40
job_cancel_sync_all();
41
+ blk_exp_close_all();
42
bdrv_close_all();
22
}
43
}
23
44
24
+static void test_write_to_cdrom(void *obj, void *data,
45
diff --git a/softmmu/runstate.c b/softmmu/runstate.c
25
+ QGuestAllocator *t_alloc)
46
index XXXXXXX..XXXXXXX 100644
26
+{
47
--- a/softmmu/runstate.c
27
+ QVirtioSCSI *scsi = obj;
48
+++ b/softmmu/runstate.c
28
+ QVirtioSCSIQueues *vs;
49
@@ -XXX,XX +XXX,XX @@
29
+ uint8_t buf[2048] = { 0 };
50
#include "qemu/osdep.h"
30
+ const uint8_t write_cdb[VIRTIO_SCSI_CDB_SIZE] = {
51
#include "audio/audio.h"
31
+ /* WRITE(10) to LBA 0, transfer length 1 */
52
#include "block/block.h"
32
+ 0x2a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00
53
+#include "block/export.h"
33
+ };
54
#include "chardev/char.h"
34
+ struct virtio_scsi_cmd_resp resp;
55
#include "crypto/cipher.h"
56
#include "crypto/init.h"
57
@@ -XXX,XX +XXX,XX @@ void qemu_cleanup(void)
58
*/
59
migration_shutdown();
60
61
+ /*
62
+ * Close the exports before draining the block layer. The export
63
+ * drivers may have coroutines yielding on it, so we need to clean
64
+ * them up before the drain, as otherwise they may be get stuck in
65
+ * blk_wait_while_drained().
66
+ */
67
+ blk_exp_close_all();
35
+
68
+
36
+ alloc = t_alloc;
69
/*
37
+ vs = qvirtio_scsi_init(scsi->vdev);
70
* We must cancel all block jobs while the block layer is drained,
38
+
71
* or cancelling will be affected by throttling and thus may block
39
+ virtio_scsi_do_command(vs, write_cdb, NULL, 0, buf, 2048, &resp);
72
diff --git a/storage-daemon/qemu-storage-daemon.c b/storage-daemon/qemu-storage-daemon.c
40
+ g_assert_cmphex(resp.response, ==, 0);
73
index XXXXXXX..XXXXXXX 100644
41
+ g_assert_cmphex(resp.status, ==, CHECK_CONDITION);
74
--- a/storage-daemon/qemu-storage-daemon.c
42
+ g_assert_cmphex(resp.sense[0], ==, 0x70);
75
+++ b/storage-daemon/qemu-storage-daemon.c
43
+ g_assert_cmphex(resp.sense[2], ==, DATA_PROTECT);
76
@@ -XXX,XX +XXX,XX @@ int main(int argc, char *argv[])
44
+ g_assert_cmphex(resp.sense[12], ==, 0x27); /* WRITE PROTECTED */
77
main_loop_wait(false);
45
+ g_assert_cmphex(resp.sense[13], ==, 0x00); /* WRITE PROTECTED */
78
}
46
+
79
47
+ qvirtio_scsi_pci_free(vs);
80
+ blk_exp_close_all();
48
+}
81
bdrv_drain_all_begin();
49
+
82
bdrv_close_all();
50
static void test_iothread_attach_node(void *obj, void *data,
83
51
QGuestAllocator *t_alloc)
52
{
53
@@ -XXX,XX +XXX,XX @@ static void *virtio_scsi_setup(GString *cmd_line, void *arg)
54
return arg;
55
}
56
57
+static void *virtio_scsi_setup_cd(GString *cmd_line, void *arg)
58
+{
59
+ g_string_append(cmd_line,
60
+ " -drive file=null-co://,"
61
+ "file.read-zeroes=on,"
62
+ "if=none,id=dr1,format=raw "
63
+ "-device scsi-cd,drive=dr1,lun=0,scsi-id=1");
64
+ return arg;
65
+}
66
+
67
static void *virtio_scsi_setup_iothread(GString *cmd_line, void *arg)
68
{
69
g_string_append(cmd_line,
70
@@ -XXX,XX +XXX,XX @@ static void register_virtio_scsi_test(void)
71
qos_add_test("unaligned-write-same", "virtio-scsi",
72
test_unaligned_write_same, &opts);
73
74
+ opts.before = virtio_scsi_setup_cd;
75
+ qos_add_test("write-to-cdrom", "virtio-scsi", test_write_to_cdrom, &opts);
76
+
77
opts.before = virtio_scsi_setup_iothread;
78
opts.edge = (QOSGraphEdgeOptions) {
79
.extra_device_opts = "iothread=thread0",
80
--
84
--
81
2.29.2
85
2.29.2
82
86
83
87
diff view generated by jsdifflib
1
From: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
1
From: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
2
2
3
Add python script with new logic of searching for tests:
3
Ignore two complains, which now lead to 297 failure on testenv.py and
4
testrunner.py.
4
5
5
Current ./check behavior:
6
Fixes: 2e5a2f57db481f18fcf70be2a36b1417370b8476
6
- tests are named [0-9][0-9][0-9]
7
Fixes: d74c754c924ca34e90b7c96ce2f5609d82c0e628
7
- tests must be registered in group file (even if test doesn't belong
8
to any group, like 142)
9
10
Behavior of findtests.py:
11
- group file is dropped
12
- tests are all files in tests/ subdirectory (except for .out files),
13
so it's not needed more to "register the test", just create it with
14
appropriate name in tests/ subdirectory. Old names like
15
[0-9][0-9][0-9] (in root iotests directory) are supported too, but
16
not recommended for new tests
17
- groups are parsed from '# group: ' line inside test files
18
- optional file group.local may be used to define some additional
19
groups for downstreams
20
- 'disabled' group is used to temporary disable tests. So instead of
21
commenting tests in old 'group' file you now can add them to
22
disabled group with help of 'group.local' file
23
- selecting test ranges like 5-15 are not supported more
24
(to support restarting failed ./check command from the middle of the
25
process, new argument is added: --start-from)
26
27
Benefits:
28
- no rebase conflicts in group file on patch porting from branch to
29
branch
30
- no conflicts in upstream, when different series want to occupy same
31
test number
32
- meaningful names for test files
33
For example, with digital number, when some person wants to add some
34
test about block-stream, he most probably will just create a new
35
test. But if there would be test-block-stream test already, he will
36
at first look at it and may be just add a test-case into it.
37
And anyway meaningful names are better.
38
39
This commit doesn't update check behavior (which will be done in
40
further commit), still, the documentation changed like new behavior is
41
already here. Let's live with this small inconsistency for the
42
following few commits, until final change.
43
44
Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
8
Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
45
Reviewed-by: Eric Blake <eblake@redhat.com>
9
Message-Id: <20210129161323.615027-1-vsementsov@virtuozzo.com>
46
Message-Id: <20210125185056.129513-3-vsementsov@virtuozzo.com>
10
Reviewed-by: John Snow <jsnow@redhat.com>
47
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
11
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
48
---
12
---
49
docs/devel/testing.rst | 50 +++++++++-
13
tests/qemu-iotests/pylintrc | 2 ++
50
tests/qemu-iotests/findtests.py | 159 ++++++++++++++++++++++++++++++++
14
1 file changed, 2 insertions(+)
51
2 files changed, 208 insertions(+), 1 deletion(-)
52
create mode 100644 tests/qemu-iotests/findtests.py
53
15
54
diff --git a/docs/devel/testing.rst b/docs/devel/testing.rst
16
diff --git a/tests/qemu-iotests/pylintrc b/tests/qemu-iotests/pylintrc
55
index XXXXXXX..XXXXXXX 100644
17
index XXXXXXX..XXXXXXX 100644
56
--- a/docs/devel/testing.rst
18
--- a/tests/qemu-iotests/pylintrc
57
+++ b/docs/devel/testing.rst
19
+++ b/tests/qemu-iotests/pylintrc
58
@@ -XXX,XX +XXX,XX @@ check-block
20
@@ -XXX,XX +XXX,XX @@ disable=invalid-name,
59
-----------
21
unsubscriptable-object,
60
22
# These are temporary, and should be removed:
61
``make check-block`` runs a subset of the block layer iotests (the tests that
23
missing-docstring,
62
-are in the "auto" group in ``tests/qemu-iotests/group``).
24
+ too-many-return-statements,
63
+are in the "auto" group).
25
+ too-many-statements
64
See the "QEMU iotests" section below for more information.
26
65
27
[FORMAT]
66
GCC gcov support
28
67
@@ -XXX,XX +XXX,XX @@ another application on the host may have locked the file, possibly leading to a
68
test failure. If using such devices are explicitly desired, consider adding
69
``locking=off`` option to disable image locking.
70
71
+Test case groups
72
+----------------
73
+
74
+"Tests may belong to one or more test groups, which are defined in the form
75
+of a comment in the test source file. By convention, test groups are listed
76
+in the second line of the test file, after the "#!/..." line, like this:
77
+
78
+.. code::
79
+
80
+ #!/usr/bin/env python3
81
+ # group: auto quick
82
+ #
83
+ ...
84
+
85
+Another way of defining groups is creating the tests/qemu-iotests/group.local
86
+file. This should be used only for downstream (this file should never appear
87
+in upstream). This file may be used for defining some downstream test groups
88
+or for temporarily disabling tests, like this:
89
+
90
+.. code::
91
+
92
+ # groups for some company downstream process
93
+ #
94
+ # ci - tests to run on build
95
+ # down - our downstream tests, not for upstream
96
+ #
97
+ # Format of each line is:
98
+ # TEST_NAME TEST_GROUP [TEST_GROUP ]...
99
+
100
+ 013 ci
101
+ 210 disabled
102
+ 215 disabled
103
+ our-ugly-workaround-test down ci
104
+
105
+Note that the following group names have a special meaning:
106
+
107
+- quick: Tests in this group should finish within a few seconds.
108
+
109
+- auto: Tests in this group are used during "make check" and should be
110
+ runnable in any case. That means they should run with every QEMU binary
111
+ (also non-x86), with every QEMU configuration (i.e. must not fail if
112
+ an optional feature is not compiled in - but reporting a "skip" is ok),
113
+ work at least with the qcow2 file format, work with all kind of host
114
+ filesystems and users (e.g. "nobody" or "root") and must not take too
115
+ much memory and disk space (since CI pipelines tend to fail otherwise).
116
+
117
+- disabled: Tests in this group are disabled and ignored by check.
118
+
119
.. _docker-ref:
120
121
Docker based tests
122
diff --git a/tests/qemu-iotests/findtests.py b/tests/qemu-iotests/findtests.py
123
new file mode 100644
124
index XXXXXXX..XXXXXXX
125
--- /dev/null
126
+++ b/tests/qemu-iotests/findtests.py
127
@@ -XXX,XX +XXX,XX @@
128
+# TestFinder class, define set of tests to run.
129
+#
130
+# Copyright (c) 2020-2021 Virtuozzo International GmbH
131
+#
132
+# This program is free software; you can redistribute it and/or modify
133
+# it under the terms of the GNU General Public License as published by
134
+# the Free Software Foundation; either version 2 of the License, or
135
+# (at your option) any later version.
136
+#
137
+# This program is distributed in the hope that it will be useful,
138
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
139
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
140
+# GNU General Public License for more details.
141
+#
142
+# You should have received a copy of the GNU General Public License
143
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
144
+#
145
+
146
+import os
147
+import glob
148
+import re
149
+from collections import defaultdict
150
+from contextlib import contextmanager
151
+from typing import Optional, List, Iterator, Set
152
+
153
+
154
+@contextmanager
155
+def chdir(path: Optional[str] = None) -> Iterator[None]:
156
+ if path is None:
157
+ yield
158
+ return
159
+
160
+ saved_dir = os.getcwd()
161
+ os.chdir(path)
162
+ try:
163
+ yield
164
+ finally:
165
+ os.chdir(saved_dir)
166
+
167
+
168
+class TestFinder:
169
+ def __init__(self, test_dir: Optional[str] = None) -> None:
170
+ self.groups = defaultdict(set)
171
+
172
+ with chdir(test_dir):
173
+ self.all_tests = glob.glob('[0-9][0-9][0-9]')
174
+ self.all_tests += [f for f in glob.iglob('tests/*')
175
+ if not f.endswith('.out') and
176
+ os.path.isfile(f + '.out')]
177
+
178
+ for t in self.all_tests:
179
+ with open(t, encoding="utf-8") as f:
180
+ for line in f:
181
+ if line.startswith('# group: '):
182
+ for g in line.split()[2:]:
183
+ self.groups[g].add(t)
184
+ break
185
+
186
+ def add_group_file(self, fname: str) -> None:
187
+ with open(fname, encoding="utf-8") as f:
188
+ for line in f:
189
+ line = line.strip()
190
+
191
+ if (not line) or line[0] == '#':
192
+ continue
193
+
194
+ words = line.split()
195
+ test_file = self.parse_test_name(words[0])
196
+ groups = words[1:]
197
+
198
+ for g in groups:
199
+ self.groups[g].add(test_file)
200
+
201
+ def parse_test_name(self, name: str) -> str:
202
+ if '/' in name:
203
+ raise ValueError('Paths are unsupported for test selection, '
204
+ f'requiring "{name}" is wrong')
205
+
206
+ if re.fullmatch(r'\d+', name):
207
+ # Numbered tests are old naming convention. We should convert them
208
+ # to three-digit-length, like 1 --> 001.
209
+ name = f'{int(name):03}'
210
+ else:
211
+ # Named tests all should be in tests/ subdirectory
212
+ name = os.path.join('tests', name)
213
+
214
+ if name not in self.all_tests:
215
+ raise ValueError(f'Test "{name}" is not found')
216
+
217
+ return name
218
+
219
+ def find_tests(self, groups: Optional[List[str]] = None,
220
+ exclude_groups: Optional[List[str]] = None,
221
+ tests: Optional[List[str]] = None,
222
+ start_from: Optional[str] = None) -> List[str]:
223
+ """Find tests
224
+
225
+ Algorithm:
226
+
227
+ 1. a. if some @groups specified
228
+ a.1 Take all tests from @groups
229
+ a.2 Drop tests, which are in at least one of @exclude_groups or in
230
+ 'disabled' group (if 'disabled' is not listed in @groups)
231
+ a.3 Add tests from @tests (don't exclude anything from them)
232
+
233
+ b. else, if some @tests specified:
234
+ b.1 exclude_groups must be not specified, so just take @tests
235
+
236
+ c. else (only @exclude_groups list is non-empty):
237
+ c.1 Take all tests
238
+ c.2 Drop tests, which are in at least one of @exclude_groups or in
239
+ 'disabled' group
240
+
241
+ 2. sort
242
+
243
+ 3. If start_from specified, drop tests from first one to @start_from
244
+ (not inclusive)
245
+ """
246
+ if groups is None:
247
+ groups = []
248
+ if exclude_groups is None:
249
+ exclude_groups = []
250
+ if tests is None:
251
+ tests = []
252
+
253
+ res: Set[str] = set()
254
+ if groups:
255
+ # Some groups specified. exclude_groups supported, additionally
256
+ # selecting some individual tests supported as well.
257
+ res.update(*(self.groups[g] for g in groups))
258
+ elif tests:
259
+ # Some individual tests specified, but no groups. In this case
260
+ # we don't support exclude_groups.
261
+ if exclude_groups:
262
+ raise ValueError("Can't exclude from individually specified "
263
+ "tests.")
264
+ else:
265
+ # No tests no groups: start from all tests, exclude_groups
266
+ # supported.
267
+ res.update(self.all_tests)
268
+
269
+ if 'disabled' not in groups and 'disabled' not in exclude_groups:
270
+ # Don't want to modify function argument, so create new list.
271
+ exclude_groups = exclude_groups + ['disabled']
272
+
273
+ res = res.difference(*(self.groups[g] for g in exclude_groups))
274
+
275
+ # We want to add @tests. But for compatibility with old test names,
276
+ # we should convert any number < 100 to number padded by
277
+ # leading zeroes, like 1 -> 001 and 23 -> 023.
278
+ for t in tests:
279
+ res.add(self.parse_test_name(t))
280
+
281
+ sequence = sorted(res)
282
+
283
+ if start_from is not None:
284
+ del sequence[:sequence.index(self.parse_test_name(start_from))]
285
+
286
+ return sequence
287
--
29
--
288
2.29.2
30
2.29.2
289
31
290
32
diff view generated by jsdifflib
1
From: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
1
If the qemu-system-{arch} binary for the host architecture can't be
2
found, the old 'check' implementation selected the alphabetically first
3
system emulator binary that it could find. The new Python implementation
4
just uses the first result of glob.iglob(), which has an undefined
5
order.
2
6
3
Add TestEnv class, which will handle test environment in a new python
7
This is a problem that breaks CI because the iotests aren't actually
4
iotests running framework.
8
prepared to run on any emulator. They should be, so this is really a bug
9
in the failing test cases that should be fixed there, but as a quick
10
fix, let's revert to the old behaviour to let CI runs succeed again.
5
11
6
Don't add compat=1.1 for qcow2 IMGOPTS, as v3 is default anyway.
12
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
7
13
Message-Id: <20210202142802.119999-1-kwolf@redhat.com>
8
Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
14
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
9
Message-Id: <20210125185056.129513-4-vsementsov@virtuozzo.com>
15
Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>
16
Reviewed-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
17
Reviewed-by: Eric Blake <eblake@redhat.com>
10
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
18
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
11
---
19
---
12
tests/qemu-iotests/testenv.py | 281 ++++++++++++++++++++++++++++++++++
20
tests/qemu-iotests/testenv.py | 2 +-
13
1 file changed, 281 insertions(+)
21
1 file changed, 1 insertion(+), 1 deletion(-)
14
create mode 100644 tests/qemu-iotests/testenv.py
15
22
16
diff --git a/tests/qemu-iotests/testenv.py b/tests/qemu-iotests/testenv.py
23
diff --git a/tests/qemu-iotests/testenv.py b/tests/qemu-iotests/testenv.py
17
new file mode 100644
24
index XXXXXXX..XXXXXXX 100644
18
index XXXXXXX..XXXXXXX
25
--- a/tests/qemu-iotests/testenv.py
19
--- /dev/null
20
+++ b/tests/qemu-iotests/testenv.py
26
+++ b/tests/qemu-iotests/testenv.py
21
@@ -XXX,XX +XXX,XX @@
27
@@ -XXX,XX +XXX,XX @@ class TestEnv(ContextManager['TestEnv']):
22
+# TestEnv class to manage test environment variables.
28
if not os.path.exists(self.qemu_prog):
23
+#
29
pattern = root('qemu-system-*')
24
+# Copyright (c) 2020-2021 Virtuozzo International GmbH
30
try:
25
+#
31
- progs = glob.iglob(pattern)
26
+# This program is free software; you can redistribute it and/or modify
32
+ progs = sorted(glob.iglob(pattern))
27
+# it under the terms of the GNU General Public License as published by
33
self.qemu_prog = next(p for p in progs if isxfile(p))
28
+# the Free Software Foundation; either version 2 of the License, or
34
except StopIteration:
29
+# (at your option) any later version.
35
sys.exit("Not found any Qemu executable binary by pattern "
30
+#
31
+# This program is distributed in the hope that it will be useful,
32
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
33
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
34
+# GNU General Public License for more details.
35
+#
36
+# You should have received a copy of the GNU General Public License
37
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
38
+#
39
+
40
+import os
41
+import sys
42
+import tempfile
43
+from pathlib import Path
44
+import shutil
45
+import collections
46
+import random
47
+import subprocess
48
+import glob
49
+from typing import Dict, Any, Optional, ContextManager
50
+
51
+
52
+def isxfile(path: str) -> bool:
53
+ return os.path.isfile(path) and os.access(path, os.X_OK)
54
+
55
+
56
+def get_default_machine(qemu_prog: str) -> str:
57
+ outp = subprocess.run([qemu_prog, '-machine', 'help'], check=True,
58
+ universal_newlines=True,
59
+ stdout=subprocess.PIPE).stdout
60
+
61
+ machines = outp.split('\n')
62
+ try:
63
+ default_machine = next(m for m in machines if m.endswith(' (default)'))
64
+ except StopIteration:
65
+ return ''
66
+ default_machine = default_machine.split(' ', 1)[0]
67
+
68
+ alias_suf = ' (alias of {})'.format(default_machine)
69
+ alias = next((m for m in machines if m.endswith(alias_suf)), None)
70
+ if alias is not None:
71
+ default_machine = alias.split(' ', 1)[0]
72
+
73
+ return default_machine
74
+
75
+
76
+class TestEnv(ContextManager['TestEnv']):
77
+ """
78
+ Manage system environment for running tests
79
+
80
+ The following variables are supported/provided. They are represented by
81
+ lower-cased TestEnv attributes.
82
+ """
83
+
84
+ # We store environment variables as instance attributes, and there are a
85
+ # lot of them. Silence pylint:
86
+ # pylint: disable=too-many-instance-attributes
87
+
88
+ env_variables = ['PYTHONPATH', 'TEST_DIR', 'SOCK_DIR', 'SAMPLE_IMG_DIR',
89
+ 'OUTPUT_DIR', 'PYTHON', 'QEMU_PROG', 'QEMU_IMG_PROG',
90
+ 'QEMU_IO_PROG', 'QEMU_NBD_PROG', 'QSD_PROG',
91
+ 'SOCKET_SCM_HELPER', 'QEMU_OPTIONS', 'QEMU_IMG_OPTIONS',
92
+ 'QEMU_IO_OPTIONS', 'QEMU_IO_OPTIONS_NO_FMT',
93
+ 'QEMU_NBD_OPTIONS', 'IMGOPTS', 'IMGFMT', 'IMGPROTO',
94
+ 'AIOMODE', 'CACHEMODE', 'VALGRIND_QEMU',
95
+ 'CACHEMODE_IS_DEFAULT', 'IMGFMT_GENERIC', 'IMGOPTSSYNTAX',
96
+ 'IMGKEYSECRET', 'QEMU_DEFAULT_MACHINE', 'MALLOC_PERTURB_']
97
+
98
+ def get_env(self) -> Dict[str, str]:
99
+ env = {}
100
+ for v in self.env_variables:
101
+ val = getattr(self, v.lower(), None)
102
+ if val is not None:
103
+ env[v] = val
104
+
105
+ return env
106
+
107
+ def init_directories(self) -> None:
108
+ """Init directory variables:
109
+ PYTHONPATH
110
+ TEST_DIR
111
+ SOCK_DIR
112
+ SAMPLE_IMG_DIR
113
+ OUTPUT_DIR
114
+ """
115
+ self.pythonpath = os.getenv('PYTHONPATH')
116
+ if self.pythonpath:
117
+ self.pythonpath = self.source_iotests + os.pathsep + \
118
+ self.pythonpath
119
+ else:
120
+ self.pythonpath = self.source_iotests
121
+
122
+ self.test_dir = os.getenv('TEST_DIR',
123
+ os.path.join(os.getcwd(), 'scratch'))
124
+ Path(self.test_dir).mkdir(parents=True, exist_ok=True)
125
+
126
+ try:
127
+ self.sock_dir = os.environ['SOCK_DIR']
128
+ self.tmp_sock_dir = False
129
+ Path(self.test_dir).mkdir(parents=True, exist_ok=True)
130
+ except KeyError:
131
+ self.sock_dir = tempfile.mkdtemp()
132
+ self.tmp_sock_dir = True
133
+
134
+ self.sample_img_dir = os.getenv('SAMPLE_IMG_DIR',
135
+ os.path.join(self.source_iotests,
136
+ 'sample_images'))
137
+
138
+ self.output_dir = os.getcwd() # OUTPUT_DIR
139
+
140
+ def init_binaries(self) -> None:
141
+ """Init binary path variables:
142
+ PYTHON (for bash tests)
143
+ QEMU_PROG, QEMU_IMG_PROG, QEMU_IO_PROG, QEMU_NBD_PROG, QSD_PROG
144
+ SOCKET_SCM_HELPER
145
+ """
146
+ self.python = sys.executable
147
+
148
+ def root(*names: str) -> str:
149
+ return os.path.join(self.build_root, *names)
150
+
151
+ arch = os.uname().machine
152
+ if 'ppc64' in arch:
153
+ arch = 'ppc64'
154
+
155
+ self.qemu_prog = os.getenv('QEMU_PROG', root(f'qemu-system-{arch}'))
156
+ if not os.path.exists(self.qemu_prog):
157
+ pattern = root('qemu-system-*')
158
+ try:
159
+ progs = glob.iglob(pattern)
160
+ self.qemu_prog = next(p for p in progs if isxfile(p))
161
+ except StopIteration:
162
+ sys.exit("Not found any Qemu executable binary by pattern "
163
+ f"'{pattern}'")
164
+
165
+ self.qemu_img_prog = os.getenv('QEMU_IMG_PROG', root('qemu-img'))
166
+ self.qemu_io_prog = os.getenv('QEMU_IO_PROG', root('qemu-io'))
167
+ self.qemu_nbd_prog = os.getenv('QEMU_NBD_PROG', root('qemu-nbd'))
168
+ self.qsd_prog = os.getenv('QSD_PROG', root('storage-daemon',
169
+ 'qemu-storage-daemon'))
170
+
171
+ for b in [self.qemu_img_prog, self.qemu_io_prog, self.qemu_nbd_prog,
172
+ self.qemu_prog, self.qsd_prog]:
173
+ if not os.path.exists(b):
174
+ sys.exit('No such file: ' + b)
175
+ if not isxfile(b):
176
+ sys.exit('Not executable: ' + b)
177
+
178
+ helper_path = os.path.join(self.build_iotests, 'socket_scm_helper')
179
+ if isxfile(helper_path):
180
+ self.socket_scm_helper = helper_path # SOCKET_SCM_HELPER
181
+
182
+ def __init__(self, imgfmt: str, imgproto: str, aiomode: str,
183
+ cachemode: Optional[str] = None,
184
+ imgopts: Optional[str] = None,
185
+ misalign: bool = False,
186
+ debug: bool = False,
187
+ valgrind: bool = False) -> None:
188
+ self.imgfmt = imgfmt
189
+ self.imgproto = imgproto
190
+ self.aiomode = aiomode
191
+ self.imgopts = imgopts
192
+ self.misalign = misalign
193
+ self.debug = debug
194
+
195
+ if valgrind:
196
+ self.valgrind_qemu = 'y'
197
+
198
+ if cachemode is None:
199
+ self.cachemode_is_default = 'true'
200
+ self.cachemode = 'writeback'
201
+ else:
202
+ self.cachemode_is_default = 'false'
203
+ self.cachemode = cachemode
204
+
205
+ # Initialize generic paths: build_root, build_iotests, source_iotests,
206
+ # which are needed to initialize some environment variables. They are
207
+ # used by init_*() functions as well.
208
+
209
+ if os.path.islink(sys.argv[0]):
210
+ # called from the build tree
211
+ self.source_iotests = os.path.dirname(os.readlink(sys.argv[0]))
212
+ self.build_iotests = os.path.dirname(os.path.abspath(sys.argv[0]))
213
+ else:
214
+ # called from the source tree
215
+ self.source_iotests = os.getcwd()
216
+ self.build_iotests = self.source_iotests
217
+
218
+ self.build_root = os.path.join(self.build_iotests, '..', '..')
219
+
220
+ self.init_directories()
221
+ self.init_binaries()
222
+
223
+ self.malloc_perturb_ = os.getenv('MALLOC_PERTURB_',
224
+ str(random.randrange(1, 255)))
225
+
226
+ # QEMU_OPTIONS
227
+ self.qemu_options = '-nodefaults -display none -accel qtest'
228
+ machine_map = (
229
+ ('arm', 'virt'),
230
+ ('aarch64', 'virt'),
231
+ ('avr', 'mega2560'),
232
+ ('rx', 'gdbsim-r5f562n8'),
233
+ ('tricore', 'tricore_testboard')
234
+ )
235
+ for suffix, machine in machine_map:
236
+ if self.qemu_prog.endswith(f'qemu-system-{suffix}'):
237
+ self.qemu_options += f' -machine {machine}'
238
+
239
+ # QEMU_DEFAULT_MACHINE
240
+ self.qemu_default_machine = get_default_machine(self.qemu_prog)
241
+
242
+ self.qemu_img_options = os.getenv('QEMU_IMG_OPTIONS')
243
+ self.qemu_nbd_options = os.getenv('QEMU_NBD_OPTIONS')
244
+
245
+ is_generic = self.imgfmt not in ['bochs', 'cloop', 'dmg']
246
+ self.imgfmt_generic = 'true' if is_generic else 'false'
247
+
248
+ self.qemu_io_options = f'--cache {self.cachemode} --aio {self.aiomode}'
249
+ if self.misalign:
250
+ self.qemu_io_options += ' --misalign'
251
+
252
+ self.qemu_io_options_no_fmt = self.qemu_io_options
253
+
254
+ if self.imgfmt == 'luks':
255
+ self.imgoptssyntax = 'true'
256
+ self.imgkeysecret = '123456'
257
+ if not self.imgopts:
258
+ self.imgopts = 'iter-time=10'
259
+ elif 'iter-time=' not in self.imgopts:
260
+ self.imgopts += ',iter-time=10'
261
+ else:
262
+ self.imgoptssyntax = 'false'
263
+ self.qemu_io_options += ' -f ' + self.imgfmt
264
+
265
+ if self.imgfmt == 'vmdk':
266
+ if not self.imgopts:
267
+ self.imgopts = 'zeroed_grain=on'
268
+ elif 'zeroed_grain=' not in self.imgopts:
269
+ self.imgopts += ',zeroed_grain=on'
270
+
271
+ def close(self) -> None:
272
+ if self.tmp_sock_dir:
273
+ shutil.rmtree(self.sock_dir)
274
+
275
+ def __enter__(self) -> 'TestEnv':
276
+ return self
277
+
278
+ def __exit__(self, exc_type: Any, exc_value: Any, traceback: Any) -> None:
279
+ self.close()
280
+
281
+ def print_env(self) -> None:
282
+ template = """\
283
+QEMU -- "{QEMU_PROG}" {QEMU_OPTIONS}
284
+QEMU_IMG -- "{QEMU_IMG_PROG}" {QEMU_IMG_OPTIONS}
285
+QEMU_IO -- "{QEMU_IO_PROG}" {QEMU_IO_OPTIONS}
286
+QEMU_NBD -- "{QEMU_NBD_PROG}" {QEMU_NBD_OPTIONS}
287
+IMGFMT -- {IMGFMT}{imgopts}
288
+IMGPROTO -- {IMGPROTO}
289
+PLATFORM -- {platform}
290
+TEST_DIR -- {TEST_DIR}
291
+SOCK_DIR -- {SOCK_DIR}
292
+SOCKET_SCM_HELPER -- {SOCKET_SCM_HELPER}"""
293
+
294
+ args = collections.defaultdict(str, self.get_env())
295
+
296
+ if 'IMGOPTS' in args:
297
+ args['imgopts'] = f" ({args['IMGOPTS']})"
298
+
299
+ u = os.uname()
300
+ args['platform'] = f'{u.sysname}/{u.machine} {u.nodename} {u.release}'
301
+
302
+ print(template.format_map(args))
303
--
36
--
304
2.29.2
37
2.29.2
305
38
306
39
diff view generated by jsdifflib
1
From: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
1
From: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
2
2
3
Just use classes introduced in previous three commits. Behavior
3
We should indicate failure by exit code, not only output.
4
difference is described in these three commits.
5
4
6
Drop group file, as it becomes unused.
5
Reported-by: Peter Maydell
7
6
Fixes: f203080bbd9f9e5b31041b1f2afcd6040c5aaec5
8
Drop common.env: now check is in python, and for tests we use same
9
python interpreter that runs the check itself. Use build environment
10
PYTHON in check-block instead, to keep "make check" use the same
11
python.
12
13
Checking for virtio-blk moved to iotests.py, as it actually iotests.py
14
dependency. Actually not all python iotests depend on it, so in future
15
it may be refactored to checked only when really needed.
16
17
Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
7
Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
18
Message-Id: <20210125185056.129513-6-vsementsov@virtuozzo.com>
8
Message-Id: <20210201085041.3079-1-vsementsov@virtuozzo.com>
19
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
9
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
20
---
10
---
21
tests/qemu-iotests/iotests.py | 8 +
11
tests/qemu-iotests/testrunner.py | 4 +++-
22
Makefile | 1 -
12
tests/qemu-iotests/check | 5 ++++-
23
tests/check-block.sh | 3 +-
13
2 files changed, 7 insertions(+), 2 deletions(-)
24
tests/qemu-iotests/check | 1095 ++++--------------------------
25
tests/qemu-iotests/common.env.in | 3 -
26
tests/qemu-iotests/group | 323 ---------
27
tests/qemu-iotests/meson.build | 3 -
28
7 files changed, 139 insertions(+), 1297 deletions(-)
29
delete mode 100644 tests/qemu-iotests/common.env.in
30
delete mode 100644 tests/qemu-iotests/group
31
14
32
diff --git a/tests/qemu-iotests/iotests.py b/tests/qemu-iotests/iotests.py
15
diff --git a/tests/qemu-iotests/testrunner.py b/tests/qemu-iotests/testrunner.py
33
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
34
--- a/tests/qemu-iotests/iotests.py
17
--- a/tests/qemu-iotests/testrunner.py
35
+++ b/tests/qemu-iotests/iotests.py
18
+++ b/tests/qemu-iotests/testrunner.py
36
@@ -XXX,XX +XXX,XX @@ def _verify_formats(required_formats: Sequence[str] = ()) -> None:
19
@@ -XXX,XX +XXX,XX @@ class TestRunner(ContextManager['TestRunner']):
37
if usf_list:
20
38
notrun(f'formats {usf_list} are not whitelisted')
21
return res
39
22
40
+
23
- def run_tests(self, tests: List[str]) -> None:
41
+def _verify_virtio_blk() -> None:
24
+ def run_tests(self, tests: List[str]) -> bool:
42
+ out = qemu_pipe('-M', 'none', '-device', 'help')
25
n_run = 0
43
+ if 'virtio-blk' not in out:
26
failed = []
44
+ notrun('Missing virtio-blk in QEMU binary')
27
notrun = []
45
+
28
@@ -XXX,XX +XXX,XX @@ class TestRunner(ContextManager['TestRunner']):
46
+
29
if failed:
47
def supports_quorum():
30
print('Failures:', ' '.join(failed))
48
return 'quorum' in qemu_img_pipe('--help')
31
print(f'Failed {len(failed)} of {n_run} iotests')
49
32
+ return False
50
@@ -XXX,XX +XXX,XX @@ def execute_setup_common(supported_fmts: Sequence[str] = (),
33
else:
51
_verify_cache_mode(supported_cache_modes)
34
print(f'Passed all {n_run} iotests')
52
_verify_aio_mode(supported_aio_modes)
35
+ return True
53
_verify_formats(required_fmts)
54
+ _verify_virtio_blk()
55
56
return debug
57
58
diff --git a/Makefile b/Makefile
59
index XXXXXXX..XXXXXXX 100644
60
--- a/Makefile
61
+++ b/Makefile
62
@@ -XXX,XX +XXX,XX @@ distclean: clean
63
    rm -f config-host.mak config-host.h*
64
    rm -f tests/tcg/config-*.mak
65
    rm -f config-all-disas.mak config.status
66
-    rm -f tests/qemu-iotests/common.env
67
    rm -f roms/seabios/config.mak roms/vgabios/config.mak
68
    rm -f qemu-plugins-ld.symbols qemu-plugins-ld64.symbols
69
    rm -f *-config-target.h *-config-devices.mak *-config-devices.h
70
diff --git a/tests/check-block.sh b/tests/check-block.sh
71
index XXXXXXX..XXXXXXX 100755
72
--- a/tests/check-block.sh
73
+++ b/tests/check-block.sh
74
@@ -XXX,XX +XXX,XX @@ cd tests/qemu-iotests
75
76
# QEMU_CHECK_BLOCK_AUTO is used to disable some unstable sub-tests
77
export QEMU_CHECK_BLOCK_AUTO=1
78
+export PYTHONUTF8=1
79
80
ret=0
81
for fmt in $format_list ; do
82
- ./check -makecheck -$fmt $group || ret=1
83
+ ${PYTHON} ./check -makecheck -$fmt $group || ret=1
84
done
85
86
exit $ret
87
diff --git a/tests/qemu-iotests/check b/tests/qemu-iotests/check
36
diff --git a/tests/qemu-iotests/check b/tests/qemu-iotests/check
88
index XXXXXXX..XXXXXXX 100755
37
index XXXXXXX..XXXXXXX 100755
89
--- a/tests/qemu-iotests/check
38
--- a/tests/qemu-iotests/check
90
+++ b/tests/qemu-iotests/check
39
+++ b/tests/qemu-iotests/check
91
@@ -XXX,XX +XXX,XX @@
40
@@ -XXX,XX +XXX,XX @@ if __name__ == '__main__':
92
-#!/usr/bin/env bash
41
else:
93
+#!/usr/bin/env python3
42
with TestRunner(env, makecheck=args.makecheck,
94
#
43
color=args.color) as tr:
95
-# Copyright (C) 2009 Red Hat, Inc.
44
- tr.run_tests([os.path.join(env.source_iotests, t) for t in tests])
96
-# Copyright (c) 2000-2002,2006 Silicon Graphics, Inc. All Rights Reserved.
45
+ paths = [os.path.join(env.source_iotests, t) for t in tests]
97
+# Configure environment and run group of tests in it.
46
+ ok = tr.run_tests(paths)
98
+#
47
+ if not ok:
99
+# Copyright (c) 2020-2021 Virtuozzo International GmbH
48
+ sys.exit(1)
100
#
101
# This program is free software; you can redistribute it and/or
102
# modify it under the terms of the GNU General Public License as
103
@@ -XXX,XX +XXX,XX @@
104
#
105
# You should have received a copy of the GNU General Public License
106
# along with this program. If not, see <http://www.gnu.org/licenses/>.
107
-#
108
-#
109
-# Control script for QA
110
-#
111
-
112
-status=0
113
-needwrap=true
114
-try=0
115
-n_bad=0
116
-bad=""
117
-notrun=""
118
-casenotrun=""
119
-interrupt=true
120
-makecheck=false
121
-
122
-_init_error()
123
-{
124
- echo "check: $1" >&2
125
- exit 1
126
-}
127
-
128
-if [ -L "$0" ]
129
-then
130
- # called from the build tree
131
- source_iotests=$(dirname "$(readlink "$0")")
132
- if [ -z "$source_iotests" ]
133
- then
134
- _init_error "failed to obtain source tree name from check symlink"
135
- fi
136
- source_iotests=$(cd "$source_iotests"; pwd) || _init_error "failed to enter source tree"
137
- build_iotests=$(cd "$(dirname "$0")"; pwd)
138
-else
139
- # called from the source tree
140
- source_iotests=$PWD
141
- # this may be an in-tree build (note that in the following code we may not
142
- # assume that it truly is and have to test whether the build results
143
- # actually exist)
144
- build_iotests=$PWD
145
-fi
146
-
147
-build_root="$build_iotests/../.."
148
-
149
-# we need common.env
150
-if ! . "$build_iotests/common.env"
151
-then
152
- _init_error "failed to source common.env (make sure the qemu-iotests are run from tests/qemu-iotests in the build tree)"
153
-fi
154
-
155
-# we need common.config
156
-if ! . "$source_iotests/common.config"
157
-then
158
- _init_error "failed to source common.config"
159
-fi
160
-
161
-_full_imgfmt_details()
162
-{
163
- if [ -n "$IMGOPTS" ]; then
164
- echo "$IMGFMT ($IMGOPTS)"
165
- else
166
- echo "$IMGFMT"
167
- fi
168
-}
169
-
170
-_full_platform_details()
171
-{
172
- os=$(uname -s)
173
- host=$(hostname -s)
174
- kernel=$(uname -r)
175
- platform=$(uname -m)
176
- echo "$os/$platform $host $kernel"
177
-}
178
-
179
-_full_env_details()
180
-{
181
- cat <<EOF
182
-QEMU -- "$QEMU_PROG" $QEMU_OPTIONS
183
-QEMU_IMG -- "$QEMU_IMG_PROG" $QEMU_IMG_OPTIONS
184
-QEMU_IO -- "$QEMU_IO_PROG" $QEMU_IO_OPTIONS
185
-QEMU_NBD -- "$QEMU_NBD_PROG" $QEMU_NBD_OPTIONS
186
-IMGFMT -- $FULL_IMGFMT_DETAILS
187
-IMGPROTO -- $IMGPROTO
188
-PLATFORM -- $FULL_HOST_DETAILS
189
-TEST_DIR -- $TEST_DIR
190
-SOCK_DIR -- $SOCK_DIR
191
-SOCKET_SCM_HELPER -- $SOCKET_SCM_HELPER
192
-
193
-EOF
194
-}
195
-
196
-# $1 = prog to look for
197
-set_prog_path()
198
-{
199
- p=$(command -v $1 2> /dev/null)
200
- if [ -n "$p" -a -x "$p" ]; then
201
- type -p "$p"
202
- else
203
- return 1
204
- fi
205
-}
206
-
207
-if [ -z "$TEST_DIR" ]; then
208
- TEST_DIR=$PWD/scratch
209
-fi
210
-mkdir -p "$TEST_DIR" || _init_error 'Failed to create TEST_DIR'
211
-
212
-tmp_sock_dir=false
213
-if [ -z "$SOCK_DIR" ]; then
214
- SOCK_DIR=$(mktemp -d)
215
- tmp_sock_dir=true
216
-fi
217
-mkdir -p "$SOCK_DIR" || _init_error 'Failed to create SOCK_DIR'
218
-
219
-diff="diff -u"
220
-verbose=false
221
-debug=false
222
-group=false
223
-xgroup=false
224
-imgopts=false
225
-showme=false
226
-sortme=false
227
-expunge=true
228
-have_test_arg=false
229
-cachemode=false
230
-aiomode=false
231
-
232
-tmp="${TEST_DIR}"/$$
233
-rm -f $tmp.list $tmp.tmp $tmp.sed
234
-
235
-export IMGFMT=raw
236
-export IMGFMT_GENERIC=true
237
-export IMGPROTO=file
238
-export IMGOPTS=""
239
-export CACHEMODE="writeback"
240
-export AIOMODE="threads"
241
-export QEMU_IO_OPTIONS=""
242
-export QEMU_IO_OPTIONS_NO_FMT=""
243
-export CACHEMODE_IS_DEFAULT=true
244
-export VALGRIND_QEMU=
245
-export IMGKEYSECRET=
246
-export IMGOPTSSYNTAX=false
247
-
248
-# Save current tty settings, since an aborting qemu call may leave things
249
-# screwed up
250
-STTY_RESTORE=
251
-if test -t 0; then
252
- STTY_RESTORE=$(stty -g)
253
-fi
254
-
255
-for r
256
-do
257
-
258
- if $group
259
- then
260
- # arg after -g
261
- group_list=$(sed -n <"$source_iotests/group" -e 's/$/ /' -e "/^[0-9][0-9][0-9].* $r /"'{
262
-s/ .*//p
263
-}')
264
- if [ -z "$group_list" ]
265
- then
266
- echo "Group \"$r\" is empty or not defined?"
267
- exit 1
268
- fi
269
- [ ! -s $tmp.list ] && touch $tmp.list
270
- for t in $group_list
271
- do
272
- if grep -s "^$t\$" $tmp.list >/dev/null
273
- then
274
- :
275
- else
276
- echo "$t" >>$tmp.list
277
- fi
278
- done
279
- group=false
280
- continue
281
-
282
- elif $xgroup
283
- then
284
- # arg after -x
285
- # Populate $tmp.list with all tests
286
- awk '/^[0-9]{3,}/ {print $1}' "${source_iotests}/group" > $tmp.list 2>/dev/null
287
- group_list=$(sed -n <"$source_iotests/group" -e 's/$/ /' -e "/^[0-9][0-9][0-9].* $r /"'{
288
-s/ .*//p
289
-}')
290
- if [ -z "$group_list" ]
291
- then
292
- echo "Group \"$r\" is empty or not defined?"
293
- exit 1
294
- fi
295
- numsed=0
296
- rm -f $tmp.sed
297
- for t in $group_list
298
- do
299
- if [ $numsed -gt 100 ]
300
- then
301
- sed -f $tmp.sed <$tmp.list >$tmp.tmp
302
- mv $tmp.tmp $tmp.list
303
- numsed=0
304
- rm -f $tmp.sed
305
- fi
306
- echo "/^$t\$/d" >>$tmp.sed
307
- numsed=$(expr $numsed + 1)
308
- done
309
- sed -f $tmp.sed <$tmp.list >$tmp.tmp
310
- mv $tmp.tmp $tmp.list
311
- xgroup=false
312
- continue
313
-
314
- elif $imgopts
315
- then
316
- IMGOPTS="$r"
317
- imgopts=false
318
- continue
319
- elif $cachemode
320
- then
321
- CACHEMODE="$r"
322
- CACHEMODE_IS_DEFAULT=false
323
- cachemode=false
324
- continue
325
- elif $aiomode
326
- then
327
- AIOMODE="$r"
328
- aiomode=false
329
- continue
330
- fi
331
-
332
- xpand=true
333
- case "$r"
334
- in
335
-
336
- -\? | -h | --help) # usage
337
- echo "Usage: $0 [options] [testlist]"'
338
-
339
-common options
340
- -v verbose
341
- -d debug
342
-
343
-image format options
344
- -raw test raw (default)
345
- -bochs test bochs
346
- -cloop test cloop
347
- -parallels test parallels
348
- -qcow test qcow
349
- -qcow2 test qcow2
350
- -qed test qed
351
- -vdi test vdi
352
- -vpc test vpc
353
- -vhdx test vhdx
354
- -vmdk test vmdk
355
- -luks test luks
356
- -dmg test dmg
357
-
358
-image protocol options
359
- -file test file (default)
360
- -rbd test rbd
361
- -sheepdog test sheepdog
362
- -nbd test nbd
363
- -fuse test fuse
364
- -ssh test ssh
365
- -nfs test nfs
366
-
367
-other options
368
- -xdiff graphical mode diff
369
- -nocache use O_DIRECT on backing file
370
- -misalign misalign memory allocations
371
- -n show me, do not run tests
372
- -o options -o options to pass to qemu-img create/convert
373
- -c mode cache mode
374
- -i mode AIO mode
375
- -makecheck pretty print output for make check
376
-
377
-testlist options
378
- -g group[,group...] include tests from these groups
379
- -x group[,group...] exclude tests from these groups
380
- NNN include test NNN
381
- NNN-NNN include test range (eg. 012-021)
382
-'
383
- exit 0
384
- ;;
385
-
386
- -raw)
387
- IMGFMT=raw
388
- xpand=false
389
- ;;
390
-
391
- -bochs)
392
- IMGFMT=bochs
393
- IMGFMT_GENERIC=false
394
- xpand=false
395
- ;;
396
-
397
- -cloop)
398
- IMGFMT=cloop
399
- IMGFMT_GENERIC=false
400
- xpand=false
401
- ;;
402
-
403
- -parallels)
404
- IMGFMT=parallels
405
- xpand=false
406
- ;;
407
-
408
- -qcow)
409
- IMGFMT=qcow
410
- xpand=false
411
- ;;
412
-
413
- -qcow2)
414
- IMGFMT=qcow2
415
- xpand=false
416
- ;;
417
-
418
- -luks)
419
- IMGOPTSSYNTAX=true
420
- IMGFMT=luks
421
- IMGKEYSECRET=123456
422
- xpand=false
423
- ;;
424
-
425
- -dmg)
426
- IMGFMT=dmg
427
- IMGFMT_GENERIC=false
428
- xpand=false
429
- ;;
430
-
431
- -qed)
432
- IMGFMT=qed
433
- xpand=false
434
- ;;
435
-
436
- -vdi)
437
- IMGFMT=vdi
438
- xpand=false
439
- ;;
440
-
441
- -vmdk)
442
- IMGFMT=vmdk
443
- xpand=false
444
- ;;
445
-
446
- -vpc)
447
- IMGFMT=vpc
448
- xpand=false
449
- ;;
450
-
451
- -vhdx)
452
- IMGFMT=vhdx
453
- xpand=false
454
- ;;
455
-
456
- -file)
457
- IMGPROTO=file
458
- xpand=false
459
- ;;
460
-
461
- -rbd)
462
- IMGPROTO=rbd
463
- xpand=false
464
- ;;
465
-
466
- -sheepdog)
467
- IMGPROTO=sheepdog
468
- xpand=false
469
- ;;
470
-
471
- -nbd)
472
- IMGPROTO=nbd
473
- xpand=false
474
- ;;
475
-
476
- -fuse)
477
- IMGPROTO=fuse
478
- xpand=false
479
- ;;
480
-
481
- -ssh)
482
- IMGPROTO=ssh
483
- xpand=false
484
- ;;
485
-
486
- -nfs)
487
- IMGPROTO=nfs
488
- xpand=false
489
- ;;
490
-
491
- -nocache)
492
- CACHEMODE="none"
493
- CACHEMODE_IS_DEFAULT=false
494
- xpand=false
495
- ;;
496
-
497
- -misalign)
498
- QEMU_IO_OPTIONS="$QEMU_IO_OPTIONS --misalign"
499
- xpand=false
500
- ;;
501
-
502
- -valgrind)
503
- VALGRIND_QEMU='y'
504
- xpand=false
505
- ;;
506
-
507
- -g) # -g group ... pick from group file
508
- group=true
509
- xpand=false
510
- ;;
511
-
512
- -xdiff) # graphical diff mode
513
- xpand=false
514
-
515
- if [ ! -z "$DISPLAY" ]
516
- then
517
- command -v xdiff >/dev/null 2>&1 && diff=xdiff
518
- command -v gdiff >/dev/null 2>&1 && diff=gdiff
519
- command -v tkdiff >/dev/null 2>&1 && diff=tkdiff
520
- command -v xxdiff >/dev/null 2>&1 && diff=xxdiff
521
- fi
522
- ;;
523
- -makecheck) # makecheck friendly output
524
- makecheck=true
525
- xpand=false
526
- ;;
527
- -n) # show me, don't do it
528
- showme=true
529
- xpand=false
530
- ;;
531
- -o)
532
- imgopts=true
533
- xpand=false
534
- ;;
535
- -c)
536
- cachemode=true
537
- xpand=false
538
- ;;
539
- -i)
540
- aiomode=true
541
- xpand=false
542
- ;;
543
- -T) # deprecated timestamp option
544
- xpand=false
545
- ;;
546
- -v)
547
- verbose=true
548
- xpand=false
549
- ;;
550
- -d)
551
- debug=true
552
- xpand=false
553
- ;;
554
- -x) # -x group ... exclude from group file
555
- xgroup=true
556
- xpand=false
557
- ;;
558
- '[0-9][0-9][0-9] [0-9][0-9][0-9][0-9]')
559
- echo "No tests?"
560
- status=1
561
- exit $status
562
- ;;
563
-
564
- [0-9]*-[0-9]*)
565
- eval $(echo $r | sed -e 's/^/start=/' -e 's/-/ end=/')
566
- ;;
567
-
568
- [0-9]*-)
569
- eval $(echo $r | sed -e 's/^/start=/' -e 's/-//')
570
- end=$(echo [0-9][0-9][0-9] [0-9][0-9][0-9][0-9] | sed -e 's/\[0-9]//g' -e 's/ *$//' -e 's/.* //')
571
- if [ -z "$end" ]
572
- then
573
- echo "No tests in range \"$r\"?"
574
- status=1
575
- exit $status
576
- fi
577
- ;;
578
-
579
- *)
580
- start=$r
581
- end=$r
582
- ;;
583
-
584
- esac
585
-
586
- # get rid of leading 0s as can be interpreted as octal
587
- start=$(echo $start | sed 's/^0*//')
588
- end=$(echo $end | sed 's/^0*//')
589
-
590
- if $xpand
591
- then
592
- have_test_arg=true
593
- awk </dev/null '
594
-BEGIN { for (t='$start'; t<='$end'; t++) printf "%03d\n",t }' \
595
- | while read id
596
- do
597
- if grep -s "^$id\( \|\$\)" "$source_iotests/group" >/dev/null
598
- then
599
- # in group file ... OK
600
- echo $id >>$tmp.list
601
- else
602
- if [ -f expunged ] && $expunge && egrep "^$id([ ]|\$)" expunged >/dev/null
603
- then
604
- # expunged ... will be reported, but not run, later
605
- echo $id >>$tmp.list
606
- else
607
- # oops
608
- if [ "$start" == "$end" -a "$id" == "$end" ]
609
- then
610
- echo "$id - unknown test"
611
- exit 1
612
- else
613
- echo "$id - unknown test, ignored"
614
- fi
615
- fi
616
- fi
617
- done || exit 1
618
- fi
619
-
620
-done
621
-
622
-# Set qemu-io cache mode with $CACHEMODE we have
623
-QEMU_IO_OPTIONS="$QEMU_IO_OPTIONS --cache $CACHEMODE"
624
-# Set qemu-io aio mode with $AIOMODE we have
625
-QEMU_IO_OPTIONS="$QEMU_IO_OPTIONS --aio $AIOMODE"
626
-
627
-QEMU_IO_OPTIONS_NO_FMT="$QEMU_IO_OPTIONS"
628
-if [ "$IMGOPTSSYNTAX" != "true" ]; then
629
- QEMU_IO_OPTIONS="$QEMU_IO_OPTIONS -f $IMGFMT"
630
-fi
631
-
632
-# Set default options for qemu-img create -o if they were not specified
633
-if [ "$IMGFMT" == "qcow2" ] && ! (echo "$IMGOPTS" | grep "compat=" > /dev/null); then
634
- IMGOPTS=$(_optstr_add "$IMGOPTS" "compat=1.1")
635
-fi
636
-if [ "$IMGFMT" == "luks" ] && ! (echo "$IMGOPTS" | grep "iter-time=" > /dev/null); then
637
- IMGOPTS=$(_optstr_add "$IMGOPTS" "iter-time=10")
638
-fi
639
-if [ "$IMGFMT" == "vmdk" ] && ! (echo "$IMGOPTS" | grep "zeroed_grain=" > /dev/null); then
640
- IMGOPTS=$(_optstr_add "$IMGOPTS" "zeroed_grain=on")
641
-fi
642
-
643
-if [ -z "$SAMPLE_IMG_DIR" ]; then
644
- SAMPLE_IMG_DIR="$source_iotests/sample_images"
645
-fi
646
-
647
-export TEST_DIR
648
-export SOCK_DIR
649
-export SAMPLE_IMG_DIR
650
-
651
-if [ -s $tmp.list ]
652
-then
653
- # found some valid test numbers ... this is good
654
- :
655
-else
656
- if $have_test_arg
657
- then
658
- # had test numbers, but none in group file ... do nothing
659
- touch $tmp.list
660
- else
661
- # no test numbers, do everything from group file
662
- sed -n -e '/^[0-9][0-9][0-9]*/s/^\([0-9]*\).*/\1/p' <"$source_iotests/group" >$tmp.list
663
- fi
664
-fi
665
-
666
-# should be sort -n, but this did not work for Linux when this
667
-# was ported from IRIX
668
-#
669
-list=$(sort $tmp.list)
670
-rm -f $tmp.list $tmp.tmp $tmp.sed
671
-
672
-if [ -z "$QEMU_PROG" ]
673
-then
674
- if [ -x "$build_iotests/qemu" ]; then
675
- export QEMU_PROG="$build_iotests/qemu"
676
- elif [ -x "$build_root/qemu-system-${qemu_arch}" ]; then
677
- export QEMU_PROG="$build_root/qemu-system-${qemu_arch}"
678
- else
679
- pushd "$build_root" > /dev/null
680
- for binary in qemu-system-*
681
- do
682
- if [ -x "$binary" ]
683
- then
684
- export QEMU_PROG="$build_root/$binary"
685
- break
686
- fi
687
- done
688
- popd > /dev/null
689
- [ "$QEMU_PROG" = "" ] && _init_error "qemu not found"
690
- fi
691
-fi
692
-export QEMU_PROG="$(type -p "$QEMU_PROG")"
693
-
694
-export QEMU_OPTIONS="-nodefaults -display none -accel qtest"
695
-case "$QEMU_PROG" in
696
- *qemu-system-arm|*qemu-system-aarch64)
697
- export QEMU_OPTIONS="$QEMU_OPTIONS -machine virt"
698
- ;;
699
- *qemu-system-avr)
700
- export QEMU_OPTIONS="$QEMU_OPTIONS -machine mega2560"
701
- ;;
702
- *qemu-system-rx)
703
- export QEMU_OPTIONS="$QEMU_OPTIONS -machine gdbsim-r5f562n8"
704
- ;;
705
- *qemu-system-tricore)
706
- export QEMU_OPTIONS="-$QEMU_OPTIONS -machine tricore_testboard"
707
- ;;
708
-esac
709
-
710
-if [ -z "$QEMU_IMG_PROG" ]; then
711
- if [ -x "$build_iotests/qemu-img" ]; then
712
- export QEMU_IMG_PROG="$build_iotests/qemu-img"
713
- elif [ -x "$build_root/qemu-img" ]; then
714
- export QEMU_IMG_PROG="$build_root/qemu-img"
715
- else
716
- _init_error "qemu-img not found"
717
- fi
718
-fi
719
-export QEMU_IMG_PROG="$(type -p "$QEMU_IMG_PROG")"
720
-
721
-if [ -z "$QEMU_IO_PROG" ]; then
722
- if [ -x "$build_iotests/qemu-io" ]; then
723
- export QEMU_IO_PROG="$build_iotests/qemu-io"
724
- elif [ -x "$build_root/qemu-io" ]; then
725
- export QEMU_IO_PROG="$build_root/qemu-io"
726
- else
727
- _init_error "qemu-io not found"
728
- fi
729
-fi
730
-export QEMU_IO_PROG="$(type -p "$QEMU_IO_PROG")"
731
-
732
-if [ -z $QEMU_NBD_PROG ]; then
733
- if [ -x "$build_iotests/qemu-nbd" ]; then
734
- export QEMU_NBD_PROG="$build_iotests/qemu-nbd"
735
- elif [ -x "$build_root/qemu-nbd" ]; then
736
- export QEMU_NBD_PROG="$build_root/qemu-nbd"
737
- else
738
- _init_error "qemu-nbd not found"
739
- fi
740
-fi
741
-export QEMU_NBD_PROG="$(type -p "$QEMU_NBD_PROG")"
742
-
743
-if [ -z "$QSD_PROG" ]; then
744
- if [ -x "$build_iotests/qemu-storage-daemon" ]; then
745
- export QSD_PROG="$build_iotests/qemu-storage-daemon"
746
- elif [ -x "$build_root/storage-daemon/qemu-storage-daemon" ]; then
747
- export QSD_PROG="$build_root/storage-daemon/qemu-storage-daemon"
748
- else
749
- _init_error "qemu-storage-daemon not found"
750
- fi
751
-fi
752
-export QSD_PROG="$(type -p "$QSD_PROG")"
753
-
754
-if [ -x "$build_iotests/socket_scm_helper" ]
755
-then
756
- export SOCKET_SCM_HELPER="$build_iotests/socket_scm_helper"
757
-fi
758
-
759
-python_usable=false
760
-if $PYTHON -c 'import sys; sys.exit(0 if sys.version_info >= (3,6) else 1)'
761
-then
762
- # Our python framework also requires virtio-blk
763
- if "$QEMU_PROG" -M none -device help | grep -q virtio-blk >/dev/null 2>&1
764
- then
765
- python_usable=true
766
- else
767
- python_unusable_because="Missing virtio-blk in QEMU binary"
768
- fi
769
-else
770
- python_unusable_because="Unsupported Python version"
771
-fi
772
-
773
-default_machine=$($QEMU_PROG -machine help | sed -n '/(default)/ s/ .*//p')
774
-default_alias_machine=$($QEMU_PROG -machine help | \
775
- sed -n "/(alias of $default_machine)/ { s/ .*//p; q; }")
776
-if [[ "$default_alias_machine" ]]; then
777
- default_machine="$default_alias_machine"
778
-fi
779
-
780
-export QEMU_DEFAULT_MACHINE="$default_machine"
781
-
782
-TIMESTAMP_FILE=check.time-$IMGPROTO-$IMGFMT
783
-
784
-_wallclock()
785
-{
786
- date "+%H %M %S" | awk '{ print $1*3600 + $2*60 + $3 }'
787
-}
788
-
789
-_wrapup()
790
-{
791
- if $showme
792
- then
793
- :
794
- elif $needwrap
795
- then
796
- if [ -f $TIMESTAMP_FILE -a -f $tmp.time ]
797
- then
798
- cat $TIMESTAMP_FILE $tmp.time \
799
- | awk '
800
- { t[$1] = $2 }
801
-END { if (NR > 0) {
802
- for (i in t) print i " " t[i]
803
- }
804
- }' \
805
- | sort -n >$tmp.out
806
- mv $tmp.out $TIMESTAMP_FILE
807
- fi
808
-
809
- if [ -f $tmp.expunged ]
810
- then
811
- notrun=$(wc -l <$tmp.expunged | sed -e 's/ *//g')
812
- try=$(expr $try - $notrun)
813
- list=$(echo "$list" | sed -f $tmp.expunged)
814
- fi
815
-
816
- echo "" >>check.log
817
- date >>check.log
818
- echo $list | fmt | sed -e 's/^/ /' >>check.log
819
- $interrupt && echo "Interrupted!" >>check.log
820
-
821
- if [ ! -z "$notrun" ]
822
- then
823
- echo "Not run:$notrun"
824
- echo "Not run:$notrun" >>check.log
825
- fi
826
- if [ ! -z "$casenotrun" ]
827
- then
828
- echo "Some cases not run in:$casenotrun"
829
- echo "Some cases not run in:$casenotrun" >>check.log
830
- fi
831
- if [ ! -z "$n_bad" -a $n_bad != 0 ]
832
- then
833
- echo "Failures:$bad"
834
- echo "Failed $n_bad of $try iotests"
835
- echo "Failures:$bad" | fmt >>check.log
836
- echo "Failed $n_bad of $try iotests" >>check.log
837
- else
838
- echo "Passed all $try iotests"
839
- echo "Passed all $try iotests" >>check.log
840
- fi
841
- needwrap=false
842
- fi
843
-
844
- if test -n "$STTY_RESTORE"; then
845
- stty $STTY_RESTORE
846
- fi
847
- rm -f "${TEST_DIR}"/*.out "${TEST_DIR}"/*.err "${TEST_DIR}"/*.time
848
- rm -f "${TEST_DIR}"/check.pid "${TEST_DIR}"/check.sts
849
- rm -f $tmp.*
850
-
851
- if $tmp_sock_dir
852
- then
853
- rm -rf "$SOCK_DIR"
854
- fi
855
-}
856
-
857
-trap "_wrapup; exit \$status" 0 1 2 3 15
858
-
859
-# Report the test start and results. For makecheck we want to pretty
860
-# print the whole report at the end of the execution.
861
-# args: $seq, $starttime, $lasttime
862
-_report_test_start()
863
-{
864
- if ! $makecheck; then
865
- if [ -n "$3" ]; then
866
- local lasttime=" (last: $3s)"
867
- fi
868
- printf "%-8s %-10s [%s] %4s%-14s\r" "$1" "..." "$2" "..." "$lasttime"
869
- fi
870
-}
871
-# args:$seq $status $starttime $lasttime $thistime $details
872
-_report_test_result()
873
-{
874
- local status lasttime thistime
875
- if $makecheck; then
876
- if [ -n "$2" ] && [ "$2" != "pass" ]; then
877
- status=" [$2]"
878
- fi
879
- printf " TEST iotest-$IMGFMT: %s%s\n" "$1" "$status"
880
- return
881
- fi
882
-
883
- if [ -n "$4" ]; then
884
- lasttime=" (last: $4s)"
885
- fi
886
- if [ -n "$5" ]; then
887
- thistime=" $5s"
888
- fi
889
- case "$2" in
890
- "pass") status=$(printf "\e[32m%-10s\e[0m" "$2") ;;
891
- "fail") status=$(printf "\e[1m\e[31m%-10s\e[0m" "$2") ;;
892
- "not run") status=$(printf "\e[33m%-10s\e[0m" "$2") ;;
893
- *) status=$(printf "%-10s" "$2") ;;
894
- esac
895
-
896
- printf "%-8s %s [%s] [%s] %4s%-14s %s\n" "$1" "$status" "$3" "$(date '+%T')" "$thistime" "$lasttime" "$6"
897
-}
898
-
899
-[ -f $TIMESTAMP_FILE ] || touch $TIMESTAMP_FILE
900
-
901
-FULL_IMGFMT_DETAILS=$(_full_imgfmt_details)
902
-FULL_HOST_DETAILS=$(_full_platform_details)
903
-
904
-if ! $makecheck; then
905
- _full_env_details
906
-fi
907
-
908
-seq="check"
909
-
910
-[ -n "$TESTS_REMAINING_LOG" ] && echo $list > $TESTS_REMAINING_LOG
911
-
912
-for seq in $list
913
-do
914
- err=false # error flag
915
- printdiff=false # show diff to reference output?
916
- status="" # test result summary
917
- results="" # test result details
918
- thistime="" # time the test took
919
-
920
- if [ -n "$TESTS_REMAINING_LOG" ] ; then
921
- sed -e "s/$seq//" -e 's/ / /' -e 's/^ *//' $TESTS_REMAINING_LOG > $TESTS_REMAINING_LOG.tmp
922
- mv $TESTS_REMAINING_LOG.tmp $TESTS_REMAINING_LOG
923
- sync
924
- fi
925
-
926
- lasttime=$(sed -n -e "/^$seq /s/.* //p" <$TIMESTAMP_FILE)
927
- starttime=$(date "+%T")
928
- _report_test_start $seq $starttime $lasttime
929
-
930
- if $showme
931
- then
932
- status="not run"
933
- elif [ -f expunged ] && $expunge && egrep "^$seq([ ]|\$)" expunged >/dev/null
934
- then
935
- status="not run"
936
- results="expunged"
937
- rm -f $seq.out.bad
938
- echo "/^$seq\$/d" >>$tmp.expunged
939
- elif [ ! -f "$source_iotests/$seq" ]
940
- then
941
- status="not run"
942
- results="no such test?"
943
- echo "/^$seq\$/d" >>$tmp.expunged
944
- else
945
- # really going to try and run this one
946
- #
947
- rm -f $seq.out.bad
948
- rm -f core $seq.notrun
949
- rm -f $seq.casenotrun
950
-
951
- start=$(_wallclock)
952
-
953
- if [ "$(head -n 1 "$source_iotests/$seq")" == "#!/usr/bin/env python3" ]; then
954
- if $python_usable; then
955
- run_command="$PYTHON $seq"
956
- else
957
- run_command="false"
958
- echo "$python_unusable_because" > $seq.notrun
959
- fi
960
- else
961
- run_command="./$seq"
962
- fi
963
- export OUTPUT_DIR=$PWD
964
- if $debug; then
965
- (cd "$source_iotests";
966
- MALLOC_PERTURB_=${MALLOC_PERTURB_:-$(($RANDOM % 255 + 1))} \
967
- $run_command -d 2>&1 | tee $tmp.out)
968
- else
969
- (cd "$source_iotests";
970
- MALLOC_PERTURB_=${MALLOC_PERTURB_:-$(($RANDOM % 255 + 1))} \
971
- $run_command >$tmp.out 2>&1)
972
- fi
973
- sts=$?
974
- stop=$(_wallclock)
975
-
976
- if [ -f core ]
977
- then
978
- mv core $seq.core
979
- status="fail"
980
- results="[dumped core] $seq.core"
981
- err=true
982
- fi
983
-
984
- if [ -f $seq.notrun ]
985
- then
986
- # overwrites timestamp output
987
- status="not run"
988
- results="$(cat $seq.notrun)"
989
- else
990
- if [ $sts -ne 0 ]
991
- then
992
- status="fail"
993
- results=$(printf %s "[failed, exit status $sts]")
994
- err=true
995
- fi
996
-
997
- reference="$source_iotests/$seq.out"
998
- reference_machine="$source_iotests/$seq.$QEMU_DEFAULT_MACHINE.out"
999
- if [ -f "$reference_machine" ]; then
1000
- reference="$reference_machine"
1001
- fi
1002
-
1003
- reference_format="$source_iotests/$seq.out.$IMGFMT"
1004
- if [ -f "$reference_format" ]; then
1005
- reference="$reference_format"
1006
- fi
1007
-
1008
- if [ "$CACHEMODE" = "none" ]; then
1009
- [ -f "$source_iotests/$seq.out.nocache" ] && reference="$source_iotests/$seq.out.nocache"
1010
- fi
1011
-
1012
- if [ ! -f "$reference" ]
1013
- then
1014
- status="fail"
1015
- results="no qualified output"
1016
- err=true
1017
- else
1018
- if diff -w "$reference" $tmp.out >/dev/null 2>&1
1019
- then
1020
- if ! $err; then
1021
- status="pass"
1022
- thistime=$(expr $stop - $start)
1023
- echo "$seq $thistime" >>$tmp.time
1024
- fi
1025
- else
1026
- mv $tmp.out $seq.out.bad
1027
- status="fail"
1028
- results="output mismatch (see $seq.out.bad)"
1029
- printdiff=true
1030
- err=true
1031
- fi
1032
- fi
1033
- fi
1034
- if [ -f $seq.casenotrun ]
1035
- then
1036
- cat $seq.casenotrun
1037
- casenotrun="$casenotrun $seq"
1038
- fi
1039
- fi
1040
-
1041
- # come here for each test, except when $showme is true
1042
- #
1043
- _report_test_result $seq "$status" "$starttime" "$lasttime" "$thistime" "$results"
1044
- case "$status" in
1045
- "pass")
1046
- try=$(expr $try + 1)
1047
- ;;
1048
- "fail")
1049
- try=$(expr $try + 1)
1050
- if $makecheck; then
1051
- _full_env_details
1052
- fi
1053
- if $printdiff; then
1054
- $diff -w "$reference" "$PWD"/$seq.out.bad
1055
- fi
1056
- bad="$bad $seq"
1057
- n_bad=$(expr $n_bad + 1)
1058
- quick=false
1059
- ;;
1060
- "not run")
1061
- notrun="$notrun $seq"
1062
- ;;
1063
- esac
1064
-
1065
- seq="after_$seq"
1066
-done
1067
1068
-interrupt=false
1069
-status=$(expr $n_bad)
1070
-exit
1071
+import os
1072
+import sys
1073
+import argparse
1074
+from findtests import TestFinder
1075
+from testenv import TestEnv
1076
+from testrunner import TestRunner
1077
+
1078
+
1079
+def make_argparser() -> argparse.ArgumentParser:
1080
+ p = argparse.ArgumentParser(description="Test run options")
1081
+
1082
+ p.add_argument('-n', '--dry-run', action='store_true',
1083
+ help='show me, do not run tests')
1084
+ p.add_argument('-makecheck', action='store_true',
1085
+ help='pretty print output for make check')
1086
+
1087
+ p.add_argument('-d', dest='debug', action='store_true', help='debug')
1088
+ p.add_argument('-misalign', action='store_true',
1089
+ help='misalign memory allocations')
1090
+ p.add_argument('--color', choices=['on', 'off', 'auto'],
1091
+ default='auto', help="use terminal colors. The default "
1092
+ "'auto' value means use colors if terminal stdout detected")
1093
+
1094
+ g_env = p.add_argument_group('test environment options')
1095
+ mg = g_env.add_mutually_exclusive_group()
1096
+ # We don't set default for cachemode, as we need to distinguish default
1097
+ # from user input later.
1098
+ mg.add_argument('-nocache', dest='cachemode', action='store_const',
1099
+ const='none', help='set cache mode "none" (O_DIRECT), '
1100
+ 'sets CACHEMODE environment variable')
1101
+ mg.add_argument('-c', dest='cachemode',
1102
+ help='sets CACHEMODE environment variable')
1103
+
1104
+ g_env.add_argument('-i', dest='aiomode', default='threads',
1105
+ help='sets AIOMODE environment variable')
1106
+
1107
+ p.set_defaults(imgfmt='raw', imgproto='file')
1108
+
1109
+ format_list = ['raw', 'bochs', 'cloop', 'parallels', 'qcow', 'qcow2',
1110
+ 'qed', 'vdi', 'vpc', 'vhdx', 'vmdk', 'luks', 'dmg']
1111
+ g_fmt = p.add_argument_group(
1112
+ ' image format options',
1113
+ 'The following options set the IMGFMT environment variable. '
1114
+ 'At most one choice is allowed, default is "raw"')
1115
+ mg = g_fmt.add_mutually_exclusive_group()
1116
+ for fmt in format_list:
1117
+ mg.add_argument('-' + fmt, dest='imgfmt', action='store_const',
1118
+ const=fmt, help=f'test {fmt}')
1119
+
1120
+ protocol_list = ['file', 'rbd', 'sheepdog', 'nbd', 'ssh', 'nfs',
1121
+ 'fuse']
1122
+ g_prt = p.add_argument_group(
1123
+ ' image protocol options',
1124
+ 'The following options set the IMGPROTO environment variable. '
1125
+ 'At most one choice is allowed, default is "file"')
1126
+ mg = g_prt.add_mutually_exclusive_group()
1127
+ for prt in protocol_list:
1128
+ mg.add_argument('-' + prt, dest='imgproto', action='store_const',
1129
+ const=prt, help=f'test {prt}')
1130
+
1131
+ g_bash = p.add_argument_group('bash tests options',
1132
+ 'The following options are ignored by '
1133
+ 'python tests.')
1134
+ # TODO: make support for the following options in iotests.py
1135
+ g_bash.add_argument('-o', dest='imgopts',
1136
+ help='options to pass to qemu-img create/convert, '
1137
+ 'sets IMGOPTS environment variable')
1138
+ g_bash.add_argument('-valgrind', action='store_true',
1139
+ help='use valgrind, sets VALGRIND_QEMU environment '
1140
+ 'variable')
1141
+
1142
+ g_sel = p.add_argument_group('test selecting options',
1143
+ 'The following options specify test set '
1144
+ 'to run.')
1145
+ g_sel.add_argument('-g', '--groups', metavar='group1,...',
1146
+ help='include tests from these groups')
1147
+ g_sel.add_argument('-x', '--exclude-groups', metavar='group1,...',
1148
+ help='exclude tests from these groups')
1149
+ g_sel.add_argument('--start-from', metavar='TEST',
1150
+ help='Start from specified test: make sorted sequence '
1151
+ 'of tests as usual and then drop tests from the first '
1152
+ 'one to TEST (not inclusive). This may be used to '
1153
+ 'rerun failed ./check command, starting from the '
1154
+ 'middle of the process.')
1155
+ g_sel.add_argument('tests', metavar='TEST_FILES', nargs='*',
1156
+ help='tests to run')
1157
+
1158
+ return p
1159
+
1160
+
1161
+if __name__ == '__main__':
1162
+ args = make_argparser().parse_args()
1163
+
1164
+ env = TestEnv(imgfmt=args.imgfmt, imgproto=args.imgproto,
1165
+ aiomode=args.aiomode, cachemode=args.cachemode,
1166
+ imgopts=args.imgopts, misalign=args.misalign,
1167
+ debug=args.debug, valgrind=args.valgrind)
1168
+
1169
+ testfinder = TestFinder(test_dir=env.source_iotests)
1170
+
1171
+ groups = args.groups.split(',') if args.groups else None
1172
+ x_groups = args.exclude_groups.split(',') if args.exclude_groups else None
1173
+
1174
+ group_local = os.path.join(env.source_iotests, 'group.local')
1175
+ if os.path.isfile(group_local):
1176
+ try:
1177
+ testfinder.add_group_file(group_local)
1178
+ except ValueError as e:
1179
+ sys.exit(f"Failed to parse group file '{group_local}': {e}")
1180
+
1181
+ try:
1182
+ tests = testfinder.find_tests(groups=groups, exclude_groups=x_groups,
1183
+ tests=args.tests,
1184
+ start_from=args.start_from)
1185
+ if not tests:
1186
+ raise ValueError('No tests selected')
1187
+ except ValueError as e:
1188
+ sys.exit(e)
1189
+
1190
+ if args.dry_run:
1191
+ print('\n'.join(tests))
1192
+ else:
1193
+ with TestRunner(env, makecheck=args.makecheck,
1194
+ color=args.color) as tr:
1195
+ tr.run_tests([os.path.join(env.source_iotests, t) for t in tests])
1196
diff --git a/tests/qemu-iotests/common.env.in b/tests/qemu-iotests/common.env.in
1197
deleted file mode 100644
1198
index XXXXXXX..XXXXXXX
1199
--- a/tests/qemu-iotests/common.env.in
1200
+++ /dev/null
1201
@@ -XXX,XX +XXX,XX @@
1202
-# Automatically generated by configure - do not modify
1203
-
1204
-export PYTHON='@PYTHON@'
1205
diff --git a/tests/qemu-iotests/group b/tests/qemu-iotests/group
1206
deleted file mode 100644
1207
index XXXXXXX..XXXXXXX
1208
--- a/tests/qemu-iotests/group
1209
+++ /dev/null
1210
@@ -XXX,XX +XXX,XX @@
1211
-#
1212
-# QA groups control file
1213
-# Defines test groups
1214
-#
1215
-# Some notes about the groups:
1216
-#
1217
-# - do not start group names with a digit
1218
-#
1219
-# - quick : Tests in this group should finish within some few seconds.
1220
-#
1221
-# - img : Tests in this group can be used to excercise the qemu-img tool.
1222
-#
1223
-# - auto : Tests in this group are used during "make check" and should be
1224
-# runnable in any case. That means they should run with every QEMU binary
1225
-# (also non-x86), with every QEMU configuration (i.e. must not fail if
1226
-# an optional feature is not compiled in - but reporting a "skip" is ok),
1227
-# work at least with the qcow2 file format, work with all kind of host
1228
-# filesystems and users (e.g. "nobody" or "root") and must not take too
1229
-# much memory and disk space (since CI pipelines tend to fail otherwise).
1230
-#
1231
-
1232
-#
1233
-# test-group association ... one line per test
1234
-#
1235
-001 rw auto quick
1236
-002 rw auto quick
1237
-003 rw auto
1238
-004 rw auto quick
1239
-005 img auto quick
1240
-# 006 was removed, do not reuse
1241
-007 snapshot auto
1242
-008 rw auto quick
1243
-009 rw auto quick
1244
-010 rw auto quick
1245
-011 rw auto quick
1246
-012 auto quick
1247
-013 rw auto
1248
-014 rw
1249
-015 rw snapshot
1250
-# 016 was removed, do not reuse
1251
-017 rw backing auto quick
1252
-018 rw backing auto quick
1253
-019 rw backing auto quick
1254
-020 rw backing auto quick
1255
-021 io auto quick
1256
-022 rw snapshot auto
1257
-023 rw
1258
-024 rw backing auto quick
1259
-025 rw auto quick
1260
-026 rw blkdbg
1261
-027 rw auto quick
1262
-028 rw backing quick
1263
-029 rw auto quick
1264
-030 rw auto backing
1265
-031 rw auto quick
1266
-032 rw auto quick
1267
-033 rw auto quick
1268
-034 rw auto backing quick
1269
-035 rw auto quick
1270
-036 rw auto quick
1271
-037 rw auto backing quick
1272
-038 rw auto backing quick
1273
-039 rw auto quick
1274
-040 rw auto
1275
-041 rw auto backing
1276
-042 rw auto quick
1277
-043 rw auto backing
1278
-044 rw
1279
-045 rw quick
1280
-046 rw auto aio quick
1281
-047 rw auto quick
1282
-048 img auto quick
1283
-049 rw auto
1284
-050 rw auto backing quick
1285
-051 rw
1286
-052 rw auto backing quick
1287
-053 rw auto quick
1288
-054 rw auto quick
1289
-055 rw
1290
-056 rw backing
1291
-057 rw
1292
-058 rw quick
1293
-059 rw quick
1294
-060 rw auto quick
1295
-061 rw auto
1296
-062 rw auto quick
1297
-063 rw auto quick
1298
-064 rw quick
1299
-065 rw quick
1300
-066 rw auto quick
1301
-# 067 was removed, do not reuse
1302
-068 rw quick
1303
-069 rw auto quick
1304
-070 rw quick
1305
-071 rw auto quick
1306
-072 rw auto quick
1307
-073 rw auto quick
1308
-074 rw auto quick
1309
-075 rw quick
1310
-076 io
1311
-077 rw quick
1312
-078 rw quick
1313
-079 rw auto
1314
-080 rw auto
1315
-081 rw quick
1316
-082 rw quick
1317
-083 rw
1318
-084 img quick
1319
-085 rw
1320
-086 rw auto quick
1321
-087 rw quick
1322
-088 rw quick
1323
-089 rw auto quick
1324
-090 rw auto quick
1325
-091 rw migration quick
1326
-092 rw quick
1327
-093 throttle
1328
-094 rw quick
1329
-095 rw quick
1330
-096 rw quick
1331
-097 rw auto backing
1332
-098 rw auto backing quick
1333
-099 rw auto quick
1334
-# 100 was removed, do not reuse
1335
-101 rw quick
1336
-102 rw quick
1337
-103 rw auto quick
1338
-104 rw auto
1339
-105 rw auto quick
1340
-106 rw quick
1341
-107 rw auto quick
1342
-108 rw auto quick
1343
-109 rw
1344
-110 rw auto backing quick
1345
-111 rw auto quick
1346
-112 rw
1347
-113 rw quick
1348
-114 rw auto quick
1349
-115 rw
1350
-116 rw quick
1351
-117 rw auto
1352
-118 rw
1353
-119 rw quick
1354
-120 rw auto quick
1355
-121 rw
1356
-122 rw
1357
-123 rw quick
1358
-124 rw backing
1359
-125 rw
1360
-126 rw auto backing
1361
-127 rw auto backing quick
1362
-128 rw quick
1363
-129 rw quick
1364
-130 rw quick
1365
-131 rw quick
1366
-132 rw quick
1367
-133 auto quick
1368
-134 rw auto quick
1369
-135 rw
1370
-136 rw
1371
-137 rw auto
1372
-138 rw auto quick
1373
-139 rw quick
1374
-140 rw auto quick
1375
-141 rw auto quick
1376
-142
1377
-143 auto quick
1378
-144 rw quick
1379
-145 quick
1380
-146 quick
1381
-147 img
1382
-148 rw quick
1383
-149 rw sudo
1384
-150 rw auto quick
1385
-151 rw
1386
-152 rw quick
1387
-153 rw quick
1388
-154 rw auto backing quick
1389
-155 rw
1390
-156 rw auto quick
1391
-157 quick
1392
-158 rw auto quick
1393
-159 rw auto quick
1394
-160 rw quick
1395
-161 rw auto quick
1396
-162 quick
1397
-163 rw
1398
-165 rw quick
1399
-169 rw migration
1400
-170 rw auto quick
1401
-171 rw quick
1402
-172 auto
1403
-173 rw
1404
-174 auto
1405
-175 quick
1406
-176 rw auto backing
1407
-177 rw auto quick
1408
-178 img
1409
-179 rw auto quick
1410
-181 rw auto migration quick
1411
-182 rw quick
1412
-183 rw migration quick
1413
-184 rw auto quick
1414
-185 rw
1415
-186 rw auto
1416
-187 rw auto
1417
-188 rw quick
1418
-189 rw
1419
-190 rw auto quick
1420
-191 rw auto
1421
-192 rw auto quick
1422
-194 rw migration quick
1423
-195 rw auto quick
1424
-196 rw quick migration
1425
-197 rw quick
1426
-198 rw
1427
-199 rw migration
1428
-200 rw
1429
-201 rw migration quick
1430
-202 rw quick
1431
-203 rw auto migration quick
1432
-204 rw quick
1433
-205 rw quick
1434
-206 rw
1435
-207 rw
1436
-208 rw quick
1437
-209 rw quick
1438
-210 rw
1439
-211 rw quick
1440
-212 rw quick
1441
-213 rw quick
1442
-214 rw auto
1443
-215 rw quick
1444
-216 rw quick
1445
-217 rw auto quick
1446
-218 rw quick
1447
-219 rw
1448
-220 rw auto
1449
-221 rw quick
1450
-222 rw quick
1451
-223 rw quick
1452
-224 rw quick
1453
-225 rw quick
1454
-226 auto quick
1455
-227 quick
1456
-228 rw quick
1457
-229 auto quick
1458
-231 quick
1459
-232 quick
1460
-233 quick
1461
-234 quick migration
1462
-235 quick
1463
-236 quick
1464
-237 rw quick
1465
-238 quick
1466
-239 rw quick
1467
-240 quick
1468
-241 rw quick
1469
-242 rw quick
1470
-243 rw quick
1471
-244 rw auto quick
1472
-245 rw
1473
-246 rw quick
1474
-247 rw quick
1475
-248 rw quick
1476
-249 rw auto quick
1477
-250 rw quick
1478
-251 rw auto quick
1479
-252 rw auto backing quick
1480
-253 rw quick
1481
-254 rw backing quick
1482
-255 rw quick
1483
-256 rw auto quick
1484
-257 rw
1485
-258 rw quick
1486
-259 rw auto quick
1487
-260 rw quick
1488
-261 rw
1489
-262 rw quick migration
1490
-263 rw quick
1491
-264 rw
1492
-265 rw auto quick
1493
-266 rw quick
1494
-267 rw auto quick snapshot
1495
-268 rw auto quick
1496
-270 rw backing quick
1497
-271 rw auto
1498
-272 rw
1499
-273 backing quick
1500
-274 rw backing
1501
-277 rw quick
1502
-279 rw backing quick
1503
-280 rw migration quick
1504
-281 rw quick
1505
-282 rw img quick
1506
-283 auto quick
1507
-284 rw
1508
-286 rw quick
1509
-287 auto quick
1510
-288 quick
1511
-289 rw quick
1512
-290 rw auto quick
1513
-291 rw quick
1514
-292 rw auto quick
1515
-293 rw
1516
-294 rw quick
1517
-295 rw
1518
-296 rw
1519
-297 meta
1520
-298
1521
-299 auto quick
1522
-300 migration
1523
-301 backing quick
1524
-302 quick
1525
-303 rw quick
1526
-304 rw quick
1527
-305 rw quick
1528
-307 rw quick export
1529
-308 rw
1530
-309 rw auto quick
1531
-310 rw quick
1532
-312 rw quick
1533
-313 rw auto quick
1534
diff --git a/tests/qemu-iotests/meson.build b/tests/qemu-iotests/meson.build
1535
index XXXXXXX..XXXXXXX 100644
1536
--- a/tests/qemu-iotests/meson.build
1537
+++ b/tests/qemu-iotests/meson.build
1538
@@ -XXX,XX +XXX,XX @@ if 'CONFIG_LINUX' in config_host
1539
else
1540
socket_scm_helper = []
1541
endif
1542
-configure_file(output: 'common.env',
1543
- input: files('common.env.in'),
1544
- configuration: {'PYTHON': python.full_path()})
1545
--
49
--
1546
2.29.2
50
2.29.2
1547
51
1548
52
diff view generated by jsdifflib
1
From: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
1
For -makecheck, the old 'check' implementation skipped the output when
2
starting a test. It only had the condensed output at the end of a test.
2
3
3
Add TestRunner class, which will run tests in a new python iotests
4
testrunner.py prints the normal output when starting a test even for
4
running framework.
5
-makecheck. This output contains '\r' at the end so that it can be
6
overwritten with the result at the end of the test. However, for
7
-makecheck this is shorter output in a different format, so effectively
8
we end up with garbled output that mixes both output forms.
5
9
6
There are some differences with current ./check behavior, most
10
Revert to the old behaviour of only printing a message after the test
7
significant are:
11
had completed in -makecheck mode.
8
- Consider all tests self-executable, just run them, don't run python
9
by hand.
10
- Elapsed time is cached in json file
11
- Elapsed time precision increased a bit
12
- Instead of using "diff -w" which ignores all whitespace differences,
13
manually strip whitespace at line end then use python difflib, which
14
no longer ignores spacing mid-line
15
12
16
Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
13
Fixes: d74c754c924ca34e90b7c96ce2f5609d82c0e628
17
Message-Id: <20210125185056.129513-5-vsementsov@virtuozzo.com>
14
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
15
Message-Id: <20210201161024.127921-1-kwolf@redhat.com>
16
Reviewed-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
18
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
17
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
19
---
18
---
20
tests/qemu-iotests/testrunner.py | 367 +++++++++++++++++++++++++++++++
19
tests/qemu-iotests/testrunner.py | 6 ++++--
21
1 file changed, 367 insertions(+)
20
1 file changed, 4 insertions(+), 2 deletions(-)
22
create mode 100644 tests/qemu-iotests/testrunner.py
23
21
24
diff --git a/tests/qemu-iotests/testrunner.py b/tests/qemu-iotests/testrunner.py
22
diff --git a/tests/qemu-iotests/testrunner.py b/tests/qemu-iotests/testrunner.py
25
new file mode 100644
23
index XXXXXXX..XXXXXXX 100644
26
index XXXXXXX..XXXXXXX
24
--- a/tests/qemu-iotests/testrunner.py
27
--- /dev/null
28
+++ b/tests/qemu-iotests/testrunner.py
25
+++ b/tests/qemu-iotests/testrunner.py
29
@@ -XXX,XX +XXX,XX @@
26
@@ -XXX,XX +XXX,XX @@ class TestRunner(ContextManager['TestRunner']):
30
+# Class for actually running tests.
27
last_el = self.last_elapsed.get(test)
31
+#
28
start = datetime.datetime.now().strftime('%H:%M:%S')
32
+# Copyright (c) 2020-2021 Virtuozzo International GmbH
29
33
+#
30
- self.test_print_one_line(test=test, starttime=start, lasttime=last_el,
34
+# This program is free software; you can redistribute it and/or modify
31
- end='\r', test_field_width=test_field_width)
35
+# it under the terms of the GNU General Public License as published by
36
+# the Free Software Foundation; either version 2 of the License, or
37
+# (at your option) any later version.
38
+#
39
+# This program is distributed in the hope that it will be useful,
40
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
41
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
42
+# GNU General Public License for more details.
43
+#
44
+# You should have received a copy of the GNU General Public License
45
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
46
+#
47
+
48
+import os
49
+from pathlib import Path
50
+import datetime
51
+import time
52
+import difflib
53
+import subprocess
54
+import contextlib
55
+import json
56
+import termios
57
+import sys
58
+from contextlib import contextmanager
59
+from typing import List, Optional, Iterator, Any, Sequence, Dict, \
60
+ ContextManager
61
+
62
+from testenv import TestEnv
63
+
64
+
65
+def silent_unlink(path: Path) -> None:
66
+ try:
67
+ path.unlink()
68
+ except OSError:
69
+ pass
70
+
71
+
72
+def file_diff(file1: str, file2: str) -> List[str]:
73
+ with open(file1, encoding="utf-8") as f1, \
74
+ open(file2, encoding="utf-8") as f2:
75
+ # We want to ignore spaces at line ends. There are a lot of mess about
76
+ # it in iotests.
77
+ # TODO: fix all tests to not produce extra spaces, fix all .out files
78
+ # and use strict diff here!
79
+ seq1 = [line.rstrip() for line in f1]
80
+ seq2 = [line.rstrip() for line in f2]
81
+ res = [line.rstrip()
82
+ for line in difflib.unified_diff(seq1, seq2, file1, file2)]
83
+ return res
84
+
85
+
86
+# We want to save current tty settings during test run,
87
+# since an aborting qemu call may leave things screwed up.
88
+@contextmanager
89
+def savetty() -> Iterator[None]:
90
+ isterm = sys.stdin.isatty()
91
+ if isterm:
92
+ fd = sys.stdin.fileno()
93
+ attr = termios.tcgetattr(fd)
94
+
95
+ try:
96
+ yield
97
+ finally:
98
+ if isterm:
99
+ termios.tcsetattr(fd, termios.TCSADRAIN, attr)
100
+
101
+
102
+class LastElapsedTime(ContextManager['LastElapsedTime']):
103
+ """ Cache for elapsed time for tests, to show it during new test run
104
+
105
+ It is safe to use get() at any time. To use update(), you must either
106
+ use it inside with-block or use save() after update().
107
+ """
108
+ def __init__(self, cache_file: str, env: TestEnv) -> None:
109
+ self.env = env
110
+ self.cache_file = cache_file
111
+ self.cache: Dict[str, Dict[str, Dict[str, float]]]
112
+
113
+ try:
114
+ with open(cache_file, encoding="utf-8") as f:
115
+ self.cache = json.load(f)
116
+ except (OSError, ValueError):
117
+ self.cache = {}
118
+
119
+ def get(self, test: str,
120
+ default: Optional[float] = None) -> Optional[float]:
121
+ if test not in self.cache:
122
+ return default
123
+
124
+ if self.env.imgproto not in self.cache[test]:
125
+ return default
126
+
127
+ return self.cache[test][self.env.imgproto].get(self.env.imgfmt,
128
+ default)
129
+
130
+ def update(self, test: str, elapsed: float) -> None:
131
+ d = self.cache.setdefault(test, {})
132
+ d.setdefault(self.env.imgproto, {})[self.env.imgfmt] = elapsed
133
+
134
+ def save(self) -> None:
135
+ with open(self.cache_file, 'w', encoding="utf-8") as f:
136
+ json.dump(self.cache, f)
137
+
138
+ def __enter__(self) -> 'LastElapsedTime':
139
+ return self
140
+
141
+ def __exit__(self, exc_type: Any, exc_value: Any, traceback: Any) -> None:
142
+ self.save()
143
+
144
+
145
+class TestResult:
146
+ def __init__(self, status: str, description: str = '',
147
+ elapsed: Optional[float] = None, diff: Sequence[str] = (),
148
+ casenotrun: str = '', interrupted: bool = False) -> None:
149
+ self.status = status
150
+ self.description = description
151
+ self.elapsed = elapsed
152
+ self.diff = diff
153
+ self.casenotrun = casenotrun
154
+ self.interrupted = interrupted
155
+
156
+
157
+class TestRunner(ContextManager['TestRunner']):
158
+ def __init__(self, env: TestEnv, makecheck: bool = False,
159
+ color: str = 'auto') -> None:
160
+ self.env = env
161
+ self.test_run_env = self.env.get_env()
162
+ self.makecheck = makecheck
163
+ self.last_elapsed = LastElapsedTime('.last-elapsed-cache', env)
164
+
165
+ assert color in ('auto', 'on', 'off')
166
+ self.color = (color == 'on') or (color == 'auto' and
167
+ sys.stdout.isatty())
168
+
169
+ self._stack: contextlib.ExitStack
170
+
171
+ def __enter__(self) -> 'TestRunner':
172
+ self._stack = contextlib.ExitStack()
173
+ self._stack.enter_context(self.env)
174
+ self._stack.enter_context(self.last_elapsed)
175
+ self._stack.enter_context(savetty())
176
+ return self
177
+
178
+ def __exit__(self, exc_type: Any, exc_value: Any, traceback: Any) -> None:
179
+ self._stack.close()
180
+
181
+ def test_print_one_line(self, test: str, starttime: str,
182
+ endtime: Optional[str] = None, status: str = '...',
183
+ lasttime: Optional[float] = None,
184
+ thistime: Optional[float] = None,
185
+ description: str = '',
186
+ test_field_width: Optional[int] = None,
187
+ end: str = '\n') -> None:
188
+ """ Print short test info before/after test run """
189
+ test = os.path.basename(test)
190
+
191
+ if test_field_width is None:
192
+ test_field_width = 8
193
+
194
+ if self.makecheck and status != '...':
195
+ if status and status != 'pass':
196
+ status = f' [{status}]'
197
+ else:
198
+ status = ''
199
+
200
+ print(f' TEST iotest-{self.env.imgfmt}: {test}{status}')
201
+ return
202
+
203
+ if lasttime:
204
+ lasttime_s = f' (last: {lasttime:.1f}s)'
205
+ else:
206
+ lasttime_s = ''
207
+ if thistime:
208
+ thistime_s = f'{thistime:.1f}s'
209
+ else:
210
+ thistime_s = '...'
211
+
212
+ if endtime:
213
+ endtime = f'[{endtime}]'
214
+ else:
215
+ endtime = ''
216
+
217
+ if self.color:
218
+ if status == 'pass':
219
+ col = '\033[32m'
220
+ elif status == 'fail':
221
+ col = '\033[1m\033[31m'
222
+ elif status == 'not run':
223
+ col = '\033[33m'
224
+ else:
225
+ col = ''
226
+
227
+ col_end = '\033[0m'
228
+ else:
229
+ col = ''
230
+ col_end = ''
231
+
232
+ print(f'{test:{test_field_width}} {col}{status:10}{col_end} '
233
+ f'[{starttime}] {endtime:13}{thistime_s:5} {lasttime_s:14} '
234
+ f'{description}', end=end)
235
+
236
+ def find_reference(self, test: str) -> str:
237
+ if self.env.cachemode == 'none':
238
+ ref = f'{test}.out.nocache'
239
+ if os.path.isfile(ref):
240
+ return ref
241
+
242
+ ref = f'{test}.out.{self.env.imgfmt}'
243
+ if os.path.isfile(ref):
244
+ return ref
245
+
246
+ ref = f'{test}.{self.env.qemu_default_machine}.out'
247
+ if os.path.isfile(ref):
248
+ return ref
249
+
250
+ return f'{test}.out'
251
+
252
+ def do_run_test(self, test: str) -> TestResult:
253
+ f_test = Path(test)
254
+ f_bad = Path(f_test.name + '.out.bad')
255
+ f_notrun = Path(f_test.name + '.notrun')
256
+ f_casenotrun = Path(f_test.name + '.casenotrun')
257
+ f_reference = Path(self.find_reference(test))
258
+
259
+ if not f_test.exists():
260
+ return TestResult(status='fail',
261
+ description=f'No such test file: {f_test}')
262
+
263
+ if not os.access(str(f_test), os.X_OK):
264
+ sys.exit(f'Not executable: {f_test}')
265
+
266
+ if not f_reference.exists():
267
+ return TestResult(status='not run',
268
+ description='No qualified output '
269
+ f'(expected {f_reference})')
270
+
271
+ for p in (f_bad, f_notrun, f_casenotrun):
272
+ silent_unlink(p)
273
+
274
+ args = [str(f_test.resolve())]
275
+ if self.env.debug:
276
+ args.append('-d')
277
+
278
+ with f_test.open(encoding="utf-8") as f:
279
+ try:
280
+ if f.readline() == '#!/usr/bin/env python3':
281
+ args.insert(0, self.env.python)
282
+ except UnicodeDecodeError: # binary test? for future.
283
+ pass
284
+
285
+ env = os.environ.copy()
286
+ env.update(self.test_run_env)
287
+
288
+ t0 = time.time()
289
+ with f_bad.open('w', encoding="utf-8") as f:
290
+ proc = subprocess.Popen(args, cwd=str(f_test.parent), env=env,
291
+ stdout=f, stderr=subprocess.STDOUT)
292
+ try:
293
+ proc.wait()
294
+ except KeyboardInterrupt:
295
+ proc.terminate()
296
+ proc.wait()
297
+ return TestResult(status='not run',
298
+ description='Interrupted by user',
299
+ interrupted=True)
300
+ ret = proc.returncode
301
+
302
+ elapsed = round(time.time() - t0, 1)
303
+
304
+ if ret != 0:
305
+ return TestResult(status='fail', elapsed=elapsed,
306
+ description=f'failed, exit status {ret}',
307
+ diff=file_diff(str(f_reference), str(f_bad)))
308
+
309
+ if f_notrun.exists():
310
+ return TestResult(status='not run',
311
+ description=f_notrun.read_text().strip())
312
+
313
+ casenotrun = ''
314
+ if f_casenotrun.exists():
315
+ casenotrun = f_casenotrun.read_text()
316
+
317
+ diff = file_diff(str(f_reference), str(f_bad))
318
+ if diff:
319
+ return TestResult(status='fail', elapsed=elapsed,
320
+ description=f'output mismatch (see {f_bad})',
321
+ diff=diff, casenotrun=casenotrun)
322
+ else:
323
+ f_bad.unlink()
324
+ self.last_elapsed.update(test, elapsed)
325
+ return TestResult(status='pass', elapsed=elapsed,
326
+ casenotrun=casenotrun)
327
+
328
+ def run_test(self, test: str,
329
+ test_field_width: Optional[int] = None) -> TestResult:
330
+ last_el = self.last_elapsed.get(test)
331
+ start = datetime.datetime.now().strftime('%H:%M:%S')
332
+
333
+ self.test_print_one_line(test=test, starttime=start, lasttime=last_el,
334
+ end='\r', test_field_width=test_field_width)
335
+
336
+ res = self.do_run_test(test)
337
+
338
+ end = datetime.datetime.now().strftime('%H:%M:%S')
339
+ self.test_print_one_line(test=test, status=res.status,
340
+ starttime=start, endtime=end,
341
+ lasttime=last_el, thistime=res.elapsed,
342
+ description=res.description,
343
+ test_field_width=test_field_width)
344
+
345
+ if res.casenotrun:
346
+ print(res.casenotrun)
347
+
348
+ return res
349
+
350
+ def run_tests(self, tests: List[str]) -> None:
351
+ n_run = 0
352
+ failed = []
353
+ notrun = []
354
+ casenotrun = []
355
+
356
+ if not self.makecheck:
32
+ if not self.makecheck:
357
+ self.env.print_env()
33
+ self.test_print_one_line(test=test, starttime=start,
358
+ print()
34
+ lasttime=last_el, end='\r',
359
+
35
+ test_field_width=test_field_width)
360
+ test_field_width = max(len(os.path.basename(t)) for t in tests) + 2
36
361
+
37
res = self.do_run_test(test)
362
+ for t in tests:
38
363
+ name = os.path.basename(t)
364
+ res = self.run_test(t, test_field_width=test_field_width)
365
+
366
+ assert res.status in ('pass', 'fail', 'not run')
367
+
368
+ if res.casenotrun:
369
+ casenotrun.append(t)
370
+
371
+ if res.status != 'not run':
372
+ n_run += 1
373
+
374
+ if res.status == 'fail':
375
+ failed.append(name)
376
+ if self.makecheck:
377
+ self.env.print_env()
378
+ if res.diff:
379
+ print('\n'.join(res.diff))
380
+ elif res.status == 'not run':
381
+ notrun.append(name)
382
+
383
+ if res.interrupted:
384
+ break
385
+
386
+ if notrun:
387
+ print('Not run:', ' '.join(notrun))
388
+
389
+ if casenotrun:
390
+ print('Some cases not run in:', ' '.join(casenotrun))
391
+
392
+ if failed:
393
+ print('Failures:', ' '.join(failed))
394
+ print(f'Failed {len(failed)} of {n_run} iotests')
395
+ else:
396
+ print(f'Passed all {n_run} iotests')
397
--
39
--
398
2.29.2
40
2.29.2
399
41
400
42
diff view generated by jsdifflib
New patch
1
From: Philippe Mathieu-Daudé <philmd@redhat.com>
1
2
3
Commit 15b2260bef3 ("block/nvme: Trace controller capabilities")
4
misunderstood the doorbell stride value from the datasheet, use
5
the correct one. The 'doorbell_scale' variable used few lines
6
later is correct.
7
8
Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com>
9
Message-Id: <20210127212137.3482291-2-philmd@redhat.com>
10
Reviewed-by: Klaus Jensen <k.jensen@samsung.com>
11
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
12
---
13
block/nvme.c | 2 +-
14
1 file changed, 1 insertion(+), 1 deletion(-)
15
16
diff --git a/block/nvme.c b/block/nvme.c
17
index XXXXXXX..XXXXXXX 100644
18
--- a/block/nvme.c
19
+++ b/block/nvme.c
20
@@ -XXX,XX +XXX,XX @@ static int nvme_init(BlockDriverState *bs, const char *device, int namespace,
21
trace_nvme_controller_capability("Contiguous Queues Required",
22
NVME_CAP_CQR(cap));
23
trace_nvme_controller_capability("Doorbell Stride",
24
- 2 << (2 + NVME_CAP_DSTRD(cap)));
25
+ 1 << (2 + NVME_CAP_DSTRD(cap)));
26
trace_nvme_controller_capability("Subsystem Reset Supported",
27
NVME_CAP_NSSRS(cap));
28
trace_nvme_controller_capability("Memory Page Size Minimum",
29
--
30
2.29.2
31
32
diff view generated by jsdifflib
New patch
1
From: Philippe Mathieu-Daudé <philmd@redhat.com>
1
2
3
NVMe controllers implement different versions of the spec,
4
and different features of it. It is useful to gather this
5
information when debugging.
6
7
Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com>
8
Message-Id: <20210127212137.3482291-3-philmd@redhat.com>
9
Reviewed-by: Klaus Jensen <k.jensen@samsung.com>
10
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
11
---
12
block/nvme.c | 6 ++++++
13
block/trace-events | 1 +
14
2 files changed, 7 insertions(+)
15
16
diff --git a/block/nvme.c b/block/nvme.c
17
index XXXXXXX..XXXXXXX 100644
18
--- a/block/nvme.c
19
+++ b/block/nvme.c
20
@@ -XXX,XX +XXX,XX @@ static int nvme_init(BlockDriverState *bs, const char *device, int namespace,
21
AioContext *aio_context = bdrv_get_aio_context(bs);
22
int ret;
23
uint64_t cap;
24
+ uint32_t ver;
25
uint64_t timeout_ms;
26
uint64_t deadline, now;
27
volatile NvmeBar *regs = NULL;
28
@@ -XXX,XX +XXX,XX @@ static int nvme_init(BlockDriverState *bs, const char *device, int namespace,
29
bs->bl.request_alignment = s->page_size;
30
timeout_ms = MIN(500 * NVME_CAP_TO(cap), 30000);
31
32
+ ver = le32_to_cpu(regs->vs);
33
+ trace_nvme_controller_spec_version(extract32(ver, 16, 16),
34
+ extract32(ver, 8, 8),
35
+ extract32(ver, 0, 8));
36
+
37
/* Reset device to get a clean state. */
38
regs->cc = cpu_to_le32(le32_to_cpu(regs->cc) & 0xFE);
39
/* Wait for CSTS.RDY = 0. */
40
diff --git a/block/trace-events b/block/trace-events
41
index XXXXXXX..XXXXXXX 100644
42
--- a/block/trace-events
43
+++ b/block/trace-events
44
@@ -XXX,XX +XXX,XX @@ qed_aio_write_main(void *s, void *acb, int ret, uint64_t offset, size_t len) "s
45
# nvme.c
46
nvme_controller_capability_raw(uint64_t value) "0x%08"PRIx64
47
nvme_controller_capability(const char *desc, uint64_t value) "%s: %"PRIu64
48
+nvme_controller_spec_version(uint32_t mjr, uint32_t mnr, uint32_t ter) "Specification supported: %u.%u.%u"
49
nvme_kick(void *s, unsigned q_index) "s %p q #%u"
50
nvme_dma_flush_queue_wait(void *s) "s %p"
51
nvme_error(int cmd_specific, int sq_head, int sqid, int cid, int status) "cmd_specific %d sq_head %d sqid %d cid %d status 0x%x"
52
--
53
2.29.2
54
55
diff view generated by jsdifflib
1
From: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
1
size_to_str() can return a size like "4.24 MiB", with a single digit
2
integer part and two fractional digits. This is eight characters, but
3
commit b39847a5 changed the format string to only reserve seven
4
characters for the column.
2
5
3
check script will be stricter soon about whitespaces, so fix 146.out
6
This can result in unaligned columns, which in turn changes the output of
4
now.
7
iotests case 267 because exceeding the column size defeats the attempt
8
to filter the size out of the output (observed with the ppc64 emulator).
9
The resulting change is only a whitespace change, but since commit
10
f203080b this is enough for iotests to consider the test failed.
5
11
6
Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
12
Taking a character away from the tag name column and adding it to the VM
7
Message-Id: <20210125185056.129513-2-vsementsov@virtuozzo.com>
13
size column doesn't change anything in the common case (the tag name is
14
left justified, the VM size is right justified), but fixes this case.
15
16
Fixes: b39847a50553b7679d6d7fefbe6a108a17aacf8d
17
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
18
Message-Id: <20210202155911.179865-1-kwolf@redhat.com>
8
Reviewed-by: Eric Blake <eblake@redhat.com>
19
Reviewed-by: Eric Blake <eblake@redhat.com>
9
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
20
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
10
---
21
---
11
tests/qemu-iotests/146.out | 780 ++++++++++++++++++-------------------
22
block/qapi.c | 4 ++--
12
1 file changed, 390 insertions(+), 390 deletions(-)
23
1 file changed, 2 insertions(+), 2 deletions(-)
13
24
14
diff --git a/tests/qemu-iotests/146.out b/tests/qemu-iotests/146.out
25
diff --git a/block/qapi.c b/block/qapi.c
15
index XXXXXXX..XXXXXXX 100644
26
index XXXXXXX..XXXXXXX 100644
16
--- a/tests/qemu-iotests/146.out
27
--- a/block/qapi.c
17
+++ b/tests/qemu-iotests/146.out
28
+++ b/block/qapi.c
18
@@ -XXX,XX +XXX,XX @@ QA output created by 146
29
@@ -XXX,XX +XXX,XX @@ void bdrv_snapshot_dump(QEMUSnapshotInfo *sn)
19
30
char *sizing = NULL;
20
=== Testing VPC Autodetect ===
31
21
32
if (!sn) {
22
-[{ "start": 0, "length": 136363130880, "depth": 0, "zero": true, "data": false }]
33
- qemu_printf("%-10s%-18s%7s%20s%13s%11s",
23
+[{ "start": 0, "length": 136363130880, "depth": 0, "zero": true, "data": false}]
34
+ qemu_printf("%-10s%-17s%8s%20s%13s%11s",
24
35
"ID", "TAG", "VM SIZE", "DATE", "VM CLOCK", "ICOUNT");
25
=== Testing VPC with current_size force ===
36
} else {
26
37
ti = sn->date_sec;
27
-[{ "start": 0, "length": 136365211648, "depth": 0, "zero": true, "data": false }]
38
@@ -XXX,XX +XXX,XX @@ void bdrv_snapshot_dump(QEMUSnapshotInfo *sn)
28
+[{ "start": 0, "length": 136365211648, "depth": 0, "zero": true, "data": false}]
39
snprintf(icount_buf, sizeof(icount_buf),
29
40
"%"PRId64, sn->icount);
30
=== Testing VPC with chs force ===
41
}
31
42
- qemu_printf("%-9s %-17s %7s%20s%13s%11s",
32
-[{ "start": 0, "length": 136363130880, "depth": 0, "zero": true, "data": false }]
43
+ qemu_printf("%-9s %-16s %8s%20s%13s%11s",
33
+[{ "start": 0, "length": 136363130880, "depth": 0, "zero": true, "data": false}]
44
sn->id_str, sn->name,
34
45
sizing,
35
=== Testing Hyper-V Autodetect ===
46
date_buf,
36
37
-[{ "start": 0, "length": 136365211648, "depth": 0, "zero": true, "data": false }]
38
+[{ "start": 0, "length": 136365211648, "depth": 0, "zero": true, "data": false}]
39
40
=== Testing Hyper-V with current_size force ===
41
42
-[{ "start": 0, "length": 136365211648, "depth": 0, "zero": true, "data": false }]
43
+[{ "start": 0, "length": 136365211648, "depth": 0, "zero": true, "data": false}]
44
45
=== Testing Hyper-V with chs force ===
46
47
-[{ "start": 0, "length": 136363130880, "depth": 0, "zero": true, "data": false }]
48
+[{ "start": 0, "length": 136363130880, "depth": 0, "zero": true, "data": false}]
49
50
=== Testing d2v Autodetect ===
51
52
-[{ "start": 0, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
53
-{ "start": 2097152, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
54
-{ "start": 4194304, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
55
-{ "start": 6291456, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
56
-{ "start": 8388608, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
57
-{ "start": 10485760, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
58
-{ "start": 12582912, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
59
-{ "start": 14680064, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
60
-{ "start": 16777216, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
61
-{ "start": 18874368, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
62
-{ "start": 20971520, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
63
-{ "start": 23068672, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
64
-{ "start": 25165824, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
65
-{ "start": 27262976, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
66
-{ "start": 29360128, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
67
-{ "start": 31457280, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
68
-{ "start": 33554432, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
69
-{ "start": 35651584, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
70
-{ "start": 37748736, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
71
-{ "start": 39845888, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
72
-{ "start": 41943040, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
73
-{ "start": 44040192, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
74
-{ "start": 46137344, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
75
-{ "start": 48234496, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
76
-{ "start": 50331648, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
77
-{ "start": 52428800, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
78
-{ "start": 54525952, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
79
-{ "start": 56623104, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
80
-{ "start": 58720256, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
81
-{ "start": 60817408, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
82
-{ "start": 62914560, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
83
-{ "start": 65011712, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
84
-{ "start": 67108864, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
85
-{ "start": 69206016, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
86
-{ "start": 71303168, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
87
-{ "start": 73400320, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
88
-{ "start": 75497472, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
89
-{ "start": 77594624, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
90
-{ "start": 79691776, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
91
-{ "start": 81788928, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
92
-{ "start": 83886080, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
93
-{ "start": 85983232, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
94
-{ "start": 88080384, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
95
-{ "start": 90177536, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
96
-{ "start": 92274688, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
97
-{ "start": 94371840, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
98
-{ "start": 96468992, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
99
-{ "start": 98566144, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
100
-{ "start": 100663296, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
101
-{ "start": 102760448, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
102
-{ "start": 104857600, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
103
-{ "start": 106954752, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
104
-{ "start": 109051904, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
105
-{ "start": 111149056, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
106
-{ "start": 113246208, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
107
-{ "start": 115343360, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
108
-{ "start": 117440512, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
109
-{ "start": 119537664, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
110
-{ "start": 121634816, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
111
-{ "start": 123731968, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
112
-{ "start": 125829120, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
113
-{ "start": 127926272, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
114
-{ "start": 130023424, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
115
-{ "start": 132120576, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
116
-{ "start": 134217728, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
117
-{ "start": 136314880, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
118
-{ "start": 138412032, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
119
-{ "start": 140509184, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
120
-{ "start": 142606336, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
121
-{ "start": 144703488, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
122
-{ "start": 146800640, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
123
-{ "start": 148897792, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
124
-{ "start": 150994944, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
125
-{ "start": 153092096, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
126
-{ "start": 155189248, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
127
-{ "start": 157286400, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
128
-{ "start": 159383552, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
129
-{ "start": 161480704, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
130
-{ "start": 163577856, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
131
-{ "start": 165675008, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
132
-{ "start": 167772160, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
133
-{ "start": 169869312, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
134
-{ "start": 171966464, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
135
-{ "start": 174063616, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
136
-{ "start": 176160768, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
137
-{ "start": 178257920, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
138
-{ "start": 180355072, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
139
-{ "start": 182452224, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
140
-{ "start": 184549376, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
141
-{ "start": 186646528, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
142
-{ "start": 188743680, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
143
-{ "start": 190840832, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
144
-{ "start": 192937984, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
145
-{ "start": 195035136, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
146
-{ "start": 197132288, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
147
-{ "start": 199229440, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
148
-{ "start": 201326592, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
149
-{ "start": 203423744, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
150
-{ "start": 205520896, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
151
-{ "start": 207618048, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
152
-{ "start": 209715200, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
153
-{ "start": 211812352, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
154
-{ "start": 213909504, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
155
-{ "start": 216006656, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
156
-{ "start": 218103808, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
157
-{ "start": 220200960, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
158
-{ "start": 222298112, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
159
-{ "start": 224395264, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
160
-{ "start": 226492416, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
161
-{ "start": 228589568, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
162
-{ "start": 230686720, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
163
-{ "start": 232783872, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
164
-{ "start": 234881024, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
165
-{ "start": 236978176, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
166
-{ "start": 239075328, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
167
-{ "start": 241172480, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
168
-{ "start": 243269632, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
169
-{ "start": 245366784, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
170
-{ "start": 247463936, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
171
-{ "start": 249561088, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
172
-{ "start": 251658240, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
173
-{ "start": 253755392, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
174
-{ "start": 255852544, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
175
-{ "start": 257949696, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
176
-{ "start": 260046848, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
177
-{ "start": 262144000, "length": 1310720, "depth": 0, "zero": false, "data": true, "offset": OFFSET }]
178
+[{ "start": 0, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
179
+{ "start": 2097152, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
180
+{ "start": 4194304, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
181
+{ "start": 6291456, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
182
+{ "start": 8388608, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
183
+{ "start": 10485760, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
184
+{ "start": 12582912, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
185
+{ "start": 14680064, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
186
+{ "start": 16777216, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
187
+{ "start": 18874368, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
188
+{ "start": 20971520, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
189
+{ "start": 23068672, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
190
+{ "start": 25165824, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
191
+{ "start": 27262976, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
192
+{ "start": 29360128, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
193
+{ "start": 31457280, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
194
+{ "start": 33554432, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
195
+{ "start": 35651584, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
196
+{ "start": 37748736, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
197
+{ "start": 39845888, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
198
+{ "start": 41943040, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
199
+{ "start": 44040192, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
200
+{ "start": 46137344, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
201
+{ "start": 48234496, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
202
+{ "start": 50331648, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
203
+{ "start": 52428800, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
204
+{ "start": 54525952, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
205
+{ "start": 56623104, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
206
+{ "start": 58720256, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
207
+{ "start": 60817408, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
208
+{ "start": 62914560, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
209
+{ "start": 65011712, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
210
+{ "start": 67108864, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
211
+{ "start": 69206016, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
212
+{ "start": 71303168, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
213
+{ "start": 73400320, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
214
+{ "start": 75497472, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
215
+{ "start": 77594624, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
216
+{ "start": 79691776, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
217
+{ "start": 81788928, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
218
+{ "start": 83886080, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
219
+{ "start": 85983232, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
220
+{ "start": 88080384, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
221
+{ "start": 90177536, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
222
+{ "start": 92274688, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
223
+{ "start": 94371840, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
224
+{ "start": 96468992, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
225
+{ "start": 98566144, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
226
+{ "start": 100663296, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
227
+{ "start": 102760448, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
228
+{ "start": 104857600, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
229
+{ "start": 106954752, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
230
+{ "start": 109051904, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
231
+{ "start": 111149056, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
232
+{ "start": 113246208, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
233
+{ "start": 115343360, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
234
+{ "start": 117440512, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
235
+{ "start": 119537664, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
236
+{ "start": 121634816, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
237
+{ "start": 123731968, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
238
+{ "start": 125829120, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
239
+{ "start": 127926272, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
240
+{ "start": 130023424, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
241
+{ "start": 132120576, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
242
+{ "start": 134217728, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
243
+{ "start": 136314880, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
244
+{ "start": 138412032, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
245
+{ "start": 140509184, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
246
+{ "start": 142606336, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
247
+{ "start": 144703488, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
248
+{ "start": 146800640, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
249
+{ "start": 148897792, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
250
+{ "start": 150994944, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
251
+{ "start": 153092096, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
252
+{ "start": 155189248, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
253
+{ "start": 157286400, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
254
+{ "start": 159383552, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
255
+{ "start": 161480704, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
256
+{ "start": 163577856, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
257
+{ "start": 165675008, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
258
+{ "start": 167772160, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
259
+{ "start": 169869312, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
260
+{ "start": 171966464, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
261
+{ "start": 174063616, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
262
+{ "start": 176160768, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
263
+{ "start": 178257920, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
264
+{ "start": 180355072, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
265
+{ "start": 182452224, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
266
+{ "start": 184549376, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
267
+{ "start": 186646528, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
268
+{ "start": 188743680, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
269
+{ "start": 190840832, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
270
+{ "start": 192937984, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
271
+{ "start": 195035136, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
272
+{ "start": 197132288, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
273
+{ "start": 199229440, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
274
+{ "start": 201326592, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
275
+{ "start": 203423744, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
276
+{ "start": 205520896, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
277
+{ "start": 207618048, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
278
+{ "start": 209715200, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
279
+{ "start": 211812352, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
280
+{ "start": 213909504, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
281
+{ "start": 216006656, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
282
+{ "start": 218103808, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
283
+{ "start": 220200960, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
284
+{ "start": 222298112, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
285
+{ "start": 224395264, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
286
+{ "start": 226492416, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
287
+{ "start": 228589568, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
288
+{ "start": 230686720, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
289
+{ "start": 232783872, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
290
+{ "start": 234881024, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
291
+{ "start": 236978176, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
292
+{ "start": 239075328, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
293
+{ "start": 241172480, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
294
+{ "start": 243269632, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
295
+{ "start": 245366784, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
296
+{ "start": 247463936, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
297
+{ "start": 249561088, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
298
+{ "start": 251658240, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
299
+{ "start": 253755392, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
300
+{ "start": 255852544, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
301
+{ "start": 257949696, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
302
+{ "start": 260046848, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
303
+{ "start": 262144000, "length": 1310720, "depth": 0, "zero": false, "data": true, "offset": OFFSET}]
304
305
=== Testing d2v with current_size force ===
306
307
-[{ "start": 0, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
308
-{ "start": 2097152, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
309
-{ "start": 4194304, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
310
-{ "start": 6291456, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
311
-{ "start": 8388608, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
312
-{ "start": 10485760, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
313
-{ "start": 12582912, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
314
-{ "start": 14680064, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
315
-{ "start": 16777216, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
316
-{ "start": 18874368, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
317
-{ "start": 20971520, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
318
-{ "start": 23068672, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
319
-{ "start": 25165824, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
320
-{ "start": 27262976, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
321
-{ "start": 29360128, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
322
-{ "start": 31457280, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
323
-{ "start": 33554432, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
324
-{ "start": 35651584, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
325
-{ "start": 37748736, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
326
-{ "start": 39845888, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
327
-{ "start": 41943040, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
328
-{ "start": 44040192, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
329
-{ "start": 46137344, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
330
-{ "start": 48234496, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
331
-{ "start": 50331648, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
332
-{ "start": 52428800, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
333
-{ "start": 54525952, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
334
-{ "start": 56623104, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
335
-{ "start": 58720256, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
336
-{ "start": 60817408, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
337
-{ "start": 62914560, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
338
-{ "start": 65011712, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
339
-{ "start": 67108864, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
340
-{ "start": 69206016, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
341
-{ "start": 71303168, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
342
-{ "start": 73400320, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
343
-{ "start": 75497472, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
344
-{ "start": 77594624, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
345
-{ "start": 79691776, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
346
-{ "start": 81788928, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
347
-{ "start": 83886080, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
348
-{ "start": 85983232, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
349
-{ "start": 88080384, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
350
-{ "start": 90177536, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
351
-{ "start": 92274688, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
352
-{ "start": 94371840, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
353
-{ "start": 96468992, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
354
-{ "start": 98566144, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
355
-{ "start": 100663296, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
356
-{ "start": 102760448, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
357
-{ "start": 104857600, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
358
-{ "start": 106954752, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
359
-{ "start": 109051904, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
360
-{ "start": 111149056, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
361
-{ "start": 113246208, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
362
-{ "start": 115343360, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
363
-{ "start": 117440512, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
364
-{ "start": 119537664, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
365
-{ "start": 121634816, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
366
-{ "start": 123731968, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
367
-{ "start": 125829120, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
368
-{ "start": 127926272, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
369
-{ "start": 130023424, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
370
-{ "start": 132120576, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
371
-{ "start": 134217728, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
372
-{ "start": 136314880, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
373
-{ "start": 138412032, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
374
-{ "start": 140509184, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
375
-{ "start": 142606336, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
376
-{ "start": 144703488, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
377
-{ "start": 146800640, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
378
-{ "start": 148897792, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
379
-{ "start": 150994944, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
380
-{ "start": 153092096, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
381
-{ "start": 155189248, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
382
-{ "start": 157286400, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
383
-{ "start": 159383552, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
384
-{ "start": 161480704, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
385
-{ "start": 163577856, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
386
-{ "start": 165675008, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
387
-{ "start": 167772160, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
388
-{ "start": 169869312, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
389
-{ "start": 171966464, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
390
-{ "start": 174063616, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
391
-{ "start": 176160768, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
392
-{ "start": 178257920, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
393
-{ "start": 180355072, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
394
-{ "start": 182452224, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
395
-{ "start": 184549376, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
396
-{ "start": 186646528, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
397
-{ "start": 188743680, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
398
-{ "start": 190840832, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
399
-{ "start": 192937984, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
400
-{ "start": 195035136, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
401
-{ "start": 197132288, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
402
-{ "start": 199229440, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
403
-{ "start": 201326592, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
404
-{ "start": 203423744, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
405
-{ "start": 205520896, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
406
-{ "start": 207618048, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
407
-{ "start": 209715200, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
408
-{ "start": 211812352, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
409
-{ "start": 213909504, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
410
-{ "start": 216006656, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
411
-{ "start": 218103808, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
412
-{ "start": 220200960, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
413
-{ "start": 222298112, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
414
-{ "start": 224395264, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
415
-{ "start": 226492416, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
416
-{ "start": 228589568, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
417
-{ "start": 230686720, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
418
-{ "start": 232783872, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
419
-{ "start": 234881024, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
420
-{ "start": 236978176, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
421
-{ "start": 239075328, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
422
-{ "start": 241172480, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
423
-{ "start": 243269632, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
424
-{ "start": 245366784, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
425
-{ "start": 247463936, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
426
-{ "start": 249561088, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
427
-{ "start": 251658240, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
428
-{ "start": 253755392, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
429
-{ "start": 255852544, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
430
-{ "start": 257949696, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
431
-{ "start": 260046848, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
432
-{ "start": 262144000, "length": 1310720, "depth": 0, "zero": false, "data": true, "offset": OFFSET }]
433
+[{ "start": 0, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
434
+{ "start": 2097152, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
435
+{ "start": 4194304, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
436
+{ "start": 6291456, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
437
+{ "start": 8388608, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
438
+{ "start": 10485760, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
439
+{ "start": 12582912, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
440
+{ "start": 14680064, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
441
+{ "start": 16777216, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
442
+{ "start": 18874368, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
443
+{ "start": 20971520, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
444
+{ "start": 23068672, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
445
+{ "start": 25165824, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
446
+{ "start": 27262976, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
447
+{ "start": 29360128, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
448
+{ "start": 31457280, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
449
+{ "start": 33554432, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
450
+{ "start": 35651584, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
451
+{ "start": 37748736, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
452
+{ "start": 39845888, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
453
+{ "start": 41943040, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
454
+{ "start": 44040192, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
455
+{ "start": 46137344, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
456
+{ "start": 48234496, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
457
+{ "start": 50331648, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
458
+{ "start": 52428800, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
459
+{ "start": 54525952, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
460
+{ "start": 56623104, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
461
+{ "start": 58720256, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
462
+{ "start": 60817408, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
463
+{ "start": 62914560, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
464
+{ "start": 65011712, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
465
+{ "start": 67108864, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
466
+{ "start": 69206016, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
467
+{ "start": 71303168, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
468
+{ "start": 73400320, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
469
+{ "start": 75497472, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
470
+{ "start": 77594624, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
471
+{ "start": 79691776, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
472
+{ "start": 81788928, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
473
+{ "start": 83886080, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
474
+{ "start": 85983232, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
475
+{ "start": 88080384, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
476
+{ "start": 90177536, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
477
+{ "start": 92274688, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
478
+{ "start": 94371840, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
479
+{ "start": 96468992, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
480
+{ "start": 98566144, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
481
+{ "start": 100663296, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
482
+{ "start": 102760448, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
483
+{ "start": 104857600, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
484
+{ "start": 106954752, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
485
+{ "start": 109051904, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
486
+{ "start": 111149056, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
487
+{ "start": 113246208, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
488
+{ "start": 115343360, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
489
+{ "start": 117440512, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
490
+{ "start": 119537664, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
491
+{ "start": 121634816, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
492
+{ "start": 123731968, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
493
+{ "start": 125829120, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
494
+{ "start": 127926272, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
495
+{ "start": 130023424, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
496
+{ "start": 132120576, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
497
+{ "start": 134217728, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
498
+{ "start": 136314880, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
499
+{ "start": 138412032, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
500
+{ "start": 140509184, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
501
+{ "start": 142606336, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
502
+{ "start": 144703488, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
503
+{ "start": 146800640, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
504
+{ "start": 148897792, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
505
+{ "start": 150994944, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
506
+{ "start": 153092096, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
507
+{ "start": 155189248, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
508
+{ "start": 157286400, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
509
+{ "start": 159383552, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
510
+{ "start": 161480704, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
511
+{ "start": 163577856, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
512
+{ "start": 165675008, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
513
+{ "start": 167772160, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
514
+{ "start": 169869312, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
515
+{ "start": 171966464, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
516
+{ "start": 174063616, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
517
+{ "start": 176160768, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
518
+{ "start": 178257920, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
519
+{ "start": 180355072, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
520
+{ "start": 182452224, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
521
+{ "start": 184549376, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
522
+{ "start": 186646528, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
523
+{ "start": 188743680, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
524
+{ "start": 190840832, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
525
+{ "start": 192937984, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
526
+{ "start": 195035136, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
527
+{ "start": 197132288, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
528
+{ "start": 199229440, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
529
+{ "start": 201326592, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
530
+{ "start": 203423744, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
531
+{ "start": 205520896, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
532
+{ "start": 207618048, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
533
+{ "start": 209715200, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
534
+{ "start": 211812352, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
535
+{ "start": 213909504, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
536
+{ "start": 216006656, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
537
+{ "start": 218103808, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
538
+{ "start": 220200960, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
539
+{ "start": 222298112, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
540
+{ "start": 224395264, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
541
+{ "start": 226492416, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
542
+{ "start": 228589568, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
543
+{ "start": 230686720, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
544
+{ "start": 232783872, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
545
+{ "start": 234881024, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
546
+{ "start": 236978176, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
547
+{ "start": 239075328, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
548
+{ "start": 241172480, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
549
+{ "start": 243269632, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
550
+{ "start": 245366784, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
551
+{ "start": 247463936, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
552
+{ "start": 249561088, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
553
+{ "start": 251658240, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
554
+{ "start": 253755392, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
555
+{ "start": 255852544, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
556
+{ "start": 257949696, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
557
+{ "start": 260046848, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
558
+{ "start": 262144000, "length": 1310720, "depth": 0, "zero": false, "data": true, "offset": OFFSET}]
559
560
=== Testing d2v with chs force ===
561
562
-[{ "start": 0, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
563
-{ "start": 2097152, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
564
-{ "start": 4194304, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
565
-{ "start": 6291456, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
566
-{ "start": 8388608, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
567
-{ "start": 10485760, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
568
-{ "start": 12582912, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
569
-{ "start": 14680064, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
570
-{ "start": 16777216, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
571
-{ "start": 18874368, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
572
-{ "start": 20971520, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
573
-{ "start": 23068672, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
574
-{ "start": 25165824, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
575
-{ "start": 27262976, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
576
-{ "start": 29360128, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
577
-{ "start": 31457280, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
578
-{ "start": 33554432, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
579
-{ "start": 35651584, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
580
-{ "start": 37748736, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
581
-{ "start": 39845888, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
582
-{ "start": 41943040, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
583
-{ "start": 44040192, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
584
-{ "start": 46137344, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
585
-{ "start": 48234496, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
586
-{ "start": 50331648, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
587
-{ "start": 52428800, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
588
-{ "start": 54525952, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
589
-{ "start": 56623104, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
590
-{ "start": 58720256, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
591
-{ "start": 60817408, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
592
-{ "start": 62914560, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
593
-{ "start": 65011712, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
594
-{ "start": 67108864, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
595
-{ "start": 69206016, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
596
-{ "start": 71303168, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
597
-{ "start": 73400320, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
598
-{ "start": 75497472, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
599
-{ "start": 77594624, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
600
-{ "start": 79691776, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
601
-{ "start": 81788928, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
602
-{ "start": 83886080, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
603
-{ "start": 85983232, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
604
-{ "start": 88080384, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
605
-{ "start": 90177536, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
606
-{ "start": 92274688, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
607
-{ "start": 94371840, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
608
-{ "start": 96468992, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
609
-{ "start": 98566144, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
610
-{ "start": 100663296, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
611
-{ "start": 102760448, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
612
-{ "start": 104857600, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
613
-{ "start": 106954752, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
614
-{ "start": 109051904, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
615
-{ "start": 111149056, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
616
-{ "start": 113246208, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
617
-{ "start": 115343360, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
618
-{ "start": 117440512, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
619
-{ "start": 119537664, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
620
-{ "start": 121634816, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
621
-{ "start": 123731968, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
622
-{ "start": 125829120, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
623
-{ "start": 127926272, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
624
-{ "start": 130023424, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
625
-{ "start": 132120576, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
626
-{ "start": 134217728, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
627
-{ "start": 136314880, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
628
-{ "start": 138412032, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
629
-{ "start": 140509184, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
630
-{ "start": 142606336, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
631
-{ "start": 144703488, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
632
-{ "start": 146800640, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
633
-{ "start": 148897792, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
634
-{ "start": 150994944, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
635
-{ "start": 153092096, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
636
-{ "start": 155189248, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
637
-{ "start": 157286400, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
638
-{ "start": 159383552, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
639
-{ "start": 161480704, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
640
-{ "start": 163577856, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
641
-{ "start": 165675008, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
642
-{ "start": 167772160, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
643
-{ "start": 169869312, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
644
-{ "start": 171966464, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
645
-{ "start": 174063616, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
646
-{ "start": 176160768, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
647
-{ "start": 178257920, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
648
-{ "start": 180355072, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
649
-{ "start": 182452224, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
650
-{ "start": 184549376, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
651
-{ "start": 186646528, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
652
-{ "start": 188743680, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
653
-{ "start": 190840832, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
654
-{ "start": 192937984, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
655
-{ "start": 195035136, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
656
-{ "start": 197132288, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
657
-{ "start": 199229440, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
658
-{ "start": 201326592, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
659
-{ "start": 203423744, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
660
-{ "start": 205520896, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
661
-{ "start": 207618048, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
662
-{ "start": 209715200, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
663
-{ "start": 211812352, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
664
-{ "start": 213909504, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
665
-{ "start": 216006656, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
666
-{ "start": 218103808, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
667
-{ "start": 220200960, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
668
-{ "start": 222298112, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
669
-{ "start": 224395264, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
670
-{ "start": 226492416, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
671
-{ "start": 228589568, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
672
-{ "start": 230686720, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
673
-{ "start": 232783872, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
674
-{ "start": 234881024, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
675
-{ "start": 236978176, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
676
-{ "start": 239075328, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
677
-{ "start": 241172480, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
678
-{ "start": 243269632, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
679
-{ "start": 245366784, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
680
-{ "start": 247463936, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
681
-{ "start": 249561088, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
682
-{ "start": 251658240, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
683
-{ "start": 253755392, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
684
-{ "start": 255852544, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
685
-{ "start": 257949696, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
686
-{ "start": 260046848, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET },
687
-{ "start": 262144000, "length": 1310720, "depth": 0, "zero": false, "data": true, "offset": OFFSET }]
688
+[{ "start": 0, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
689
+{ "start": 2097152, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
690
+{ "start": 4194304, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
691
+{ "start": 6291456, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
692
+{ "start": 8388608, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
693
+{ "start": 10485760, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
694
+{ "start": 12582912, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
695
+{ "start": 14680064, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
696
+{ "start": 16777216, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
697
+{ "start": 18874368, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
698
+{ "start": 20971520, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
699
+{ "start": 23068672, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
700
+{ "start": 25165824, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
701
+{ "start": 27262976, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
702
+{ "start": 29360128, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
703
+{ "start": 31457280, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
704
+{ "start": 33554432, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
705
+{ "start": 35651584, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
706
+{ "start": 37748736, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
707
+{ "start": 39845888, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
708
+{ "start": 41943040, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
709
+{ "start": 44040192, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
710
+{ "start": 46137344, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
711
+{ "start": 48234496, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
712
+{ "start": 50331648, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
713
+{ "start": 52428800, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
714
+{ "start": 54525952, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
715
+{ "start": 56623104, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
716
+{ "start": 58720256, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
717
+{ "start": 60817408, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
718
+{ "start": 62914560, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
719
+{ "start": 65011712, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
720
+{ "start": 67108864, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
721
+{ "start": 69206016, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
722
+{ "start": 71303168, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
723
+{ "start": 73400320, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
724
+{ "start": 75497472, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
725
+{ "start": 77594624, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
726
+{ "start": 79691776, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
727
+{ "start": 81788928, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
728
+{ "start": 83886080, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
729
+{ "start": 85983232, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
730
+{ "start": 88080384, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
731
+{ "start": 90177536, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
732
+{ "start": 92274688, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
733
+{ "start": 94371840, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
734
+{ "start": 96468992, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
735
+{ "start": 98566144, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
736
+{ "start": 100663296, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
737
+{ "start": 102760448, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
738
+{ "start": 104857600, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
739
+{ "start": 106954752, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
740
+{ "start": 109051904, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
741
+{ "start": 111149056, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
742
+{ "start": 113246208, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
743
+{ "start": 115343360, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
744
+{ "start": 117440512, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
745
+{ "start": 119537664, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
746
+{ "start": 121634816, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
747
+{ "start": 123731968, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
748
+{ "start": 125829120, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
749
+{ "start": 127926272, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
750
+{ "start": 130023424, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
751
+{ "start": 132120576, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
752
+{ "start": 134217728, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
753
+{ "start": 136314880, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
754
+{ "start": 138412032, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
755
+{ "start": 140509184, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
756
+{ "start": 142606336, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
757
+{ "start": 144703488, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
758
+{ "start": 146800640, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
759
+{ "start": 148897792, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
760
+{ "start": 150994944, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
761
+{ "start": 153092096, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
762
+{ "start": 155189248, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
763
+{ "start": 157286400, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
764
+{ "start": 159383552, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
765
+{ "start": 161480704, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
766
+{ "start": 163577856, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
767
+{ "start": 165675008, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
768
+{ "start": 167772160, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
769
+{ "start": 169869312, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
770
+{ "start": 171966464, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
771
+{ "start": 174063616, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
772
+{ "start": 176160768, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
773
+{ "start": 178257920, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
774
+{ "start": 180355072, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
775
+{ "start": 182452224, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
776
+{ "start": 184549376, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
777
+{ "start": 186646528, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
778
+{ "start": 188743680, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
779
+{ "start": 190840832, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
780
+{ "start": 192937984, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
781
+{ "start": 195035136, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
782
+{ "start": 197132288, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
783
+{ "start": 199229440, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
784
+{ "start": 201326592, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
785
+{ "start": 203423744, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
786
+{ "start": 205520896, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
787
+{ "start": 207618048, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
788
+{ "start": 209715200, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
789
+{ "start": 211812352, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
790
+{ "start": 213909504, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
791
+{ "start": 216006656, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
792
+{ "start": 218103808, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
793
+{ "start": 220200960, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
794
+{ "start": 222298112, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
795
+{ "start": 224395264, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
796
+{ "start": 226492416, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
797
+{ "start": 228589568, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
798
+{ "start": 230686720, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
799
+{ "start": 232783872, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
800
+{ "start": 234881024, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
801
+{ "start": 236978176, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
802
+{ "start": 239075328, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
803
+{ "start": 241172480, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
804
+{ "start": 243269632, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
805
+{ "start": 245366784, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
806
+{ "start": 247463936, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
807
+{ "start": 249561088, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
808
+{ "start": 251658240, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
809
+{ "start": 253755392, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
810
+{ "start": 255852544, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
811
+{ "start": 257949696, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
812
+{ "start": 260046848, "length": 2097152, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
813
+{ "start": 262144000, "length": 1310720, "depth": 0, "zero": false, "data": true, "offset": OFFSET}]
814
815
=== Testing Image create, default ===
816
817
@@ -XXX,XX +XXX,XX @@ Formatting 'TEST_DIR/IMGFMT-create-test.IMGFMT', fmt=IMGFMT size=4294967296
818
819
=== Read created image, default opts ====
820
821
-[{ "start": 0, "length": 4295467008, "depth": 0, "zero": true, "data": false }]
822
+[{ "start": 0, "length": 4295467008, "depth": 0, "zero": true, "data": false}]
823
824
=== Read created image, force_size_calc=chs ====
825
826
-[{ "start": 0, "length": 4295467008, "depth": 0, "zero": true, "data": false }]
827
+[{ "start": 0, "length": 4295467008, "depth": 0, "zero": true, "data": false}]
828
829
=== Read created image, force_size_calc=current_size ====
830
831
-[{ "start": 0, "length": 4295467008, "depth": 0, "zero": true, "data": false }]
832
+[{ "start": 0, "length": 4295467008, "depth": 0, "zero": true, "data": false}]
833
834
=== Testing Image create, force_size ===
835
836
@@ -XXX,XX +XXX,XX @@ Formatting 'TEST_DIR/IMGFMT-create-test.IMGFMT', fmt=IMGFMT size=4294967296
837
838
=== Read created image, default opts ====
839
840
-[{ "start": 0, "length": 4294967296, "depth": 0, "zero": true, "data": false }]
841
+[{ "start": 0, "length": 4294967296, "depth": 0, "zero": true, "data": false}]
842
843
=== Read created image, force_size_calc=chs ====
844
845
-[{ "start": 0, "length": 4294967296, "depth": 0, "zero": true, "data": false }]
846
+[{ "start": 0, "length": 4294967296, "depth": 0, "zero": true, "data": false}]
847
848
=== Read created image, force_size_calc=current_size ====
849
850
-[{ "start": 0, "length": 4294967296, "depth": 0, "zero": true, "data": false }]
851
+[{ "start": 0, "length": 4294967296, "depth": 0, "zero": true, "data": false}]
852
*** done
853
--
47
--
854
2.29.2
48
2.29.2
855
49
856
50
diff view generated by jsdifflib