#!/usr/bin/env bash # # Test creating raw image preallocation mode # # Copyright (C) 2017 Nir Soffer <nirsof@gmail.com> # # 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 <http://www.gnu.org/licenses/>. # # creator owner=nirsof@gmail.com seq=`basename $0` echo "QA output created by $seq" status=1 # failure is the default! _cleanup() { _cleanup_test_img rm -f "$TEST_DIR/empty" } trap "_cleanup; exit \$status" 0 1 2 3 15 # Some file systems sometimes allocate extra blocks independently of # the file size. This function hides the resulting difference in the # stat -c '%b' output. # Parameter 1: Number of blocks an empty file occupies # Parameter 2: Minimal number of blocks in an image # Parameter 3: Image size in bytes _filter_blocks() { extra_blocks=$1 min_blocks=$2 img_size=$3 sed -e "s/blocks=$min_blocks\\(\$\\|[^0-9]\\)/min allocation/" \ -e "s/blocks=$((extra_blocks + img_size / 512))\\(\$\\|[^0-9]\\)/max allocation/" } # Resize image using block_resize. # Parameter 1: image path # Parameter 2: new size _block_resize() { local path=$1 local size=$2 $QEMU -qmp stdio -nographic -nodefaults \ -blockdev file,node-name=file,filename=$path,cache.direct=on \ <<EOF {'execute': 'qmp_capabilities'} {'execute': 'block_resize', 'arguments': {'node-name': 'file', 'size': $size}} {'execute': 'quit'} EOF } # get standard environment, filters and checks . ./common.rc . ./common.filter _supported_fmt raw _supported_proto file _supported_os Linux _default_cache_mode none _supported_cache_modes none directsync size=$((1 * 1024 * 1024)) touch "$TEST_DIR/empty" extra_blocks=$(stat -c '%b' "$TEST_DIR/empty") # We always write the first byte; check how many blocks this filesystem # allocates to match empty image alloation. printf "\0" > "$TEST_DIR/empty" min_blocks=$(stat -c '%b' "$TEST_DIR/empty") echo echo "== creating image with default preallocation ==" _make_test_img -o extent_size_hint=0 $size | _filter_imgfmt stat -c "size=%s, blocks=%b" $TEST_IMG | _filter_blocks $extra_blocks $min_blocks $size for mode in off full falloc; do echo echo "== creating image with preallocation $mode ==" _make_test_img -o preallocation=$mode,extent_size_hint=0 $size | _filter_imgfmt stat -c "size=%s, blocks=%b" $TEST_IMG | _filter_blocks $extra_blocks $min_blocks $size done for new_size in 4096 1048576; do echo echo "== resize empty image with block_resize ==" _make_test_img -o extent_size_hint=0 0 | _filter_imgfmt _block_resize $TEST_IMG $new_size >/dev/null stat -c "size=%s, blocks=%b" $TEST_IMG | _filter_blocks $extra_blocks $min_blocks $new_size done # success, all done echo "*** done" rm -f $seq.full status=0