#!/bin/bash # # Test 'offset' and 'size' options of the raw driver. Make sure we can't # (or can) read and write outside of the image size. # # Copyright (C) 2016 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=tgolembi@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 raw _supported_proto file _supported_os Linux # Create JSON with options img_json() { printf %s 'json:{"driver":"raw", ' printf %s "\"offset\":\"$img_offset\", " if [ "$img_size" -ne -1 ] ; then printf %s "\"size\":\"$img_size\", " fi printf %s '"file": {' printf %s '"driver":"file", ' printf %s "\"filename\":\"$TEST_IMG\" " printf %s "} }" } do_general_test() { if [ "$img_size" -ge 0 ] ; then test_size=$img_size else test_size=$((size-img_offset)) fi echo echo "write to image" $QEMU_IO -c "write -P 0x0a 0 $test_size" "$(img_json)" | _filter_qemu_io echo echo "read the image" $QEMU_IO -c "read -P 0x0a 0 $test_size" "$(img_json)" | _filter_qemu_io echo echo "check that offset is respected" $QEMU_IO -c "read -v $((img_offset-2)) 4" $TEST_IMG | _filter_qemu_io echo echo "write before image boundary" $QEMU_IO -c "write $((test_size-1)) 1" "$(img_json)" | _filter_qemu_io echo echo "write across image boundary" $QEMU_IO -c "write $((test_size-1)) 2" "$(img_json)" | _filter_qemu_io echo echo "write at image boundary" $QEMU_IO -c "write $test_size 1" "$(img_json)" | _filter_qemu_io echo echo "write after image boundary" $QEMU_IO -c "write $((test_size+512)) 1" "$(img_json)" | _filter_qemu_io echo echo "writev before/after image boundary" $QEMU_IO -c "writev $((test_size-512)) 512 512" "$(img_json)" | _filter_qemu_io echo echo "read before image boundary" $QEMU_IO -c "read $((test_size-1)) 1" "$(img_json)" | _filter_qemu_io echo echo "read across image boundary" $QEMU_IO -c "read $((test_size-1)) 2" "$(img_json)" | _filter_qemu_io echo echo "read at image boundary" $QEMU_IO -c "read $test_size 1" "$(img_json)" | _filter_qemu_io echo echo "read after image boundary" $QEMU_IO -c "read $((test_size+512)) 1" "$(img_json)" | _filter_qemu_io echo echo "readv before/after image boundary" $QEMU_IO -c "readv $((test_size-512)) 512 512" "$(img_json)" | _filter_qemu_io echo echo "fill image with pattern" $QEMU_IO -c "write -P 0x0a 0 $size" $TEST_IMG | _filter_qemu_io echo echo "write zeroes and check" $QEMU_IO -c "write -z 0 512" "$(img_json)" | _filter_qemu_io $QEMU_IO -c "read -v $((img_offset-2)) 4" $TEST_IMG | _filter_qemu_io echo echo "write zeroes across image boundary" $QEMU_IO -c "write -z $((test_size-1)) 2" "$(img_json)" | _filter_qemu_io echo echo "write zeroes at image boundary and check" $QEMU_IO -c "write -z $((test_size-2)) 2" "$(img_json)" | _filter_qemu_io $QEMU_IO -c "read -v $((img_offset+test_size-2)) 2" $TEST_IMG | _filter_qemu_io $QEMU_IO -c "read -v $((img_offset+test_size)) 2" $TEST_IMG | _filter_qemu_io echo echo "fill image with pattern" $QEMU_IO -c "write -P 0x0a 0 $size" $TEST_IMG | _filter_qemu_io echo echo "discard and check" $QEMU_IO -c "discard 0 512" "$(img_json)" | _filter_qemu_io $QEMU_IO -c "read -v $((img_offset-2)) 4" $TEST_IMG | _filter_qemu_io echo echo "discard across image boundary" $QEMU_IO -c "discard $((test_size-1)) 2" "$(img_json)" | _filter_qemu_io echo echo "discard at image boundary and check" $QEMU_IO -c "discard $((test_size-2)) 2" "$(img_json)" | _filter_qemu_io $QEMU_IO -c "read -v $((img_offset+test_size-2)) 2" $TEST_IMG | _filter_qemu_io $QEMU_IO -c "read -v $((img_offset+test_size)) 2" $TEST_IMG | _filter_qemu_io } echo echo "== test 'offset' option ==" size=4096 img_offset=512 img_size=-1 _make_test_img $size do_general_test _cleanup_test_img echo echo "== test 'offset' and 'size' options ==" size=4096 img_offset=512 img_size=2048 _make_test_img $size do_general_test _cleanup_test_img echo echo "== test misaligned 'offset' ==" size=4096 img_offset=10 img_size=2048 _make_test_img $size do_general_test _cleanup_test_img echo echo "== test reopen ==" size=4096 img_offset=512 img_size=512 _make_test_img $size ( $QEMU_IO "$(img_json)" <