1*d6ac6e93SEric Blake#!/bin/bash 2*d6ac6e93SEric Blake# 3*d6ac6e93SEric Blake# Test corner cases with unusual block geometries 4*d6ac6e93SEric Blake# 5*d6ac6e93SEric Blake# Copyright (C) 2016-2018 Red Hat, Inc. 6*d6ac6e93SEric Blake# 7*d6ac6e93SEric Blake# This program is free software; you can redistribute it and/or modify 8*d6ac6e93SEric Blake# it under the terms of the GNU General Public License as published by 9*d6ac6e93SEric Blake# the Free Software Foundation; either version 2 of the License, or 10*d6ac6e93SEric Blake# (at your option) any later version. 11*d6ac6e93SEric Blake# 12*d6ac6e93SEric Blake# This program is distributed in the hope that it will be useful, 13*d6ac6e93SEric Blake# but WITHOUT ANY WARRANTY; without even the implied warranty of 14*d6ac6e93SEric Blake# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15*d6ac6e93SEric Blake# GNU General Public License for more details. 16*d6ac6e93SEric Blake# 17*d6ac6e93SEric Blake# You should have received a copy of the GNU General Public License 18*d6ac6e93SEric Blake# along with this program. If not, see <http://www.gnu.org/licenses/>. 19*d6ac6e93SEric Blake# 20*d6ac6e93SEric Blake 21*d6ac6e93SEric Blake# creator 22*d6ac6e93SEric Blakeowner=eblake@redhat.com 23*d6ac6e93SEric Blake 24*d6ac6e93SEric Blakeseq=`basename $0` 25*d6ac6e93SEric Blakeecho "QA output created by $seq" 26*d6ac6e93SEric Blake 27*d6ac6e93SEric Blakehere=`pwd` 28*d6ac6e93SEric Blakestatus=1 # failure is the default! 29*d6ac6e93SEric Blake 30*d6ac6e93SEric Blake_cleanup() 31*d6ac6e93SEric Blake{ 32*d6ac6e93SEric Blake _cleanup_test_img 33*d6ac6e93SEric Blake} 34*d6ac6e93SEric Blaketrap "_cleanup; exit \$status" 0 1 2 3 15 35*d6ac6e93SEric Blake 36*d6ac6e93SEric Blake# get standard environment, filters and checks 37*d6ac6e93SEric Blake. ./common.rc 38*d6ac6e93SEric Blake. ./common.filter 39*d6ac6e93SEric Blake 40*d6ac6e93SEric Blake_supported_fmt qcow2 41*d6ac6e93SEric Blake_supported_proto file 42*d6ac6e93SEric Blake# This test assumes that discard leaves zero clusters; see test 177 for 43*d6ac6e93SEric Blake# other tests that also work in older images 44*d6ac6e93SEric Blake_unsupported_imgopts 'compat=0.10' 45*d6ac6e93SEric Blake 46*d6ac6e93SEric BlakeCLUSTER_SIZE=1M 47*d6ac6e93SEric Blakesize=128M 48*d6ac6e93SEric Blakeoptions=driver=blkdebug,image.driver=qcow2 49*d6ac6e93SEric Blakenested_opts=image.file.driver=file,image.file.filename=$TEST_IMG 50*d6ac6e93SEric Blake 51*d6ac6e93SEric Blakeecho 52*d6ac6e93SEric Blakeecho "== setting up files ==" 53*d6ac6e93SEric Blake 54*d6ac6e93SEric BlakeTEST_IMG="$TEST_IMG.base" _make_test_img $size 55*d6ac6e93SEric Blake$QEMU_IO -c "write -P 11 0 $size" "$TEST_IMG.base" | _filter_qemu_io 56*d6ac6e93SEric Blake_make_test_img -b "$TEST_IMG.base" 57*d6ac6e93SEric Blake$QEMU_IO -c "write -P 22 0 110M" "$TEST_IMG" | _filter_qemu_io 58*d6ac6e93SEric Blake 59*d6ac6e93SEric Blake# Limited to 64k max-transfer 60*d6ac6e93SEric Blakeecho 61*d6ac6e93SEric Blakeecho "== constrained alignment and max-transfer ==" 62*d6ac6e93SEric Blakelimits=align=4k,max-transfer=64k 63*d6ac6e93SEric Blake$QEMU_IO -c "open -o $options,$limits blkdebug::$TEST_IMG" \ 64*d6ac6e93SEric Blake -c "write -P 33 1000 128k" -c "read -P 33 1000 128k" | _filter_qemu_io 65*d6ac6e93SEric Blake 66*d6ac6e93SEric Blakeecho 67*d6ac6e93SEric Blakeecho "== write zero with constrained max-transfer ==" 68*d6ac6e93SEric Blakelimits=align=512,max-transfer=64k,opt-write-zero=$CLUSTER_SIZE 69*d6ac6e93SEric Blake$QEMU_IO -c "open -o $options,$limits blkdebug::$TEST_IMG" \ 70*d6ac6e93SEric Blake -c "write -z 8003584 2093056" | _filter_qemu_io 71*d6ac6e93SEric Blake 72*d6ac6e93SEric Blake# non-power-of-2 write-zero/discard alignments 73*d6ac6e93SEric Blakeecho 74*d6ac6e93SEric Blakeecho "== non-power-of-2 write zeroes limits ==" 75*d6ac6e93SEric Blake 76*d6ac6e93SEric Blakelimits=align=512,opt-write-zero=15M,max-write-zero=15M,opt-discard=15M,max-discard=15M 77*d6ac6e93SEric Blake$QEMU_IO -c "open -o $options,$limits blkdebug::$TEST_IMG" \ 78*d6ac6e93SEric Blake -c "write -z 32M 32M" | _filter_qemu_io 79*d6ac6e93SEric Blake 80*d6ac6e93SEric Blakeecho 81*d6ac6e93SEric Blakeecho "== non-power-of-2 discard limits ==" 82*d6ac6e93SEric Blake 83*d6ac6e93SEric Blakelimits=align=512,opt-write-zero=15M,max-write-zero=15M,opt-discard=15M,max-discard=15M 84*d6ac6e93SEric Blake$QEMU_IO -c "open -o $options,$limits blkdebug::$TEST_IMG" \ 85*d6ac6e93SEric Blake -c "discard 80000001 30M" | _filter_qemu_io 86*d6ac6e93SEric Blake 87*d6ac6e93SEric Blakeecho 88*d6ac6e93SEric Blakeecho "== block status smaller than alignment ==" 89*d6ac6e93SEric Blakelimits=align=4k 90*d6ac6e93SEric Blake$QEMU_IO -c "open -o $options,$limits blkdebug::$TEST_IMG" \ 91*d6ac6e93SEric Blake -c "alloc 1 1" -c "alloc 0x6dffff0 1000" -c "alloc 127m 5P" \ 92*d6ac6e93SEric Blake -c map | _filter_qemu_io 93*d6ac6e93SEric Blake 94*d6ac6e93SEric Blakeecho 95*d6ac6e93SEric Blakeecho "== verify image content ==" 96*d6ac6e93SEric Blake 97*d6ac6e93SEric Blakefunction verify_io() 98*d6ac6e93SEric Blake{ 99*d6ac6e93SEric Blake echo read -P 22 0 1000 100*d6ac6e93SEric Blake echo read -P 33 1000 128k 101*d6ac6e93SEric Blake echo read -P 22 132072 7871512 102*d6ac6e93SEric Blake echo read -P 0 8003584 2093056 103*d6ac6e93SEric Blake echo read -P 22 10096640 23457792 104*d6ac6e93SEric Blake echo read -P 0 32M 32M 105*d6ac6e93SEric Blake echo read -P 22 64M 13M 106*d6ac6e93SEric Blake echo read -P 0 77M 29M 107*d6ac6e93SEric Blake echo read -P 22 106M 4M 108*d6ac6e93SEric Blake echo read -P 11 110M 18M 109*d6ac6e93SEric Blake} 110*d6ac6e93SEric Blake 111*d6ac6e93SEric Blakeverify_io | $QEMU_IO -r "$TEST_IMG" | _filter_qemu_io 112*d6ac6e93SEric Blake$QEMU_IMG map --image-opts "$options,$nested_opts,align=4k" \ 113*d6ac6e93SEric Blake | _filter_qemu_img_map 114*d6ac6e93SEric Blake 115*d6ac6e93SEric Blake_check_test_img 116*d6ac6e93SEric Blake 117*d6ac6e93SEric Blake# success, all done 118*d6ac6e93SEric Blakeecho "*** done" 119*d6ac6e93SEric Blakestatus=0 120