summaryrefslogtreecommitdiffstats
path: root/tests/qemu-iotests/033
blob: ee8a1338bbd3a9fc9a160890be841bd9e3af39b8 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
#!/bin/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"

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 generic
_supported_proto generic
_supported_os Linux


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