qemu/tests/qemu-iotests/028
<<
>>
Prefs
   1#!/usr/bin/env bash
   2# group: rw backing quick
   3#
   4# Test that backing files can be smaller than the image
   5#
   6# Copyright (C) 2010 IBM, Corp.
   7#
   8# Based on 017:
   9# Copyright (C) 2009 Red Hat, Inc.
  10#
  11# This program is free software; you can redistribute it and/or modify
  12# it under the terms of the GNU General Public License as published by
  13# the Free Software Foundation; either version 2 of the License, or
  14# (at your option) any later version.
  15#
  16# This program is distributed in the hope that it will be useful,
  17# but WITHOUT ANY WARRANTY; without even the implied warranty of
  18# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  19# GNU General Public License for more details.
  20#
  21# You should have received a copy of the GNU General Public License
  22# along with this program.  If not, see <http://www.gnu.org/licenses/>.
  23#
  24
  25# creator
  26owner=stefanha@redhat.com
  27
  28seq=`basename $0`
  29echo "QA output created by $seq"
  30
  31status=1        # failure is the default!
  32
  33_cleanup()
  34{
  35    _cleanup_qemu
  36    _rm_test_img "${TEST_IMG}.copy"
  37    _cleanup_test_img
  38}
  39trap "_cleanup; exit \$status" 0 1 2 3 15
  40
  41# get standard environment, filters and checks
  42. ./common.rc
  43. ./common.filter
  44. ./common.pattern
  45. ./common.qemu
  46
  47# Any format supporting backing files except vmdk and qcow which do not support
  48# smaller backing files.
  49_supported_fmt qcow2 qed
  50_supported_proto file fuse
  51_supported_os Linux
  52
  53# Choose a size that is not necessarily a cluster size multiple for image
  54# formats that use clusters.  This will ensure that the base image doesn't end
  55# precisely on a cluster boundary (the easy case).
  56image_size=$(( 4 * 1024 * 1024 * 1024 + 3 * 512 ))
  57
  58# The base image is smaller than the image file
  59base_size=$(( image_size - 1024 * 1024 * 1024 ))
  60
  61offset=$(( base_size - 32 * 1024 ))
  62
  63TEST_IMG_SAVE="$TEST_IMG"
  64TEST_IMG="$TEST_IMG.base"
  65
  66_make_test_img $base_size
  67
  68echo "Filling base image"
  69echo
  70
  71# Fill end of base image with a pattern, skipping every other sector
  72io writev $offset 512 1024 32
  73
  74_check_test_img
  75
  76echo "Creating test image with backing file"
  77echo
  78
  79TEST_IMG="$TEST_IMG_SAVE"
  80_make_test_img -b "$TEST_IMG.base" -F $IMGFMT $image_size
  81
  82echo "Filling test image"
  83echo
  84
  85# Write every other sector around where the base image ends
  86io writev $(( offset + 512 )) 512 1024 64
  87
  88_check_test_img
  89
  90echo "Reading"
  91echo
  92
  93# Base image sectors
  94io readv $(( offset )) 512 1024 32
  95
  96# Image sectors
  97io readv $(( offset + 512 )) 512 1024 64
  98
  99# Zero sectors beyond end of base image
 100io_zero readv $(( offset + 32 * 1024 )) 512 1024 32
 101
 102_check_test_img
 103
 104# Rebase it on top of its base image
 105$QEMU_IMG rebase -b "$TEST_IMG.base" -F $IMGFMT "$TEST_IMG"
 106
 107echo
 108echo block-backup
 109echo
 110
 111qemu_comm_method="monitor"
 112_launch_qemu -drive file="${TEST_IMG}",cache=${CACHEMODE},aio=${AIOMODE},id=disk
 113h=$QEMU_HANDLE
 114if [ "${VALGRIND_QEMU}" == "y" ]; then
 115    QEMU_COMM_TIMEOUT=7
 116else
 117    QEMU_COMM_TIMEOUT=1
 118fi
 119
 120TEST_IMG="$TEST_IMG.copy" _make_test_img $image_size
 121_send_qemu_cmd $h "drive_backup -n disk ${TEST_IMG}.copy" "(qemu)" \
 122    | _filter_imgfmt
 123
 124silent=y qemu_cmd_repeat=20 _send_qemu_cmd $h "info block-jobs" "No active jobs"
 125_send_qemu_cmd $h "info block-jobs" "No active jobs"
 126_send_qemu_cmd $h 'quit' ""
 127
 128# Base image sectors
 129TEST_IMG="${TEST_IMG}.copy" io readv $(( offset )) 512 1024 32
 130
 131# Image sectors
 132TEST_IMG="${TEST_IMG}.copy" io readv $(( offset + 512 )) 512 1024 64
 133
 134# Zero sectors beyond end of base image
 135TEST_IMG="${TEST_IMG}.copy" io_zero readv $(( offset + 32 * 1024 )) 512 1024 32
 136
 137
 138_check_test_img
 139
 140echo
 141echo '=== Reading across backing EOF in one operation ==='
 142echo
 143
 144# Use a cluster boundary as the base end here
 145base_size=$((3 * 1024 * 1024 * 1024))
 146
 147TEST_IMG="$TEST_IMG.base" _make_test_img $base_size
 148_make_test_img -b "$TEST_IMG.base" -F $IMGFMT $image_size
 149
 150# Write 16 times 42 at the end of the base image
 151$QEMU_IO -c "write -P 42 $((base_size - 16)) 16" "$TEST_IMG.base" \
 152    | _filter_qemu_io
 153
 154# Read 32 bytes across the base EOF from the top;
 155# should be 16 times 0x2a, then 16 times 0x00
 156$QEMU_IO -c "read -v $((base_size - 16)) 32" "$TEST_IMG" \
 157    | _filter_qemu_io
 158
 159# success, all done
 160echo "*** done"
 161rm -f $seq.full
 162status=0
 163