]>
Commit | Line | Data |
---|---|---|
11a82d14 | 1 | #!/usr/bin/env bash |
9dd003a9 | 2 | # group: rw quick |
ca9c4e06 DL |
3 | # |
4 | # parallels format validation tests (created by QEMU) | |
5 | # | |
6 | # Copyright (C) 2014 Denis V. Lunev <den@openvz.org> | |
7 | # | |
8 | # This program is free software; you can redistribute it and/or modify | |
9 | # it under the terms of the GNU General Public License as published by | |
10 | # the Free Software Foundation; either version 2 of the License, or | |
11 | # (at your option) any later version. | |
12 | # | |
13 | # This program is distributed in the hope that it will be useful, | |
14 | # but WITHOUT ANY WARRANTY; without even the implied warranty of | |
15 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
16 | # GNU General Public License for more details. | |
17 | # | |
18 | # You should have received a copy of the GNU General Public License | |
19 | # along with this program. If not, see <http://www.gnu.org/licenses/>. | |
20 | # | |
21 | ||
22 | # creator | |
23 | owner=den@openvz.org | |
24 | ||
25 | seq=`basename $0` | |
26 | echo "QA output created by $seq" | |
27 | ||
ca9c4e06 DL |
28 | status=1 # failure is the default! |
29 | ||
30 | _cleanup() | |
31 | { | |
32 | _cleanup_test_img | |
33 | } | |
34 | trap "_cleanup; exit \$status" 0 1 2 3 15 | |
35 | ||
36 | # get standard environment, filters and checks | |
37 | . ./common.rc | |
38 | . ./common.filter | |
39 | ||
40 | _supported_fmt parallels | |
41 | _supported_proto file | |
42 | _supported_os Linux | |
43 | ||
a6be831e DL |
44 | inuse_offset=$((0x2c)) |
45 | ||
0c2cb382 | 46 | size=$((64 * 1024 * 1024)) |
ca9c4e06 DL |
47 | IMGFMT=parallels |
48 | _make_test_img $size | |
49 | ||
8e10861b AI |
50 | # get cluster size in sectors from "tracks" header field |
51 | CLUSTER_SIZE_OFFSET=28 | |
52 | CLUSTER_SIZE=$(peek_file_le $TEST_IMG $CLUSTER_SIZE_OFFSET 4) | |
53 | CLUSTER_SIZE=$((CLUSTER_SIZE * 512)) | |
dbfc5560 AI |
54 | CLUSTER_HALF_SIZE=$((CLUSTER_SIZE / 2)) |
55 | CLUSTER_DBL_SIZE=$((CLUSTER_SIZE * 2)) | |
56 | ||
ca9c4e06 | 57 | echo == read empty image == |
dbfc5560 | 58 | { $QEMU_IO -c "read -P 0 $CLUSTER_HALF_SIZE $CLUSTER_SIZE" "$TEST_IMG"; } 2>&1 | _filter_qemu_io | _filter_testdir |
ca9c4e06 | 59 | echo == write more than 1 block in a row == |
dbfc5560 | 60 | { $QEMU_IO -c "write -P 0x11 $CLUSTER_HALF_SIZE $CLUSTER_DBL_SIZE" "$TEST_IMG"; } 2>&1 | _filter_qemu_io | _filter_testdir |
ca9c4e06 | 61 | echo == read less than block == |
dbfc5560 | 62 | { $QEMU_IO -c "read -P 0x11 $CLUSTER_HALF_SIZE $CLUSTER_HALF_SIZE" "$TEST_IMG"; } 2>&1 | _filter_qemu_io | _filter_testdir |
ca9c4e06 | 63 | echo == read exactly 1 block == |
dbfc5560 | 64 | { $QEMU_IO -c "read -P 0x11 $CLUSTER_SIZE $CLUSTER_SIZE" "$TEST_IMG"; } 2>&1 | _filter_qemu_io | _filter_testdir |
ca9c4e06 | 65 | echo == read more than 1 block == |
dbfc5560 | 66 | { $QEMU_IO -c "read -P 0x11 $CLUSTER_HALF_SIZE $CLUSTER_DBL_SIZE" "$TEST_IMG"; } 2>&1 | _filter_qemu_io | _filter_testdir |
ca9c4e06 | 67 | echo == check that there is no trash after written == |
dbfc5560 | 68 | { $QEMU_IO -c "read -P 0 $((CLUSTER_HALF_SIZE + CLUSTER_DBL_SIZE)) $CLUSTER_HALF_SIZE" "$TEST_IMG"; } 2>&1 | _filter_qemu_io | _filter_testdir |
ca9c4e06 | 69 | echo == check that there is no trash before written == |
dbfc5560 | 70 | { $QEMU_IO -c "read -P 0 0 $CLUSTER_HALF_SIZE" "$TEST_IMG"; } 2>&1 | _filter_qemu_io | _filter_testdir |
ca9c4e06 | 71 | |
e3820d5f | 72 | echo "== corrupt image ==" |
a6be831e | 73 | poke_file "$TEST_IMG" "$inuse_offset" "\x59\x6e\x6f\x74" |
e3820d5f | 74 | echo "== read corrupted image with repairing ==" |
dbfc5560 | 75 | { $QEMU_IO -c "read -P 0x11 $CLUSTER_SIZE $CLUSTER_SIZE" "$TEST_IMG"; } 2>&1 | _filter_qemu_io | _filter_testdir |
a6be831e | 76 | |
4248e34b DL |
77 | echo "== check discard ==" |
78 | ||
79 | # Clear image | |
80 | _make_test_img $size | |
81 | ||
82 | { $QEMU_IO -c "write -P 0x11 0 $CLUSTER_DBL_SIZE" "$TEST_IMG"; } 2>&1 | _filter_qemu_io | _filter_testdir | |
83 | { $QEMU_IMG map "$TEST_IMG"; } 2>&1 | _filter_qemu_img_map | |
84 | { $QEMU_IO -c "discard 0 $CLUSTER_SIZE" "$TEST_IMG"; } 2>&1 | _filter_qemu_io | _filter_testdir | |
85 | { $QEMU_IMG map "$TEST_IMG"; } 2>&1 | _filter_qemu_img_map | |
86 | { $QEMU_IO -c "read -P 0 0 $CLUSTER_SIZE" "$TEST_IMG"; } 2>&1 | _filter_qemu_io | _filter_testdir | |
87 | ||
88 | echo "== check simple allocation over the discarded hole ==" | |
89 | ||
90 | { $QEMU_IO -c "write -P 0x11 $CLUSTER_DBL_SIZE $CLUSTER_SIZE" "$TEST_IMG"; } 2>&1 | _filter_qemu_io | _filter_testdir | |
91 | { $QEMU_IMG map "$TEST_IMG"; } 2>&1 | _filter_qemu_img_map | |
92 | { $QEMU_IO -c "read -P 0x11 $CLUSTER_DBL_SIZE $CLUSTER_SIZE" "$TEST_IMG"; } 2>&1 | _filter_qemu_io | _filter_testdir | |
93 | ||
94 | echo "== check more complex allocation over the discard hole ==" | |
95 | ||
96 | # Clear image | |
97 | _make_test_img $size | |
98 | ||
99 | { $QEMU_IO -c "write -P 0x11 $CLUSTER_DBL_SIZE $CLUSTER_DBL_SIZE" "$TEST_IMG"; } 2>&1 | _filter_qemu_io | _filter_testdir | |
100 | { $QEMU_IO -c "discard $CLUSTER_DBL_SIZE $CLUSTER_SIZE" "$TEST_IMG"; } 2>&1 | _filter_qemu_io | _filter_testdir | |
101 | # There is 1 cluster hole. Fill it fully and allocate 1 cluster at the end | |
102 | { $QEMU_IO -c "write -P 0x12 $CLUSTER_HALF_SIZE $CLUSTER_SIZE" "$TEST_IMG"; } 2>&1 | _filter_qemu_io | _filter_testdir | |
103 | { $QEMU_IMG map "$TEST_IMG"; } 2>&1 | _filter_qemu_img_map | |
104 | { $QEMU_IO -c "read -P 0x12 $CLUSTER_HALF_SIZE $CLUSTER_SIZE" "$TEST_IMG"; } 2>&1 | _filter_qemu_io | _filter_testdir | |
105 | { $QEMU_IO -c "read -P 0 0 $CLUSTER_HALF_SIZE" "$TEST_IMG"; } 2>&1 | _filter_qemu_io | _filter_testdir | |
106 | { $QEMU_IO -c "read -P 0 $((CLUSTER_SIZE + CLUSTER_HALF_SIZE)) $CLUSTER_HALF_SIZE" "$TEST_IMG"; } 2>&1 | _filter_qemu_io | _filter_testdir | |
107 | ||
1dba99e3 DL |
108 | echo "== check write-zeroes ==" |
109 | ||
110 | # Clear image | |
111 | _make_test_img $size | |
112 | ||
113 | { $QEMU_IO -c "write -P 0x11 0 $CLUSTER_DBL_SIZE" "$TEST_IMG"; } 2>&1 | _filter_qemu_io | _filter_testdir | |
114 | { $QEMU_IO -c "write -z 0 $CLUSTER_SIZE" "$TEST_IMG"; } 2>&1 | _filter_qemu_io | _filter_testdir | |
115 | { $QEMU_IMG map "$TEST_IMG"; } 2>&1 | _filter_qemu_img_map | |
116 | { $QEMU_IO -c "read -P 0 0 $CLUSTER_SIZE" "$TEST_IMG"; } 2>&1 | _filter_qemu_io | _filter_testdir | |
117 | { $QEMU_IO -c "read -P 0x11 $CLUSTER_SIZE $CLUSTER_SIZE" "$TEST_IMG"; } 2>&1 | _filter_qemu_io | _filter_testdir | |
118 | ||
119 | echo "== check cluster-partial write-zeroes ==" | |
120 | ||
121 | # Clear image | |
122 | _make_test_img $size | |
123 | ||
124 | { $QEMU_IO -c "write -P 0x11 0 $CLUSTER_SIZE" "$TEST_IMG"; } 2>&1 | _filter_qemu_io | _filter_testdir | |
125 | { $QEMU_IO -c "write -z 0 $CLUSTER_HALF_SIZE" "$TEST_IMG"; } 2>&1 | _filter_qemu_io | _filter_testdir | |
126 | { $QEMU_IO -c "read -P 0 0 $CLUSTER_HALF_SIZE" "$TEST_IMG"; } 2>&1 | _filter_qemu_io | _filter_testdir | |
127 | { $QEMU_IO -c "read -P 0x11 $CLUSTER_HALF_SIZE $CLUSTER_HALF_SIZE" "$TEST_IMG"; } 2>&1 | _filter_qemu_io | _filter_testdir | |
128 | ||
0c2cb382 HR |
129 | echo "== allocate with backing ==" |
130 | # Verify that allocating clusters works fine even when there is a backing image. | |
131 | # Regression test for a bug where we would pass a buffer read from the backing | |
132 | # node as a QEMUIOVector object, which could cause anything from I/O errors over | |
133 | # assertion failures to invalid reads from memory. | |
134 | ||
135 | # Clear image | |
136 | _make_test_img $size | |
137 | # Create base image | |
138 | TEST_IMG="$TEST_IMG.base" _make_test_img $size | |
139 | ||
140 | # Write some data to the base image (which would trigger an assertion failure if | |
141 | # interpreted as a QEMUIOVector) | |
dbfc5560 | 142 | $QEMU_IO -c "write -P 42 0 $CLUSTER_SIZE" "$TEST_IMG.base" | _filter_qemu_io |
0c2cb382 HR |
143 | |
144 | # Parallels does not seem to support storing a backing filename in the image | |
145 | # itself, so we need to build our backing chain on the command line | |
146 | imgopts="driver=$IMGFMT,file.driver=$IMGPROTO,file.filename=$TEST_IMG" | |
147 | imgopts+=",backing.driver=$IMGFMT" | |
148 | imgopts+=",backing.file.driver=$IMGPROTO,backing.file.filename=$TEST_IMG.base" | |
149 | ||
150 | # Cause allocation in the top image | |
151 | QEMU_IO_OPTIONS=$QEMU_IO_OPTIONS_NO_FMT \ | |
152 | $QEMU_IO --image-opts "$imgopts" -c 'write -P 1 0 64' | _filter_qemu_io | |
153 | ||
154 | # Verify | |
155 | QEMU_IO_OPTIONS=$QEMU_IO_OPTIONS_NO_FMT \ | |
156 | $QEMU_IO --image-opts "$imgopts" \ | |
157 | -c 'read -P 1 0 64' \ | |
dbfc5560 AI |
158 | -c "read -P 42 64 $((CLUSTER_SIZE - 64))" \ |
159 | -c "read -P 0 $CLUSTER_SIZE $((size - CLUSTER_SIZE))" \ | |
0c2cb382 HR |
160 | | _filter_qemu_io |
161 | ||
ca9c4e06 DL |
162 | # success, all done |
163 | echo "*** done" | |
164 | rm -f $seq.full | |
165 | status=0 |