325dd915b2
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>
138 lines
3.8 KiB
Bash
Executable File
138 lines
3.8 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
#
|
|
# Test aligned and misaligned write zeroes operations.
|
|
#
|
|
# Copyright (C) 2012 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/>.
|
|
#
|
|
|
|
# creator
|
|
owner=pbonzini@redhat.com
|
|
|
|
seq=`basename $0`
|
|
echo "QA output created by $seq"
|
|
|
|
status=1 # failure is the default!
|
|
|
|
_cleanup()
|
|
{
|
|
_cleanup_test_img
|
|
}
|
|
trap "_cleanup; exit \$status" 0 1 2 3 15
|
|
|
|
# get standard environment, filters and checks
|
|
. ./common.rc
|
|
. ./common.filter
|
|
|
|
_supported_fmt generic
|
|
_supported_proto generic
|
|
_unsupported_imgopts "subformat=streamOptimized"
|
|
|
|
|
|
size=128M
|
|
_make_test_img $size
|
|
|
|
do_test()
|
|
{
|
|
local align=$1
|
|
local iocmd=$2
|
|
local img=$3
|
|
if [ "$IMGOPTSSYNTAX" = "true" ]
|
|
then
|
|
IO_OPEN_ARG="$img"
|
|
IO_EXTRA_ARGS="--image-opts"
|
|
else
|
|
IO_OPEN_ARG="-o driver=$IMGFMT,file.align=$align blkdebug::$img"
|
|
IO_EXTRA_ARGS=""
|
|
fi
|
|
{
|
|
echo "open $IO_OPEN_ARG"
|
|
echo $iocmd
|
|
} | $QEMU_IO $IO_EXTRA_ARGS
|
|
}
|
|
|
|
echo
|
|
echo "=== Test aligned and misaligned write zeroes operations ==="
|
|
|
|
for write_zero_cmd in "write -z" "aio_write -z"; do
|
|
for align in 512 4k; do
|
|
echo
|
|
echo "== preparing image =="
|
|
do_test $align "write -P 0xa 0x200 0x400" "$TEST_IMG" | _filter_qemu_io
|
|
do_test $align "write -P 0xa 0x20000 0x600" "$TEST_IMG" | _filter_qemu_io
|
|
do_test $align "$write_zero_cmd 0x400 0x20000" "$TEST_IMG" | _filter_qemu_io
|
|
|
|
echo
|
|
echo "== verifying patterns (1) =="
|
|
do_test $align "read -P 0xa 0x200 0x200" "$TEST_IMG" | _filter_qemu_io
|
|
do_test $align "read -P 0x0 0x400 0x20000" "$TEST_IMG" | _filter_qemu_io
|
|
do_test $align "read -P 0xa 0x20400 0x200" "$TEST_IMG" | _filter_qemu_io
|
|
|
|
echo
|
|
echo "== rewriting zeroes =="
|
|
do_test $align "write -P 0xb 0x10000 0x10000" "$TEST_IMG" | _filter_qemu_io
|
|
do_test $align "$write_zero_cmd 0x10000 0x10000" "$TEST_IMG" | _filter_qemu_io
|
|
|
|
echo
|
|
echo "== verifying patterns (2) =="
|
|
do_test $align "read -P 0x0 0x400 0x20000" "$TEST_IMG" | _filter_qemu_io
|
|
|
|
echo
|
|
echo "== rewriting unaligned zeroes =="
|
|
do_test $align "write -P 0xb 0x0 0x1000" "$TEST_IMG" | _filter_qemu_io
|
|
do_test $align "$write_zero_cmd 0x200 0x200" "$TEST_IMG" | _filter_qemu_io
|
|
|
|
echo
|
|
echo "== verifying patterns (3) =="
|
|
do_test $align "read -P 0xb 0x0 0x200" "$TEST_IMG" | _filter_qemu_io
|
|
do_test $align "read -P 0x0 0x200 0x200" "$TEST_IMG" | _filter_qemu_io
|
|
do_test $align "read -P 0xb 0x400 0xc00" "$TEST_IMG" | _filter_qemu_io
|
|
|
|
echo
|
|
done
|
|
done
|
|
|
|
_cleanup_test_img
|
|
|
|
# Trigger truncate that would shrink qcow2 L1 table, which is done by
|
|
# clearing one entry (8 bytes) with bdrv_co_pwrite_zeroes()
|
|
|
|
echo
|
|
echo "=== Test misaligned write zeroes via truncate ==="
|
|
echo
|
|
|
|
# any size will do, but the smaller the size the smaller the required image
|
|
CLUSTER_SIZE=$((4 * 1024))
|
|
L2_COVERAGE=$(($CLUSTER_SIZE * $CLUSTER_SIZE / 8))
|
|
_make_test_img $(($L2_COVERAGE * 2))
|
|
|
|
do_test 512 "write -P 1 0 0x200" "$TEST_IMG" | _filter_qemu_io
|
|
# next L2 table
|
|
do_test 512 "write -P 1 $L2_COVERAGE 0x200" "$TEST_IMG" | _filter_qemu_io
|
|
|
|
# only interested in qcow2 here; also other formats might respond with
|
|
# "not supported" error message
|
|
if [ $IMGFMT = "qcow2" ]; then
|
|
do_test 512 "truncate $L2_COVERAGE" "$TEST_IMG" | _filter_qemu_io
|
|
fi
|
|
|
|
do_test 512 "read -P 1 0 0x200" "$TEST_IMG" | _filter_qemu_io
|
|
|
|
# success, all done
|
|
echo
|
|
echo "*** done"
|
|
rm -f $seq.full
|
|
status=0
|