]> git.proxmox.com Git - mirror_zfs-debian.git/blob - debian/tests/kernel-smoke-test-scrub
Add isolation-machine restriction to autopkgtest.
[mirror_zfs-debian.git] / debian / tests / kernel-smoke-test-scrub
1 #!/bin/sh
2 #
3 # Copyright (C) 2016 Canonical
4 #
5 # This program is free software; you can redistribute it and/or
6 # modify it under the terms of the GNU General Public License
7 # as published by the Free Software Foundation; either version 2
8 # of the License, or (at your option) any later version.
9 #
10 # This program is distributed in the hope that it will be useful,
11 # but WITHOUT ANY WARRANTY; without even the implied warranty of
12 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 # GNU General Public License for more details.
14 #
15 # You should have received a copy of the GNU General Public License
16 # along with this program; if not, write to the Free Software
17 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
18 #
19 echo -n "kernel smoke test, corrupt data and clean with a scrub: "
20 TMP=/tmp
21 VDEV0=${TMP}/pool0-$$.img
22 VDEV1=${TMP}/pool1-$$.img
23 VDEV2=${TMP}/pool2-$$.img
24 VDEV3=${TMP}/pool3-$$.img
25 VDEV_SZ=128
26 POOL=pool-smoke-$$
27 DATA=/${POOL}/random.dat
28 ZFSFS="test tmp example data1 data2 data3"
29
30 dd if=/dev/zero of=${VDEV0} bs=1M count=${VDEV_SZ} > /dev/null 2>&1
31 dd if=/dev/zero of=${VDEV1} bs=1M count=${VDEV_SZ} > /dev/null 2>&1
32 dd if=/dev/zero of=${VDEV2} bs=1M count=${VDEV_SZ} > /dev/null 2>&1
33 dd if=/dev/zero of=${VDEV3} bs=1M count=${VDEV_SZ} > /dev/null 2>&1
34
35 zpool create ${POOL} mirror ${VDEV0} ${VDEV1} mirror ${VDEV2} ${VDEV3}
36 ret=$?
37 if [ $ret -ne 0 ]; then
38 echo "FAILED: zpool create failed, exit code=$ret"
39 rm ${VDEV0} ${VDEV1} ${VDEV2} ${VDEV3}
40 exit 1
41 fi
42
43 #
44 # Create a file
45 #
46 dd if=/dev/urandom of=$DATA bs=1M count=64 > /dev/null 2>&1
47 sum1=$(md5sum ${DATA} | awk '{print $1}')
48
49 #
50 # Corrupt VDEV0
51 #
52 dd if=/dev/zero of=${VDEV0} bs=1M count=${VDEV_SZ} > /dev/null 2>&1
53 sync
54
55 #
56 # Offline "corrupted" VDEV
57 #
58 zpool detach ${POOL} ${VDEV0}
59 ret=$?
60 if [ $ret -ne 0 ]; then
61 echo "FAILED: zpool detach failed, exit code=$ret"
62 zpool destroy ${POOL}
63 rm ${VDEV0} ${VDEV1} ${VDEV2} ${VDEV3}
64 exit 1
65 fi
66
67 #
68 # Zero corrupted VDEV and re-attach
69 #
70 dd if=/dev/zero of=${VDEV0} bs=1M count=${VDEV_SZ} > /dev/null 2>&1
71 zpool attach ${POOL} ${VDEV1} ${VDEV0} -f
72 ret=$?
73 if [ $ret -ne 0 ]; then
74 echo "FAILED: zpool attach failed, exit code=$ret"
75 zpool destroy ${POOL}
76 rm ${VDEV0} ${VDEV1} ${VDEV2} ${VDEV3}
77 exit 1
78 fi
79
80 zpool scrub ${POOL}
81 ret=$?
82 if [ $ret -ne 0 ]; then
83 echo "FAILED: zpool scrub failed, exit code=$ret"
84 zpool destroy ${POOL}
85 rm ${VDEV0} ${VDEV1} ${VDEV2} ${VDEV3}
86 exit 1
87 fi
88
89 sum2=$(md5sum ${DATA} | awk '{print $1}')
90 #
91 # Checksums must agree
92 #
93 if [ x"$sum1" != x"$sum2" ]; then
94 echo "FAILED: corrupted data on scrubbed pool"
95 zpool destroy ${POOL}
96 rm ${VDEV0} ${VDEV1} ${VDEV2} ${VDEV3}
97 exit 1
98 fi
99
100 zpool destroy ${POOL}
101 ret=$?
102 if [ $ret -ne 0 ]; then
103 echo "FAILED: zpool destroy failed, exit code=$ret"
104 #
105 # destroy failed, try to clean up, but this
106 # wil probably fail
107 #
108 rm ${VDEV0} ${VDEV1} ${VDEV2} ${VDEV3}
109 exit 1
110 fi
111
112 rm ${VDEV0} ${VDEV1} ${VDEV2} ${VDEV3}
113 echo "PASSED"
114 exit 0