039 (4651B)
1 #!/usr/bin/env bash 2 # group: rw auto quick 3 # 4 # Test qcow2 lazy refcounts 5 # 6 # Copyright (C) 2012 Red Hat, Inc. 7 # Copyright IBM, Corp. 2010 8 # 9 # Based on test 038. 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 26 owner=stefanha@redhat.com 27 28 seq=`basename $0` 29 echo "QA output created by $seq" 30 31 status=1 # failure is the default! 32 33 _cleanup() 34 { 35 _cleanup_test_img 36 } 37 trap "_cleanup; exit \$status" 0 1 2 3 15 38 39 # get standard environment, filters and checks 40 . ./common.rc 41 . ./common.filter 42 43 _supported_fmt qcow2 44 _supported_proto file fuse 45 _supported_os Linux 46 _default_cache_mode writethrough 47 _supported_cache_modes writethrough 48 # Some of these test cases expect no external data file so that all 49 # clusters are part of the qcow2 image and refcounted 50 _unsupported_imgopts data_file 51 52 size=128M 53 54 echo 55 echo "== Checking that image is clean on shutdown ==" 56 57 _make_test_img -o "compat=1.1,lazy_refcounts=on" $size 58 59 $QEMU_IO -c "write -P 0x5a 0 512" "$TEST_IMG" | _filter_qemu_io 60 61 # The dirty bit must not be set 62 _qcow2_dump_header | grep incompatible_features 63 _check_test_img 64 65 echo 66 echo "== Creating a dirty image file ==" 67 68 _make_test_img -o "compat=1.1,lazy_refcounts=on" $size 69 70 _NO_VALGRIND \ 71 $QEMU_IO -c "write -P 0x5a 0 512" \ 72 -c "sigraise $(kill -l KILL)" "$TEST_IMG" 2>&1 \ 73 | _filter_qemu_io 74 75 # The dirty bit must be set 76 _qcow2_dump_header | grep incompatible_features 77 _check_test_img 78 79 echo 80 echo "== Read-only access must still work ==" 81 82 $QEMU_IO -r -c "read -P 0x5a 0 512" "$TEST_IMG" | _filter_qemu_io 83 84 # The dirty bit must be set 85 _qcow2_dump_header | grep incompatible_features 86 87 echo 88 echo "== Repairing the image file must succeed ==" 89 90 _check_test_img -r all 91 92 # The dirty bit must not be set 93 _qcow2_dump_header | grep incompatible_features 94 95 echo 96 echo "== Data should still be accessible after repair ==" 97 98 $QEMU_IO -c "read -P 0x5a 0 512" "$TEST_IMG" | _filter_qemu_io 99 100 echo 101 echo "== Opening a dirty image read/write should repair it ==" 102 103 _make_test_img -o "compat=1.1,lazy_refcounts=on" $size 104 105 _NO_VALGRIND \ 106 $QEMU_IO -c "write -P 0x5a 0 512" \ 107 -c "sigraise $(kill -l KILL)" "$TEST_IMG" 2>&1 \ 108 | _filter_qemu_io 109 110 # The dirty bit must be set 111 _qcow2_dump_header | grep incompatible_features 112 113 $QEMU_IO -c "write 0 512" "$TEST_IMG" | _filter_qemu_io 114 115 # The dirty bit must not be set 116 _qcow2_dump_header | grep incompatible_features 117 118 echo 119 echo "== Creating an image file with lazy_refcounts=off ==" 120 121 _make_test_img -o "compat=1.1,lazy_refcounts=off" $size 122 123 _NO_VALGRIND \ 124 $QEMU_IO -c "write -P 0x5a 0 512" \ 125 -c "sigraise $(kill -l KILL)" "$TEST_IMG" 2>&1 \ 126 | _filter_qemu_io 127 128 # The dirty bit must not be set since lazy_refcounts=off 129 _qcow2_dump_header | grep incompatible_features 130 _check_test_img 131 132 echo 133 echo "== Committing to a backing file with lazy_refcounts=on ==" 134 135 TEST_IMG="$TEST_IMG".base _make_test_img -o "compat=1.1,lazy_refcounts=on" $size 136 137 _make_test_img -o "compat=1.1,lazy_refcounts=on,backing_file=$TEST_IMG.base" \ 138 -F $IMGFMT $size 139 140 $QEMU_IO -c "write 0 512" "$TEST_IMG" | _filter_qemu_io 141 $QEMU_IMG commit "$TEST_IMG" 142 143 # The dirty bit must not be set 144 _qcow2_dump_header | grep incompatible_features 145 _qcow2_dump_header "$TEST_IMG".base | grep incompatible_features 146 147 _check_test_img 148 TEST_IMG="$TEST_IMG".base _check_test_img 149 150 echo 151 echo "== Changing lazy_refcounts setting at runtime ==" 152 153 _make_test_img -o "compat=1.1,lazy_refcounts=off" $size 154 155 _NO_VALGRIND \ 156 $QEMU_IO -c "reopen -o lazy-refcounts=on" \ 157 -c "write -P 0x5a 0 512" \ 158 -c "sigraise $(kill -l KILL)" "$TEST_IMG" 2>&1 \ 159 | _filter_qemu_io 160 161 # The dirty bit must be set 162 _qcow2_dump_header | grep incompatible_features 163 _check_test_img 164 165 _make_test_img -o "compat=1.1,lazy_refcounts=on" $size 166 167 _NO_VALGRIND \ 168 $QEMU_IO -c "reopen -o lazy-refcounts=off" \ 169 -c "write -P 0x5a 0 512" \ 170 -c "sigraise $(kill -l KILL)" "$TEST_IMG" 2>&1 \ 171 | _filter_qemu_io 172 173 # The dirty bit must not be set 174 _qcow2_dump_header | grep incompatible_features 175 _check_test_img 176 177 178 # success, all done 179 echo "*** done" 180 rm -f $seq.full 181 status=0 182