Add zfault zpool configurations and tests
[zfs.git] / scripts / zpool-config / lo-faulty-raid10.sh
1 #!/bin/bash
2 #
3 # 4 loopback devices using the md faulty level for easy
4 # fault injection on top of which is layered raid10 (mirrored).
5 #
6 #     zpool-vdev0    zpool-vdev1    zpool-vdev2    zpool-vdev3
7 #     loop0          loop1          loop2          loop3
8 #     md0 (faulty)   md1 (faulty)   md2 (faulty)   md3 (faulty)
9 #     <--------------------- raid10 zpool --------------------->
10 #
11
12 FILES="/tmp/zpool-vdev0  \
13        /tmp/zpool-vdev1  \
14        /tmp/zpool-vdev2  \
15        /tmp/zpool-vdev3"
16 LODEVICES=""
17 MDDEVICES=""
18 MDDEVICES_M1=""
19 MDDEVICES_M2=""
20
21 zpool_create() {
22         local COUNT=0
23
24         check_loop_utils
25         check_md_utils
26         check_md_partitionable || die "Error non-partitionable md devices"
27
28         for FILE in ${FILES}; do
29                 LODEVICE=`unused_loop_device`
30                 MDDEVICE=`unused_md_device`
31                 let COUNT=${COUNT}+1
32
33                 rm -f ${FILE} || exit 1
34                 dd if=/dev/zero of=${FILE} bs=1M count=0 seek=256 \
35                         &>/dev/null || die "Error $? creating ${FILE}"
36
37                 # Setup the loopback device on the file.
38                 msg "Creating ${LODEVICE} using ${FILE}"
39                 ${LOSETUP} ${LODEVICE} ${FILE} || \
40                         die "Error $? creating ${LODEVICE} using ${FILE}"
41
42                 LODEVICES="${LODEVICES} ${LODEVICE}"
43
44                 # Setup the md device on the loopback device.
45                 msg "Creating ${MDDEVICE} using ${LODEVICE}"
46                 ${MDADM} --build ${MDDEVICE} --level=faulty                  \
47                         --raid-devices=1 ${LODEVICE} &>/dev/null ||          \
48                         (destroy_md_devices "${MDDEVICES}" &&                \
49                         destroy_loop_devices "${LODEVICES}" &&               \
50                         die "Error $? creating ${MDDEVICE} using ${LODEVICE}")
51                 wait_udev ${MDDEVICE} 30 ||                                  \
52                         (destroy_md_devices "${MDDEVICES}" &&                \
53                         destroy_loop_devices "${LODEVICES}" &&               \
54                         die "Error udev never created ${MDDEVICE}")
55
56                 # Create empty GPT/EFI partition table.
57                 ${PARTED} --script ${MDDEVICE} mklabel gpt
58                 MDDEVICES="${MDDEVICES} ${MDDEVICE}"
59                 if [ $((COUNT % 2)) -eq 0 ]; then
60                         MDDEVICES_M2="${MDDEVICES_M2} ${MDDEVICE}"
61                 else
62                         MDDEVICES_M1="${MDDEVICES_M1} ${MDDEVICE}"
63                 fi 
64         done
65
66         msg ${ZPOOL} create ${FORCE_FLAG} ${ZPOOL_NAME}                      \
67                 mirror ${MDDEVICES_M1} mirror ${MDDEVICES_M2}
68         ${ZPOOL} create ${FORCE_FLAG} ${ZPOOL_NAME}                          \
69                 mirror ${MDDEVICES_M1} mirror ${MDDEVICES_M2} ||             \
70                 (destroy_md_devices "${MDDEVICES}" &&                        \
71                 destroy_loop_devices "${LODEVICES}" && exit 1)
72
73         echo "$LODEVICES" >/tmp/zpool-lo.txt
74         echo "$MDDEVICES" >/tmp/zpool-md.txt
75 }
76
77 zpool_destroy() {
78         msg ${ZPOOL} destroy ${ZPOOL_NAME}
79         ${ZPOOL} destroy ${ZPOOL_NAME}
80         destroy_md_devices "`cat /tmp/zpool-md.txt`"
81         destroy_loop_devices "`cat /tmp/zpool-lo.txt`"
82
83         rm -f /tmp/zpool-md.txt /tmp/zpool-lo.txt
84 }