streamOptimized does not support writes that do not span exactly one cluster. Furthermore, it cannot rewrite already allocated clusters. As such, many iotests do not work with it. Disable them. Signed-off-by: Max Reitz <mreitz@redhat.com> Message-id: 20190815153638.4600-6-mreitz@redhat.com Reviewed-by: John Snow <jsnow@redhat.com> Signed-off-by: Max Reitz <mreitz@redhat.com>
120 lines
3.8 KiB
Bash
Executable file
120 lines
3.8 KiB
Bash
Executable file
#!/usr/bin/env bash
|
|
#
|
|
# Test case for copy-on-read into qcow2, using the COR filter driver
|
|
#
|
|
# Copyright (C) 2018 Red Hat, Inc.
|
|
#
|
|
# This program is free software; you can redistribute it and/or modify
|
|
# it under the terms of the GNU General Public License as published by
|
|
# the Free Software Foundation; either version 2 of the License, or
|
|
# (at your option) any later version.
|
|
#
|
|
# This program is distributed in the hope that it will be useful,
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
# GNU General Public License for more details.
|
|
#
|
|
# You should have received a copy of the GNU General Public License
|
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
#
|
|
|
|
seq="$(basename $0)"
|
|
echo "QA output created by $seq"
|
|
|
|
status=1 # failure is the default!
|
|
|
|
# get standard environment, filters and checks
|
|
. ./common.rc
|
|
. ./common.filter
|
|
|
|
TEST_WRAP="$TEST_DIR/t.wrap.qcow2"
|
|
BLKDBG_CONF="$TEST_DIR/blkdebug.conf"
|
|
|
|
# Sanity check: our use of blkdebug fails if $TEST_DIR contains spaces
|
|
# or other problems
|
|
case "$TEST_DIR" in
|
|
*[^-_a-zA-Z0-9/]*)
|
|
_notrun "Suspicious TEST_DIR='$TEST_DIR', cowardly refusing to run" ;;
|
|
esac
|
|
|
|
_cleanup()
|
|
{
|
|
_cleanup_test_img
|
|
rm -f "$TEST_WRAP"
|
|
rm -f "$BLKDBG_CONF"
|
|
}
|
|
trap "_cleanup; exit \$status" 0 1 2 3 15
|
|
|
|
# Test is supported for any backing file; but we force qcow2 for our wrapper.
|
|
_supported_fmt generic
|
|
_supported_proto generic
|
|
# LUKS support may be possible, but it complicates things.
|
|
_unsupported_fmt luks
|
|
_unsupported_imgopts "subformat=streamOptimized"
|
|
|
|
echo
|
|
echo '=== Copy-on-read ==='
|
|
echo
|
|
|
|
# Prep the images
|
|
# VPC rounds image sizes to a specific geometry, force a specific size.
|
|
if [ "$IMGFMT" = "vpc" ]; then
|
|
IMGOPTS=$(_optstr_add "$IMGOPTS" "force_size")
|
|
fi
|
|
_make_test_img 4G
|
|
$QEMU_IO -c "write -P 55 3G 1k" "$TEST_IMG" | _filter_qemu_io
|
|
IMGPROTO=file IMGFMT=qcow2 IMGOPTS= TEST_IMG_FILE="$TEST_WRAP" \
|
|
_make_test_img -F "$IMGFMT" -b "$TEST_IMG" | _filter_img_create
|
|
$QEMU_IO -f qcow2 -c "write -z -u 1M 64k" "$TEST_WRAP" | _filter_qemu_io
|
|
|
|
# Ensure that a read of two clusters, but where one is already allocated,
|
|
# does not re-write the allocated cluster
|
|
cat > "$BLKDBG_CONF" <<EOF
|
|
[inject-error]
|
|
event = "cor_write"
|
|
sector = "2048"
|
|
EOF
|
|
$QEMU_IO -c "open \
|
|
-o driver=copy-on-read,file.driver=blkdebug,file.config=$BLKDBG_CONF,file.image.driver=qcow2 $TEST_WRAP" \
|
|
-c "read -P 0 1M 128k" | _filter_qemu_io
|
|
|
|
# Read the areas we want copied. A zero-length read should still be a
|
|
# no-op. The next read is under 2G, but aligned so that rounding to
|
|
# clusters copies more than 2G of zeroes. The final read will pick up
|
|
# the non-zero data in the same cluster. Since a 2G read may exhaust
|
|
# memory on some machines (particularly 32-bit), we skip the test if
|
|
# that fails due to memory pressure.
|
|
$QEMU_IO \
|
|
-c "open -o driver=copy-on-read,file.driver=qcow2 $TEST_WRAP" \
|
|
-c "read 0 0" \
|
|
| _filter_qemu_io
|
|
output=$($QEMU_IO \
|
|
-c "open -o driver=copy-on-read,file.driver=qcow2 $TEST_WRAP" \
|
|
-c "read -P 0 1k $((2*1024*1024*1024 - 512))" \
|
|
2>&1 | _filter_qemu_io)
|
|
case $output in
|
|
*allocate*)
|
|
_notrun "Insufficent memory to run test" ;;
|
|
*) printf '%s\n' "$output" ;;
|
|
esac
|
|
$QEMU_IO \
|
|
-c "open -o driver=copy-on-read,file.driver=qcow2 $TEST_WRAP" \
|
|
-c "read -P 0 $((3*1024*1024*1024 + 1024)) 1k" \
|
|
| _filter_qemu_io
|
|
|
|
# Copy-on-read is incompatible with read-only
|
|
$QEMU_IO \
|
|
-c "open -r -o driver=copy-on-read,file.driver=qcow2 $TEST_WRAP" \
|
|
2>&1 | _filter_testdir
|
|
|
|
# Break the backing chain, and show that images are identical, and that
|
|
# we properly copied over explicit zeros.
|
|
$QEMU_IMG rebase -u -b "" -f qcow2 "$TEST_WRAP"
|
|
$QEMU_IO -f qcow2 -c map "$TEST_WRAP"
|
|
_check_test_img
|
|
$QEMU_IMG compare -f $IMGFMT -F qcow2 "$TEST_IMG" "$TEST_WRAP"
|
|
|
|
# success, all done
|
|
echo '*** done'
|
|
status=0
|