Message ID | 20220714132801.72464-3-hreitz@redhat.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | block/parallels: Fix buffer-based write call | expand |
On 14.07.2022 15:28, Hanna Reitz wrote: > Test an allocating write to a parallels image that has a backing node. > Before HEAD^, doing so used to give me a failed assertion (when the > backing node contains only `42` bytes; the results varies with the value > chosen, for `0` bytes, for example, all I get is EIO). > > Signed-off-by: Hanna Reitz <hreitz@redhat.com> > --- > tests/qemu-iotests/131 | 35 ++++++++++++++++++++++++++++++++++- > tests/qemu-iotests/131.out | 13 +++++++++++++ > 2 files changed, 47 insertions(+), 1 deletion(-) > > diff --git a/tests/qemu-iotests/131 b/tests/qemu-iotests/131 > index d7456cae5b..a847692b4c 100755 > --- a/tests/qemu-iotests/131 > +++ b/tests/qemu-iotests/131 > @@ -43,7 +43,7 @@ _supported_os Linux > > inuse_offset=$((0x2c)) > > -size=64M > +size=$((64 * 1024 * 1024)) > CLUSTER_SIZE=64k > IMGFMT=parallels > _make_test_img $size > @@ -70,6 +70,39 @@ _check_test_img > _check_test_img -r all > { $QEMU_IO -c "read -P 0x11 64k 64k" "$TEST_IMG"; } 2>&1 | _filter_qemu_io | _filter_testdir > > +echo "== allocate with backing ==" > +# Verify that allocating clusters works fine even when there is a backing image. > +# Regression test for a bug where we would pass a buffer read from the backing > +# node as a QEMUIOVector object, which could cause anything from I/O errors over > +# assertion failures to invalid reads from memory. > + > +# Clear image > +_make_test_img $size > +# Create base image > +TEST_IMG="$TEST_IMG.base" _make_test_img $size > + > +# Write some data to the base image (which would trigger an assertion failure if > +# interpreted as a QEMUIOVector) > +$QEMU_IO -c 'write -P 42 0 64k' "$TEST_IMG.base" | _filter_qemu_io > + > +# Parallels does not seem to support storing a backing filename in the image > +# itself, so we need to build our backing chain on the command line > +imgopts="driver=$IMGFMT,file.driver=$IMGPROTO,file.filename=$TEST_IMG" > +imgopts+=",backing.driver=$IMGFMT" > +imgopts+=",backing.file.driver=$IMGPROTO,backing.file.filename=$TEST_IMG.base" > + > +# Cause allocation in the top image > +QEMU_IO_OPTIONS=$QEMU_IO_OPTIONS_NO_FMT \ > + $QEMU_IO --image-opts "$imgopts" -c 'write -P 1 0 64' | _filter_qemu_io > + > +# Verify > +QEMU_IO_OPTIONS=$QEMU_IO_OPTIONS_NO_FMT \ > + $QEMU_IO --image-opts "$imgopts" \ > + -c 'read -P 1 0 64' \ > + -c "read -P 42 64 $((64 * 1024 - 64))" \ > + -c "read -P 0 64k $((size - 64 * 1024))" \ > + | _filter_qemu_io > + > # success, all done > echo "*** done" > rm -f $seq.full > diff --git a/tests/qemu-iotests/131.out b/tests/qemu-iotests/131.out > index 70da03dee5..de5ef7a8f5 100644 > --- a/tests/qemu-iotests/131.out > +++ b/tests/qemu-iotests/131.out > @@ -37,4 +37,17 @@ Double checking the fixed image now... > No errors were found on the image. > read 65536/65536 bytes at offset 65536 > 64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) > +== allocate with backing == > +Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=67108864 > +Formatting 'TEST_DIR/t.IMGFMT.base', fmt=IMGFMT size=67108864 > +wrote 65536/65536 bytes at offset 0 > +64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) > +wrote 64/64 bytes at offset 0 > +64 bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) > +read 64/64 bytes at offset 0 > +64 bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) > +read 65472/65472 bytes at offset 64 > +63.938 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) > +read 67043328/67043328 bytes at offset 65536 > +63.938 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) > *** done Reviewed-by: Denis V. Lunev <den@openvz.org>
On 7/14/22 16:28, Hanna Reitz wrote: > Test an allocating write to a parallels image that has a backing node. > Before HEAD^, doing so used to give me a failed assertion (when the > backing node contains only `42` bytes; the results varies with the value > chosen, for `0` bytes, for example, all I get is EIO). > > Signed-off-by: Hanna Reitz<hreitz@redhat.com> Reviewed-by: Vladimir Sementsov-Ogievskiy <vsementsov@yandex-team.ru>
diff --git a/tests/qemu-iotests/131 b/tests/qemu-iotests/131 index d7456cae5b..a847692b4c 100755 --- a/tests/qemu-iotests/131 +++ b/tests/qemu-iotests/131 @@ -43,7 +43,7 @@ _supported_os Linux inuse_offset=$((0x2c)) -size=64M +size=$((64 * 1024 * 1024)) CLUSTER_SIZE=64k IMGFMT=parallels _make_test_img $size @@ -70,6 +70,39 @@ _check_test_img _check_test_img -r all { $QEMU_IO -c "read -P 0x11 64k 64k" "$TEST_IMG"; } 2>&1 | _filter_qemu_io | _filter_testdir +echo "== allocate with backing ==" +# Verify that allocating clusters works fine even when there is a backing image. +# Regression test for a bug where we would pass a buffer read from the backing +# node as a QEMUIOVector object, which could cause anything from I/O errors over +# assertion failures to invalid reads from memory. + +# Clear image +_make_test_img $size +# Create base image +TEST_IMG="$TEST_IMG.base" _make_test_img $size + +# Write some data to the base image (which would trigger an assertion failure if +# interpreted as a QEMUIOVector) +$QEMU_IO -c 'write -P 42 0 64k' "$TEST_IMG.base" | _filter_qemu_io + +# Parallels does not seem to support storing a backing filename in the image +# itself, so we need to build our backing chain on the command line +imgopts="driver=$IMGFMT,file.driver=$IMGPROTO,file.filename=$TEST_IMG" +imgopts+=",backing.driver=$IMGFMT" +imgopts+=",backing.file.driver=$IMGPROTO,backing.file.filename=$TEST_IMG.base" + +# Cause allocation in the top image +QEMU_IO_OPTIONS=$QEMU_IO_OPTIONS_NO_FMT \ + $QEMU_IO --image-opts "$imgopts" -c 'write -P 1 0 64' | _filter_qemu_io + +# Verify +QEMU_IO_OPTIONS=$QEMU_IO_OPTIONS_NO_FMT \ + $QEMU_IO --image-opts "$imgopts" \ + -c 'read -P 1 0 64' \ + -c "read -P 42 64 $((64 * 1024 - 64))" \ + -c "read -P 0 64k $((size - 64 * 1024))" \ + | _filter_qemu_io + # success, all done echo "*** done" rm -f $seq.full diff --git a/tests/qemu-iotests/131.out b/tests/qemu-iotests/131.out index 70da03dee5..de5ef7a8f5 100644 --- a/tests/qemu-iotests/131.out +++ b/tests/qemu-iotests/131.out @@ -37,4 +37,17 @@ Double checking the fixed image now... No errors were found on the image. read 65536/65536 bytes at offset 65536 64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +== allocate with backing == +Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=67108864 +Formatting 'TEST_DIR/t.IMGFMT.base', fmt=IMGFMT size=67108864 +wrote 65536/65536 bytes at offset 0 +64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 64/64 bytes at offset 0 +64 bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +read 64/64 bytes at offset 0 +64 bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +read 65472/65472 bytes at offset 64 +63.938 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +read 67043328/67043328 bytes at offset 65536 +63.938 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) *** done
Test an allocating write to a parallels image that has a backing node. Before HEAD^, doing so used to give me a failed assertion (when the backing node contains only `42` bytes; the results varies with the value chosen, for `0` bytes, for example, all I get is EIO). Signed-off-by: Hanna Reitz <hreitz@redhat.com> --- tests/qemu-iotests/131 | 35 ++++++++++++++++++++++++++++++++++- tests/qemu-iotests/131.out | 13 +++++++++++++ 2 files changed, 47 insertions(+), 1 deletion(-)