xref: /qemu/tests/qemu-iotests/171 (revision ccc47808fd1cf3984860c60e81a8496f27dbb8a1)
1*ccc47808STomáš Golembiovský#!/bin/bash
2*ccc47808STomáš Golembiovský#
3*ccc47808STomáš Golembiovský# Test 'offset' and 'size' options of the raw driver. Make sure we can't
4*ccc47808STomáš Golembiovský# (or can) read and write outside of the image size.
5*ccc47808STomáš Golembiovský#
6*ccc47808STomáš Golembiovský# Copyright (C) 2016 Red Hat, Inc.
7*ccc47808STomáš Golembiovský#
8*ccc47808STomáš Golembiovský# This program is free software; you can redistribute it and/or modify
9*ccc47808STomáš Golembiovský# it under the terms of the GNU General Public License as published by
10*ccc47808STomáš Golembiovský# the Free Software Foundation; either version 2 of the License, or
11*ccc47808STomáš Golembiovský# (at your option) any later version.
12*ccc47808STomáš Golembiovský#
13*ccc47808STomáš Golembiovský# This program is distributed in the hope that it will be useful,
14*ccc47808STomáš Golembiovský# but WITHOUT ANY WARRANTY; without even the implied warranty of
15*ccc47808STomáš Golembiovský# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16*ccc47808STomáš Golembiovský# GNU General Public License for more details.
17*ccc47808STomáš Golembiovský#
18*ccc47808STomáš Golembiovský# You should have received a copy of the GNU General Public License
19*ccc47808STomáš Golembiovský# along with this program.  If not, see <http://www.gnu.org/licenses/>.
20*ccc47808STomáš Golembiovský#
21*ccc47808STomáš Golembiovský
22*ccc47808STomáš Golembiovský# creator
23*ccc47808STomáš Golembiovskýowner=tgolembi@redhat.com
24*ccc47808STomáš Golembiovský
25*ccc47808STomáš Golembiovskýseq=`basename $0`
26*ccc47808STomáš Golembiovskýecho "QA output created by $seq"
27*ccc47808STomáš Golembiovský
28*ccc47808STomáš Golembiovskýhere=`pwd`
29*ccc47808STomáš Golembiovskýstatus=1	# failure is the default!
30*ccc47808STomáš Golembiovský
31*ccc47808STomáš Golembiovský_cleanup()
32*ccc47808STomáš Golembiovský{
33*ccc47808STomáš Golembiovský    _cleanup_test_img
34*ccc47808STomáš Golembiovský}
35*ccc47808STomáš Golembiovskýtrap "_cleanup; exit \$status" 0 1 2 3 15
36*ccc47808STomáš Golembiovský
37*ccc47808STomáš Golembiovský# get standard environment, filters and checks
38*ccc47808STomáš Golembiovský. ./common.rc
39*ccc47808STomáš Golembiovský. ./common.filter
40*ccc47808STomáš Golembiovský
41*ccc47808STomáš Golembiovský_supported_fmt raw
42*ccc47808STomáš Golembiovský_supported_proto file
43*ccc47808STomáš Golembiovský_supported_os Linux
44*ccc47808STomáš Golembiovský
45*ccc47808STomáš Golembiovský
46*ccc47808STomáš Golembiovský# Create JSON with options
47*ccc47808STomáš Golembiovskýimg_json() {
48*ccc47808STomáš Golembiovský    echo -n 'json:{"driver":"raw", '
49*ccc47808STomáš Golembiovský    echo -n "\"offset\":\"$img_offset\", "
50*ccc47808STomáš Golembiovský    if [ "$img_size" -ne -1 ] ; then
51*ccc47808STomáš Golembiovský        echo -n "\"size\":\"$img_size\", "
52*ccc47808STomáš Golembiovský    fi
53*ccc47808STomáš Golembiovský    echo -n '"file": {'
54*ccc47808STomáš Golembiovský    echo -n    '"driver":"file", '
55*ccc47808STomáš Golembiovský    echo -n    "\"filename\":\"$TEST_IMG\" "
56*ccc47808STomáš Golembiovský    echo -n "} }"
57*ccc47808STomáš Golembiovský}
58*ccc47808STomáš Golembiovský
59*ccc47808STomáš Golembiovskýdo_general_test() {
60*ccc47808STomáš Golembiovský    if [ "$img_size" -ge 0 ] ; then
61*ccc47808STomáš Golembiovský        test_size=$img_size
62*ccc47808STomáš Golembiovský    else
63*ccc47808STomáš Golembiovský        test_size=$((size-img_offset))
64*ccc47808STomáš Golembiovský    fi
65*ccc47808STomáš Golembiovský
66*ccc47808STomáš Golembiovský    echo
67*ccc47808STomáš Golembiovský    echo "write to image"
68*ccc47808STomáš Golembiovský    $QEMU_IO -c "write -P 0x0a 0 $test_size" "$(img_json)" | _filter_qemu_io
69*ccc47808STomáš Golembiovský
70*ccc47808STomáš Golembiovský    echo
71*ccc47808STomáš Golembiovský    echo "read the image"
72*ccc47808STomáš Golembiovský    $QEMU_IO -c "read -P 0x0a 0 $test_size" "$(img_json)" | _filter_qemu_io
73*ccc47808STomáš Golembiovský
74*ccc47808STomáš Golembiovský    echo
75*ccc47808STomáš Golembiovský    echo "check that offset is respected"
76*ccc47808STomáš Golembiovský    $QEMU_IO -c "read -v $((img_offset-2)) 4" $TEST_IMG | _filter_qemu_io
77*ccc47808STomáš Golembiovský
78*ccc47808STomáš Golembiovský    echo
79*ccc47808STomáš Golembiovský    echo "write before image boundary"
80*ccc47808STomáš Golembiovský    $QEMU_IO -c "write $((test_size-1)) 1" "$(img_json)" | _filter_qemu_io
81*ccc47808STomáš Golembiovský
82*ccc47808STomáš Golembiovský    echo
83*ccc47808STomáš Golembiovský    echo "write across image boundary"
84*ccc47808STomáš Golembiovský    $QEMU_IO -c "write $((test_size-1)) 2" "$(img_json)" | _filter_qemu_io
85*ccc47808STomáš Golembiovský
86*ccc47808STomáš Golembiovský    echo
87*ccc47808STomáš Golembiovský    echo "write at image boundary"
88*ccc47808STomáš Golembiovský    $QEMU_IO -c "write $test_size 1" "$(img_json)" | _filter_qemu_io
89*ccc47808STomáš Golembiovský
90*ccc47808STomáš Golembiovský    echo
91*ccc47808STomáš Golembiovský    echo "write after image boundary"
92*ccc47808STomáš Golembiovský    $QEMU_IO -c "write $((test_size+512)) 1" "$(img_json)" | _filter_qemu_io
93*ccc47808STomáš Golembiovský
94*ccc47808STomáš Golembiovský    echo
95*ccc47808STomáš Golembiovský    echo "writev before/after image boundary"
96*ccc47808STomáš Golembiovský    $QEMU_IO -c "writev $((test_size-512)) 512 512" "$(img_json)" | _filter_qemu_io
97*ccc47808STomáš Golembiovský
98*ccc47808STomáš Golembiovský    echo
99*ccc47808STomáš Golembiovský    echo "read before image boundary"
100*ccc47808STomáš Golembiovský    $QEMU_IO -c "read $((test_size-1)) 1" "$(img_json)" | _filter_qemu_io
101*ccc47808STomáš Golembiovský
102*ccc47808STomáš Golembiovský    echo
103*ccc47808STomáš Golembiovský    echo "read across image boundary"
104*ccc47808STomáš Golembiovský    $QEMU_IO -c "read $((test_size-1)) 2" "$(img_json)" | _filter_qemu_io
105*ccc47808STomáš Golembiovský
106*ccc47808STomáš Golembiovský    echo
107*ccc47808STomáš Golembiovský    echo "read at image boundary"
108*ccc47808STomáš Golembiovský    $QEMU_IO -c "read $test_size 1" "$(img_json)" | _filter_qemu_io
109*ccc47808STomáš Golembiovský
110*ccc47808STomáš Golembiovský    echo
111*ccc47808STomáš Golembiovský    echo "read after image boundary"
112*ccc47808STomáš Golembiovský    $QEMU_IO -c "read $((test_size+512)) 1" "$(img_json)" | _filter_qemu_io
113*ccc47808STomáš Golembiovský
114*ccc47808STomáš Golembiovský    echo
115*ccc47808STomáš Golembiovský    echo "readv before/after image boundary"
116*ccc47808STomáš Golembiovský    $QEMU_IO -c "readv $((test_size-512)) 512 512" "$(img_json)" | _filter_qemu_io
117*ccc47808STomáš Golembiovský
118*ccc47808STomáš Golembiovský    echo
119*ccc47808STomáš Golembiovský    echo "fill image with pattern"
120*ccc47808STomáš Golembiovský    $QEMU_IO -c "write -P 0x0a 0 $size" $TEST_IMG | _filter_qemu_io
121*ccc47808STomáš Golembiovský
122*ccc47808STomáš Golembiovský    echo
123*ccc47808STomáš Golembiovský    echo "write zeroes and check"
124*ccc47808STomáš Golembiovský    $QEMU_IO -c "write -z 0 512" "$(img_json)" | _filter_qemu_io
125*ccc47808STomáš Golembiovský    $QEMU_IO -c "read -v $((img_offset-2)) 4" $TEST_IMG | _filter_qemu_io
126*ccc47808STomáš Golembiovský
127*ccc47808STomáš Golembiovský    echo
128*ccc47808STomáš Golembiovský    echo "write zeroes across image boundary"
129*ccc47808STomáš Golembiovský    $QEMU_IO -c "write -z $((test_size-1)) 2" "$(img_json)" | _filter_qemu_io
130*ccc47808STomáš Golembiovský
131*ccc47808STomáš Golembiovský    echo
132*ccc47808STomáš Golembiovský    echo "write zeroes at image boundary and check"
133*ccc47808STomáš Golembiovský    $QEMU_IO -c "write -z $((test_size-2)) 2" "$(img_json)" | _filter_qemu_io
134*ccc47808STomáš Golembiovský    $QEMU_IO -c "read -v $((img_offset+test_size-2)) 2" $TEST_IMG | _filter_qemu_io
135*ccc47808STomáš Golembiovský    $QEMU_IO -c "read -v $((img_offset+test_size)) 2" $TEST_IMG | _filter_qemu_io
136*ccc47808STomáš Golembiovský
137*ccc47808STomáš Golembiovský    echo
138*ccc47808STomáš Golembiovský    echo "fill image with pattern"
139*ccc47808STomáš Golembiovský    $QEMU_IO -c "write -P 0x0a 0 $size" $TEST_IMG | _filter_qemu_io
140*ccc47808STomáš Golembiovský
141*ccc47808STomáš Golembiovský    echo
142*ccc47808STomáš Golembiovský    echo "discard and check"
143*ccc47808STomáš Golembiovský    $QEMU_IO -c "discard 0 512" "$(img_json)" | _filter_qemu_io
144*ccc47808STomáš Golembiovský    $QEMU_IO -c "read -v $((img_offset-2)) 4" $TEST_IMG | _filter_qemu_io
145*ccc47808STomáš Golembiovský
146*ccc47808STomáš Golembiovský    echo
147*ccc47808STomáš Golembiovský    echo "discard across image boundary"
148*ccc47808STomáš Golembiovský    $QEMU_IO -c "discard $((test_size-1)) 2" "$(img_json)" | _filter_qemu_io
149*ccc47808STomáš Golembiovský
150*ccc47808STomáš Golembiovský    echo
151*ccc47808STomáš Golembiovský    echo "discard at image boundary and check"
152*ccc47808STomáš Golembiovský    $QEMU_IO -c "discard $((test_size-2)) 2" "$(img_json)" | _filter_qemu_io
153*ccc47808STomáš Golembiovský    $QEMU_IO -c "read -v $((img_offset+test_size-2)) 2" $TEST_IMG | _filter_qemu_io
154*ccc47808STomáš Golembiovský    $QEMU_IO -c "read -v $((img_offset+test_size)) 2" $TEST_IMG | _filter_qemu_io
155*ccc47808STomáš Golembiovský}
156*ccc47808STomáš Golembiovský
157*ccc47808STomáš Golembiovskýecho
158*ccc47808STomáš Golembiovskýecho "== test 'offset' option =="
159*ccc47808STomáš Golembiovskýsize=4096
160*ccc47808STomáš Golembiovskýimg_offset=512
161*ccc47808STomáš Golembiovskýimg_size=-1
162*ccc47808STomáš Golembiovský_make_test_img $size
163*ccc47808STomáš Golembiovskýdo_general_test
164*ccc47808STomáš Golembiovský_cleanup_test_img
165*ccc47808STomáš Golembiovský
166*ccc47808STomáš Golembiovskýecho
167*ccc47808STomáš Golembiovskýecho "== test 'offset' and 'size' options =="
168*ccc47808STomáš Golembiovskýsize=4096
169*ccc47808STomáš Golembiovskýimg_offset=512
170*ccc47808STomáš Golembiovskýimg_size=2048
171*ccc47808STomáš Golembiovský_make_test_img $size
172*ccc47808STomáš Golembiovskýdo_general_test
173*ccc47808STomáš Golembiovský_cleanup_test_img
174*ccc47808STomáš Golembiovský
175*ccc47808STomáš Golembiovskýecho
176*ccc47808STomáš Golembiovskýecho "== test misaligned 'offset' =="
177*ccc47808STomáš Golembiovskýsize=4096
178*ccc47808STomáš Golembiovskýimg_offset=10
179*ccc47808STomáš Golembiovskýimg_size=2048
180*ccc47808STomáš Golembiovský_make_test_img $size
181*ccc47808STomáš Golembiovskýdo_general_test
182*ccc47808STomáš Golembiovský_cleanup_test_img
183*ccc47808STomáš Golembiovský
184*ccc47808STomáš Golembiovskýecho
185*ccc47808STomáš Golembiovskýecho "== test reopen =="
186*ccc47808STomáš Golembiovskýsize=4096
187*ccc47808STomáš Golembiovskýimg_offset=512
188*ccc47808STomáš Golembiovskýimg_size=512
189*ccc47808STomáš Golembiovský_make_test_img $size
190*ccc47808STomáš Golembiovský(
191*ccc47808STomáš Golembiovský$QEMU_IO "$(img_json)"  <<EOT
192*ccc47808STomáš Golembiovskýwrite -P 0x0a 0 512
193*ccc47808STomáš Golembiovskýwrite -P 0x0a 511 1
194*ccc47808STomáš Golembiovskýwrite -P 0x0a 512 1
195*ccc47808STomáš Golembiovskýreopen -o driver=raw,offset=1536,size=1024
196*ccc47808STomáš Golembiovskýwrite -P 0x0a 0 1024
197*ccc47808STomáš Golembiovskýwrite -P 0x0a 1023 1
198*ccc47808STomáš Golembiovskýwrite -P 0x0a 1024 1
199*ccc47808STomáš GolembiovskýEOT
200*ccc47808STomáš Golembiovský) | _filter_qemu_io
201*ccc47808STomáš Golembiovskýecho "checking boundaries"
202*ccc47808STomáš Golembiovský$QEMU_IO -c "read -v 510 4" $TEST_IMG | _filter_qemu_io
203*ccc47808STomáš Golembiovský$QEMU_IO -c "read -v 1022 4" $TEST_IMG | _filter_qemu_io
204*ccc47808STomáš Golembiovský$QEMU_IO -c "read -v 1534 4" $TEST_IMG | _filter_qemu_io
205*ccc47808STomáš Golembiovský$QEMU_IO -c "read -v 2558 4" $TEST_IMG | _filter_qemu_io
206*ccc47808STomáš Golembiovský_cleanup_test_img
207*ccc47808STomáš Golembiovský
208*ccc47808STomáš Golembiovský# success, all done
209*ccc47808STomáš Golembiovskýecho
210*ccc47808STomáš Golembiovskýecho "*** done"
211*ccc47808STomáš Golembiovskýrm -f $seq.full
212*ccc47808STomáš Golembiovskýstatus=0
213