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