Add zfault zpool configurations and tests
[zfs.git] / scripts / zpool-config / lo-faulty-raid10.sh
diff --git a/scripts/zpool-config/lo-faulty-raid10.sh b/scripts/zpool-config/lo-faulty-raid10.sh
new file mode 100644 (file)
index 0000000..ef81abb
--- /dev/null
@@ -0,0 +1,84 @@
+#!/bin/bash
+#
+# 4 loopback devices using the md faulty level for easy
+# fault injection on top of which is layered raid10 (mirrored).
+#
+#     zpool-vdev0    zpool-vdev1    zpool-vdev2    zpool-vdev3
+#     loop0          loop1          loop2          loop3
+#     md0 (faulty)   md1 (faulty)   md2 (faulty)   md3 (faulty)
+#     <--------------------- raid10 zpool --------------------->
+#
+
+FILES="/tmp/zpool-vdev0  \
+       /tmp/zpool-vdev1  \
+       /tmp/zpool-vdev2  \
+       /tmp/zpool-vdev3"
+LODEVICES=""
+MDDEVICES=""
+MDDEVICES_M1=""
+MDDEVICES_M2=""
+
+zpool_create() {
+       local COUNT=0
+
+       check_loop_utils
+       check_md_utils
+       check_md_partitionable || die "Error non-partitionable md devices"
+
+       for FILE in ${FILES}; do
+               LODEVICE=`unused_loop_device`
+               MDDEVICE=`unused_md_device`
+               let COUNT=${COUNT}+1
+
+               rm -f ${FILE} || exit 1
+               dd if=/dev/zero of=${FILE} bs=1M count=0 seek=256 \
+                       &>/dev/null || die "Error $? creating ${FILE}"
+
+               # Setup the loopback device on the file.
+               msg "Creating ${LODEVICE} using ${FILE}"
+               ${LOSETUP} ${LODEVICE} ${FILE} || \
+                       die "Error $? creating ${LODEVICE} using ${FILE}"
+
+               LODEVICES="${LODEVICES} ${LODEVICE}"
+
+               # Setup the md device on the loopback device.
+               msg "Creating ${MDDEVICE} using ${LODEVICE}"
+               ${MDADM} --build ${MDDEVICE} --level=faulty                  \
+                       --raid-devices=1 ${LODEVICE} &>/dev/null ||          \
+                       (destroy_md_devices "${MDDEVICES}" &&                \
+                       destroy_loop_devices "${LODEVICES}" &&               \
+                       die "Error $? creating ${MDDEVICE} using ${LODEVICE}")
+               wait_udev ${MDDEVICE} 30 ||                                  \
+                       (destroy_md_devices "${MDDEVICES}" &&                \
+                       destroy_loop_devices "${LODEVICES}" &&               \
+                       die "Error udev never created ${MDDEVICE}")
+
+               # Create empty GPT/EFI partition table.
+               ${PARTED} --script ${MDDEVICE} mklabel gpt
+               MDDEVICES="${MDDEVICES} ${MDDEVICE}"
+               if [ $((COUNT % 2)) -eq 0 ]; then
+                       MDDEVICES_M2="${MDDEVICES_M2} ${MDDEVICE}"
+               else
+                       MDDEVICES_M1="${MDDEVICES_M1} ${MDDEVICE}"
+               fi 
+       done
+
+       msg ${ZPOOL} create ${FORCE_FLAG} ${ZPOOL_NAME}                      \
+               mirror ${MDDEVICES_M1} mirror ${MDDEVICES_M2}
+       ${ZPOOL} create ${FORCE_FLAG} ${ZPOOL_NAME}                          \
+               mirror ${MDDEVICES_M1} mirror ${MDDEVICES_M2} ||             \
+               (destroy_md_devices "${MDDEVICES}" &&                        \
+               destroy_loop_devices "${LODEVICES}" && exit 1)
+
+       echo "$LODEVICES" >/tmp/zpool-lo.txt
+       echo "$MDDEVICES" >/tmp/zpool-md.txt
+}
+
+zpool_destroy() {
+       msg ${ZPOOL} destroy ${ZPOOL_NAME}
+       ${ZPOOL} destroy ${ZPOOL_NAME}
+       destroy_md_devices "`cat /tmp/zpool-md.txt`"
+       destroy_loop_devices "`cat /tmp/zpool-lo.txt`"
+
+       rm -f /tmp/zpool-md.txt /tmp/zpool-lo.txt
+}