1#!/bin/bash 2# 3# Test preallocated resize of raw images 4# 5# Copyright (C) 2017 Red Hat, Inc. 6# 7# This program is free software; you can redistribute it and/or modify 8# it under the terms of the GNU General Public License as published by 9# the Free Software Foundation; either version 2 of the License, or 10# (at your option) any later version. 11# 12# This program is distributed in the hope that it will be useful, 13# but WITHOUT ANY WARRANTY; without even the implied warranty of 14# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15# GNU General Public License for more details. 16# 17# You should have received a copy of the GNU General Public License 18# along with this program. If not, see <http://www.gnu.org/licenses/>. 19# 20 21# creator 22owner=mreitz@redhat.com 23 24seq=$(basename $0) 25echo "QA output created by $seq" 26 27here=$PWD 28status=1 # failure is the default! 29 30_cleanup() 31{ 32 _cleanup_test_img 33} 34trap "_cleanup; exit \$status" 0 1 2 3 15 35 36# get standard environment and filters 37. ./common.rc 38. ./common.filter 39 40_supported_fmt raw 41_supported_proto file 42_supported_os Linux 43 44# in kB 45CREATION_SIZE=128 46GROWTH_SIZE=256 47 48echo '=== Testing image growth ===' 49 50for create_mode in off falloc full; do 51 for growth_mode in off falloc full; do 52 echo 53 echo "--- create_mode=$create_mode growth_mode=$growth_mode ---" 54 55 IMGOPTS="preallocation=$create_mode" _make_test_img ${CREATION_SIZE}K 56 $QEMU_IMG resize -f "$IMGFMT" --preallocation=$growth_mode "$TEST_IMG" +${GROWTH_SIZE}K 57 58 expected_size=0 59 if [ $create_mode != off ]; then 60 expected_size=$CREATION_SIZE 61 fi 62 if [ $growth_mode != off ]; then 63 expected_size=$((expected_size + $GROWTH_SIZE)) 64 fi 65 66 actual_size=$($QEMU_IMG info -f "$IMGFMT" "$TEST_IMG" | grep 'disk size') 67 actual_size=$(echo "$actual_size" | sed -e 's/^[^0-9]*\([0-9]\+\).*$/\1/') 68 69 # The actual size may exceed the expected size, depending on the file 70 # system. Therefore we just test that the actual size is at least what 71 # we expect. 72 if [ $actual_size -lt $expected_size ]; then 73 echo "ERROR: Image should have at least ${expected_size}K, but has ${actual_size}K" 74 fi 75 done 76done 77 78echo 79echo '=== Testing image shrinking ===' 80 81# None of this should work except for "off", because other modes cannot be used 82# for shrinking 83for growth_mode in falloc full off; do 84 echo 85 echo "--- growth_mode=$growth_mode ---" 86 $QEMU_IMG resize -f "$IMGFMT" --shrink --preallocation=$growth_mode "$TEST_IMG" -${GROWTH_SIZE}K 87done 88 89echo 90echo '=== Testing image growth on 2G empty image ===' 91 92for growth_mode in falloc full; do 93 echo 94 echo "--- growth_mode=$growth_mode ---" 95 96 # Maybe we want to do an lseek() to the end of the file before the 97 # preallocation; if the file has a length of 2 GB, that would 98 # return an integer that overflows to negative when put into a 99 # plain int. We should use the correct type for the result, and 100 # this tests we do. 101 102 _make_test_img 2G 103 $QEMU_IMG resize -f "$IMGFMT" --preallocation=$growth_mode "$TEST_IMG" +${GROWTH_SIZE}K 104 105 actual_size=$($QEMU_IMG info -f "$IMGFMT" "$TEST_IMG" | grep 'disk size') 106 actual_size=$(echo "$actual_size" | sed -e 's/^[^0-9]*\([0-9]\+\).*$/\1/') 107 108 if [ $actual_size -lt $GROWTH_SIZE ]; then 109 echo "ERROR: Image should have at least ${GROWTH_SIZE}K, but has ${actual_size}K" 110 fi 111done 112 113# success, all done 114echo '*** done' 115rm -f $seq.full 116status=0 117