097 (4693B)
1 #!/usr/bin/env bash 2 # group: rw auto backing 3 # 4 # Commit changes into backing chains and empty the top image if the 5 # backing image is not explicitly specified 6 # 7 # Copyright (C) 2014 Red Hat, Inc. 8 # 9 # This program is free software; you can redistribute it and/or modify 10 # it under the terms of the GNU General Public License as published by 11 # the Free Software Foundation; either version 2 of the License, or 12 # (at your option) any later version. 13 # 14 # This program is distributed in the hope that it will be useful, 15 # but WITHOUT ANY WARRANTY; without even the implied warranty of 16 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 17 # GNU General Public License for more details. 18 # 19 # You should have received a copy of the GNU General Public License 20 # along with this program. If not, see <http://www.gnu.org/licenses/>. 21 # 22 23 # creator 24 owner=hreitz@redhat.com 25 26 seq="$(basename $0)" 27 echo "QA output created by $seq" 28 29 status=1 # failure is the default! 30 31 _cleanup() 32 { 33 _cleanup_test_img 34 _rm_test_img "$TEST_IMG.itmd" 35 } 36 trap "_cleanup; exit \$status" 0 1 2 3 15 37 38 # get standard environment, filters and checks 39 . ./common.rc 40 . ./common.filter 41 . ./common.pattern 42 43 # Any format supporting backing files and bdrv_make_empty 44 _supported_fmt qcow qcow2 45 _supported_proto file fuse 46 _supported_os Linux 47 48 49 # Four main passes: 50 # 0: Two-layer backing chain, commit to upper backing file (implicitly) 51 # (in this case, the top image will be emptied) 52 # 1: Two-layer backing chain, commit to upper backing file (explicitly) 53 # (in this case, the top image will implicitly stay unchanged) 54 # 2: Two-layer backing chain, commit to upper backing file (implicitly with -d) 55 # (in this case, the top image will explicitly stay unchanged) 56 # 3: Two-layer backing chain, commit to lower backing file 57 # (in this case, the top image will implicitly stay unchanged) 58 # 59 # 020 already tests committing, so this only tests whether image chains are 60 # working properly and that all images above the base are emptied; therefore, 61 # no complicated patterns are necessary. Check near the 2G mark, as qcow2 62 # has been buggy at that boundary in the past. 63 for i in 0 1 2 3; do 64 65 echo 66 echo "=== Test pass $i ===" 67 echo 68 69 len=$((2100 * 1024 * 1024 + 512)) # larger than 2G, and not cluster aligned 70 TEST_IMG="$TEST_IMG.base" _make_test_img $len 71 TEST_IMG="$TEST_IMG.itmd" _make_test_img -b "$TEST_IMG.base" -F $IMGFMT $len 72 _make_test_img -b "$TEST_IMG.itmd" -F $IMGFMT $len 73 74 $QEMU_IO -c "write -P 1 0x7ffd0000 192k" "$TEST_IMG.base" | _filter_qemu_io 75 $QEMU_IO -c "write -P 2 0x7ffe0000 128k" "$TEST_IMG.itmd" | _filter_qemu_io 76 $QEMU_IO -c "write -P 3 0x7fff0000 64k" "$TEST_IMG" | _filter_qemu_io 77 $QEMU_IO -c "write -P 4 $(($len - 512)) 512" "$TEST_IMG" | _filter_qemu_io 78 79 if [ $i -lt 3 ]; then 80 if [ $i == 0 ]; then 81 # -b "$TEST_IMG.itmd" should be the default (that is, committing to the 82 # first backing file in the chain) 83 $QEMU_IMG commit "$TEST_IMG" 84 elif [ $i == 1 ]; then 85 # explicitly specify the commit target (this should imply -d) 86 $QEMU_IMG commit -b "$TEST_IMG.itmd" "$TEST_IMG" 87 else 88 # do not explicitly specify the commit target, but use -d to leave the 89 # top image unchanged 90 $QEMU_IMG commit -d "$TEST_IMG" 91 fi 92 93 # Bottom should be unchanged 94 $QEMU_IO -c 'read -P 1 0x7ffd0000 192k' "$TEST_IMG.base" | _filter_qemu_io 95 $QEMU_IO -c "read -P 0 $((len - 512)) 512" "$TEST_IMG.base" | _filter_qemu_io 96 97 # Intermediate should contain changes from top 98 $QEMU_IO -c 'read -P 1 0x7ffd0000 64k' "$TEST_IMG.itmd" | _filter_qemu_io 99 $QEMU_IO -c 'read -P 2 0x7ffe0000 64k' "$TEST_IMG.itmd" | _filter_qemu_io 100 $QEMU_IO -c 'read -P 3 0x7fff0000 64k' "$TEST_IMG.itmd" | _filter_qemu_io 101 $QEMU_IO -c "read -P 4 $((len - 512)) 512" "$TEST_IMG.itmd" | _filter_qemu_io 102 103 # And in pass 0, the top image should be empty, whereas in both other passes 104 # it should be unchanged (which is both checked by qemu-img map) 105 else 106 $QEMU_IMG commit -b "$TEST_IMG.base" "$TEST_IMG" 107 108 # Bottom should contain all changes 109 $QEMU_IO -c 'read -P 1 0x7ffd0000 64k' "$TEST_IMG.base" | _filter_qemu_io 110 $QEMU_IO -c 'read -P 2 0x7ffe0000 64k' "$TEST_IMG.base" | _filter_qemu_io 111 $QEMU_IO -c 'read -P 3 0x7fff0000 64k' "$TEST_IMG.base" | _filter_qemu_io 112 $QEMU_IO -c "read -P 4 $((len - 512)) 512" "$TEST_IMG.base" | _filter_qemu_io 113 114 # Both top and intermediate should be unchanged 115 fi 116 117 $QEMU_IMG map "$TEST_IMG.base" | _filter_qemu_img_map 118 $QEMU_IMG map "$TEST_IMG.itmd" | _filter_qemu_img_map 119 $QEMU_IMG map "$TEST_IMG" | _filter_qemu_img_map 120 121 done 122 123 124 # success, all done 125 echo "*** done" 126 rm -f $seq.full 127 status=0