#!/usr/bin/env bash # # Test creating raw image preallocation mode # # Copyright (C) 2017 Nir Soffer # # 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=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 \ < "$TEST_DIR/empty" min_blocks=$(stat -c '%b' "$TEST_DIR/empty") echo echo "== creating image with default preallocation ==" _make_test_img $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 $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 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