#!/bin/bash # # Test case for write zeroes with unmap # # Copyright (C) 2017 Red Hat, Inc. # # 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=eblake@redhat.com seq="$(basename $0)" echo "QA output created by $seq" here="$PWD" status=1 # failure is the default! _cleanup() { _cleanup_test_img rm -f "$TEST_DIR/blkdebug.conf" } trap "_cleanup; exit \$status" 0 1 2 3 15 # get standard environment, filters and checks . ./common.rc . ./common.filter _supported_fmt qcow2 _supported_proto file _supported_os Linux # v2 images can't mark clusters as zero _unsupported_imgopts compat=0.10 echo echo '=== Testing write zeroes with unmap ===' echo TEST_IMG="$TEST_IMG.base" _make_test_img 64M _make_test_img -b "$TEST_IMG.base" # Offsets chosen at or near 2M boundaries so test works at all cluster sizes # 8k and larger (smaller clusters fail due to non-contiguous allocations) # Aligned writes to unallocated cluster should not allocate mapping, but must # mark cluster as zero, whether or not unmap was requested $QEMU_IO -c "write -z -u 2M 2M" "$TEST_IMG.base" | _filter_qemu_io $QEMU_IO -c "write -z 6M 2M" "$TEST_IMG.base" | _filter_qemu_io $QEMU_IO -c "map" "$TEST_IMG.base" | _filter_qemu_io $QEMU_IMG map --output=json "$TEST_IMG.base" | _filter_qemu_img_map # Unaligned writes need not allocate mapping if the cluster already reads # as zero, but must mark cluster as zero, whether or not unmap was requested $QEMU_IO -c "write -z -u 10485761 2097150" "$TEST_IMG.base" | _filter_qemu_io $QEMU_IO -c "write -z 14680065 2097150" "$TEST_IMG.base" | _filter_qemu_io $QEMU_IO -c "map" "$TEST_IMG.base" | _filter_qemu_io $QEMU_IMG map --output=json "$TEST_IMG.base" | _filter_qemu_img_map # Requesting unmap of normal data must deallocate; omitting unmap should # preserve the mapping $QEMU_IO -c "write 18M 14M" "$TEST_IMG.base" | _filter_qemu_io $QEMU_IO -c "write -z -u 20M 2M" "$TEST_IMG.base" | _filter_qemu_io $QEMU_IO -c "write -z 24M 6M" "$TEST_IMG.base" | _filter_qemu_io $QEMU_IO -c "map" "$TEST_IMG.base" | _filter_qemu_io $QEMU_IMG map --output=json "$TEST_IMG.base" | _filter_qemu_img_map # Likewise when writing on already-mapped zero data $QEMU_IO -c "write -z -u 26M 2M" "$TEST_IMG.base" | _filter_qemu_io $QEMU_IO -c "write -z 28M 2M" "$TEST_IMG.base" | _filter_qemu_io $QEMU_IO -c "map" "$TEST_IMG.base" | _filter_qemu_io $QEMU_IMG map --output=json "$TEST_IMG.base" | _filter_qemu_img_map # Writing on unmapped zeroes does not allocate $QEMU_IO -c "write -z 32M 8M" "$TEST_IMG.base" | _filter_qemu_io $QEMU_IO -c "write -z -u 34M 2M" "$TEST_IMG.base" | _filter_qemu_io $QEMU_IO -c "write -z 36M 2M" "$TEST_IMG.base" | _filter_qemu_io $QEMU_IO -c "map" "$TEST_IMG.base" | _filter_qemu_io $QEMU_IMG map --output=json "$TEST_IMG.base" | _filter_qemu_img_map # Writing zero overrides a backing file, regardless of backing cluster type $QEMU_IO -c "write -z 40M 8M" "$TEST_IMG.base" | _filter_qemu_io $QEMU_IO -c "write 48M 8M" "$TEST_IMG.base" | _filter_qemu_io $QEMU_IO -c "write -z -u 42M 2M" "$TEST_IMG" | _filter_qemu_io $QEMU_IO -c "write -z 44M 2M" "$TEST_IMG" | _filter_qemu_io $QEMU_IO -c "write -z -u 50M 2M" "$TEST_IMG" | _filter_qemu_io $QEMU_IO -c "write -z 52M 2M" "$TEST_IMG" | _filter_qemu_io $QEMU_IO -c "write -z -u 58M 2M" "$TEST_IMG" | _filter_qemu_io $QEMU_IO -c "write -z 60M 2M" "$TEST_IMG" | _filter_qemu_io $QEMU_IO -c "map" "$TEST_IMG" | _filter_qemu_io $QEMU_IMG map --output=json "$TEST_IMG" | _filter_qemu_img_map # Final check that mappings are correct and images are still sane TEST_IMG="$TEST_IMG.base" _check_test_img _check_test_img echo echo '=== Testing cache optimization ===' echo BLKDBG_TEST_IMG="blkdebug:$TEST_DIR/blkdebug.conf:$TEST_IMG.base" cat > "$TEST_DIR/blkdebug.conf" <