#!/bin/bash # # Test corner cases with unusual block geometries # # Copyright (C) 2016-2017 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 . # # creator owner=eblake@redhat.com seq=`basename $0` echo "QA output created by $seq" here=`pwd` 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 qcow2 _supported_proto file CLUSTER_SIZE=1M size=128M options=driver=blkdebug,image.driver=qcow2 nested_opts=image.file.driver=file,image.file.filename=$TEST_IMG echo echo "== setting up files ==" TEST_IMG="$TEST_IMG.base" _make_test_img $size $QEMU_IO -c "write -P 11 0 $size" "$TEST_IMG.base" | _filter_qemu_io _make_test_img -b "$TEST_IMG.base" $QEMU_IO -c "write -P 22 0 $size" "$TEST_IMG" | _filter_qemu_io # Limited to 64k max-transfer echo echo "== constrained alignment and max-transfer ==" limits=align=4k,max-transfer=64k $QEMU_IO -c "open -o $options,$limits blkdebug::$TEST_IMG" \ -c "write -P 33 1000 128k" -c "read -P 33 1000 128k" | _filter_qemu_io echo echo "== write zero with constrained max-transfer ==" limits=align=512,max-transfer=64k,opt-write-zero=$CLUSTER_SIZE $QEMU_IO -c "open -o $options,$limits blkdebug::$TEST_IMG" \ -c "write -z 8003584 2093056" | _filter_qemu_io # non-power-of-2 write-zero/discard alignments echo echo "== non-power-of-2 write zeroes limits ==" limits=align=512,opt-write-zero=15M,max-write-zero=15M,opt-discard=15M,max-discard=15M $QEMU_IO -c "open -o $options,$limits blkdebug::$TEST_IMG" \ -c "write -z 32M 32M" | _filter_qemu_io echo echo "== non-power-of-2 discard limits ==" limits=align=512,opt-write-zero=15M,max-write-zero=15M,opt-discard=15M,max-discard=15M $QEMU_IO -c "open -o $options,$limits blkdebug::$TEST_IMG" \ -c "discard 80000001 30M" | _filter_qemu_io echo echo "== verify image content ==" function verify_io() { if ($QEMU_IMG info -f "$IMGFMT" "$TEST_IMG" | grep "compat: 0.10" > /dev/null); then # For v2 images, discarded clusters are read from the backing file discarded=11 else # Discarded clusters are zeroed for v3 or later discarded=0 fi echo read -P 22 0 1000 echo read -P 33 1000 128k echo read -P 22 132072 7871512 echo read -P 0 8003584 2093056 echo read -P 22 10096640 23457792 echo read -P 0 32M 32M echo read -P 22 64M 13M echo read -P $discarded 77M 29M echo read -P 22 106M 22M } verify_io | $QEMU_IO -r "$TEST_IMG" | _filter_qemu_io $QEMU_IMG map --image-opts "$options,$nested_opts,align=4k" \ | _filter_qemu_img_map _check_test_img # success, all done echo "*** done" status=0