e3820d5f13
Images repairing in parallels_open() was added, thus parallels tests fail. Access to an image leads to repairing the image. Further image check don't detect any corruption. Remove reads after image creation in test 131. Signed-off-by: Alexander Ivanov <alexander.ivanov@virtuozzo.com> Reviewed-by: Denis V. Lunev <den@openvz.org> Signed-off-by: Denis V. Lunev <den@openvz.org>
114 lines
4.2 KiB
Bash
Executable File
114 lines
4.2 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# group: rw quick
|
|
#
|
|
# parallels format validation tests (created by QEMU)
|
|
#
|
|
# Copyright (C) 2014 Denis V. Lunev <den@openvz.org>
|
|
#
|
|
# 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=den@openvz.org
|
|
|
|
seq=`basename $0`
|
|
echo "QA output created by $seq"
|
|
|
|
status=1 # failure is the default!
|
|
|
|
_cleanup()
|
|
{
|
|
_cleanup_test_img
|
|
}
|
|
trap "_cleanup; exit \$status" 0 1 2 3 15
|
|
|
|
# get standard environment, filters and checks
|
|
. ./common.rc
|
|
. ./common.filter
|
|
|
|
_supported_fmt parallels
|
|
_supported_proto file
|
|
_supported_os Linux
|
|
|
|
inuse_offset=$((0x2c))
|
|
|
|
size=$((64 * 1024 * 1024))
|
|
IMGFMT=parallels
|
|
_make_test_img $size
|
|
|
|
# get cluster size in sectors from "tracks" header field
|
|
CLUSTER_SIZE_OFFSET=28
|
|
CLUSTER_SIZE=$(peek_file_le $TEST_IMG $CLUSTER_SIZE_OFFSET 4)
|
|
CLUSTER_SIZE=$((CLUSTER_SIZE * 512))
|
|
CLUSTER_HALF_SIZE=$((CLUSTER_SIZE / 2))
|
|
CLUSTER_DBL_SIZE=$((CLUSTER_SIZE * 2))
|
|
|
|
echo == read empty image ==
|
|
{ $QEMU_IO -c "read -P 0 $CLUSTER_HALF_SIZE $CLUSTER_SIZE" "$TEST_IMG"; } 2>&1 | _filter_qemu_io | _filter_testdir
|
|
echo == write more than 1 block in a row ==
|
|
{ $QEMU_IO -c "write -P 0x11 $CLUSTER_HALF_SIZE $CLUSTER_DBL_SIZE" "$TEST_IMG"; } 2>&1 | _filter_qemu_io | _filter_testdir
|
|
echo == read less than block ==
|
|
{ $QEMU_IO -c "read -P 0x11 $CLUSTER_HALF_SIZE $CLUSTER_HALF_SIZE" "$TEST_IMG"; } 2>&1 | _filter_qemu_io | _filter_testdir
|
|
echo == read exactly 1 block ==
|
|
{ $QEMU_IO -c "read -P 0x11 $CLUSTER_SIZE $CLUSTER_SIZE" "$TEST_IMG"; } 2>&1 | _filter_qemu_io | _filter_testdir
|
|
echo == read more than 1 block ==
|
|
{ $QEMU_IO -c "read -P 0x11 $CLUSTER_HALF_SIZE $CLUSTER_DBL_SIZE" "$TEST_IMG"; } 2>&1 | _filter_qemu_io | _filter_testdir
|
|
echo == check that there is no trash after written ==
|
|
{ $QEMU_IO -c "read -P 0 $((CLUSTER_HALF_SIZE + CLUSTER_DBL_SIZE)) $CLUSTER_HALF_SIZE" "$TEST_IMG"; } 2>&1 | _filter_qemu_io | _filter_testdir
|
|
echo == check that there is no trash before written ==
|
|
{ $QEMU_IO -c "read -P 0 0 $CLUSTER_HALF_SIZE" "$TEST_IMG"; } 2>&1 | _filter_qemu_io | _filter_testdir
|
|
|
|
echo "== corrupt image =="
|
|
poke_file "$TEST_IMG" "$inuse_offset" "\x59\x6e\x6f\x74"
|
|
echo "== read corrupted image with repairing =="
|
|
{ $QEMU_IO -c "read -P 0x11 $CLUSTER_SIZE $CLUSTER_SIZE" "$TEST_IMG"; } 2>&1 | _filter_qemu_io | _filter_testdir
|
|
|
|
echo "== allocate with backing =="
|
|
# Verify that allocating clusters works fine even when there is a backing image.
|
|
# Regression test for a bug where we would pass a buffer read from the backing
|
|
# node as a QEMUIOVector object, which could cause anything from I/O errors over
|
|
# assertion failures to invalid reads from memory.
|
|
|
|
# Clear image
|
|
_make_test_img $size
|
|
# Create base image
|
|
TEST_IMG="$TEST_IMG.base" _make_test_img $size
|
|
|
|
# Write some data to the base image (which would trigger an assertion failure if
|
|
# interpreted as a QEMUIOVector)
|
|
$QEMU_IO -c "write -P 42 0 $CLUSTER_SIZE" "$TEST_IMG.base" | _filter_qemu_io
|
|
|
|
# Parallels does not seem to support storing a backing filename in the image
|
|
# itself, so we need to build our backing chain on the command line
|
|
imgopts="driver=$IMGFMT,file.driver=$IMGPROTO,file.filename=$TEST_IMG"
|
|
imgopts+=",backing.driver=$IMGFMT"
|
|
imgopts+=",backing.file.driver=$IMGPROTO,backing.file.filename=$TEST_IMG.base"
|
|
|
|
# Cause allocation in the top image
|
|
QEMU_IO_OPTIONS=$QEMU_IO_OPTIONS_NO_FMT \
|
|
$QEMU_IO --image-opts "$imgopts" -c 'write -P 1 0 64' | _filter_qemu_io
|
|
|
|
# Verify
|
|
QEMU_IO_OPTIONS=$QEMU_IO_OPTIONS_NO_FMT \
|
|
$QEMU_IO --image-opts "$imgopts" \
|
|
-c 'read -P 1 0 64' \
|
|
-c "read -P 42 64 $((CLUSTER_SIZE - 64))" \
|
|
-c "read -P 0 $CLUSTER_SIZE $((size - CLUSTER_SIZE))" \
|
|
| _filter_qemu_io
|
|
|
|
# success, all done
|
|
echo "*** done"
|
|
rm -f $seq.full
|
|
status=0
|