xref: /openbmc/qemu/tests/qemu-iotests/106 (revision 438c78da)
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