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