diff options
Diffstat (limited to 'tests/qemu-iotests/175')
-rwxr-xr-x | tests/qemu-iotests/175 | 114 |
1 files changed, 114 insertions, 0 deletions
diff --git a/tests/qemu-iotests/175 b/tests/qemu-iotests/175 new file mode 100755 index 000000000..f74f053b7 --- /dev/null +++ b/tests/qemu-iotests/175 @@ -0,0 +1,114 @@ +#!/usr/bin/env bash +# group: quick +# +# 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 fuse +_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 +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 + 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 + _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 |