Add zfault zpool configurations and tests
[zfs.git] / scripts / zpool-config / scsi_debug-raidz3.sh
diff --git a/scripts/zpool-config/scsi_debug-raidz3.sh b/scripts/zpool-config/scsi_debug-raidz3.sh
new file mode 100644 (file)
index 0000000..34654b5
--- /dev/null
@@ -0,0 +1,79 @@
+#!/bin/bash
+#
+# 1 scsi_debug device for fault injection and 3 loopback devices
+# on top of which is layered raidz3.
+#
+
+SDSIZE=${SDSIZE:-256}
+SDHOSTS=${SDHOSTS:-1}
+SDTGTS=${SDTGTS:-1}
+SDLUNS=${SDLUNS:-1}
+LDMOD=/sbin/modprobe
+FILES="/tmp/zpool-vdev0  \
+       /tmp/zpool-vdev1  \
+       /tmp/zpool-vdev2"
+DEVICES=""
+
+zpool_create() {
+       check_loop_utils
+       check_sd_utils
+
+       test `${LSMOD} | grep -c scsi_debug` -gt 0 &&                        \
+               (echo 0 >/sys/module/scsi_debug/parameters/every_nth &&      \
+               ${RMMOD} scsi_debug || exit 1)
+       udev_trigger
+
+       msg "${LDMOD} scsi_debug dev_size_mb=${SDSIZE} "                     \
+               "add_host=${SDHOSTS} num_tgts=${SDTGTS} "                    \
+               "max_luns=${SDLUNS}"
+       ${LDMOD} scsi_debug                                                  \
+               dev_size_mb=${SDSIZE}                                        \
+               add_host=${SDHOSTS}                                          \
+               num_tgts=${SDTGTS}                                           \
+               max_luns=${SDLUNS} ||                                        \
+               die "Error $? creating scsi_debug devices"
+       udev_trigger
+
+       SDDEVICE=`${LSSCSI} | ${AWK} '/scsi_debug/ { print $6; exit }'`
+       msg "${PARTED} -s ${SDDEVICE} mklabel gpt"
+       ${PARTED} -s ${SDDEVICE} mklabel gpt ||                              \
+               (${RMMOD} scsi_debug && die "Error $? creating gpt label")
+
+       for FILE in ${FILES}; do
+               LODEVICE=`unused_loop_device`
+
+               rm -f ${FILE} || exit 1
+               dd if=/dev/zero of=${FILE} bs=1024k count=0 seek=256         \
+                       &>/dev/null || (${RMMOD} scsi_debug &&               \
+                       die "Error $? creating ${FILE}")
+
+               # Setup the loopback device on the file.
+               msg "Creating ${LODEVICE} using ${FILE}"
+               ${LOSETUP} ${LODEVICE} ${FILE} || (${RMMOD} scsi_debug       \
+                       die "Error $? creating ${LODEVICE} using ${FILE}")
+
+               DEVICES="${DEVICES} ${LODEVICE}"
+       done
+
+       DEVICES="${DEVICES} ${SDDEVICE}"
+
+       msg "${ZPOOL} create ${FORCE_FLAG} ${ZPOOL_NAME} raidz3 ${DEVICES}"
+       ${ZPOOL} create ${FORCE_FLAG} ${ZPOOL_NAME} raidz3 ${DEVICES} ||     \
+               (${RMMOD} scsi_debug && exit 1)
+}
+
+zpool_destroy() {
+       msg ${ZPOOL} destroy ${ZPOOL_NAME}
+       ${ZPOOL} destroy ${ZPOOL_NAME}
+
+       for FILE in ${FILES}; do
+               LODEVICE=`${LOSETUP} -a | grep ${FILE} | head -n1|cut -f1 -d:`
+               msg "Removing ${LODEVICE} using ${FILE}"
+               ${LOSETUP} -d ${LODEVICE} ||
+                       die "Error $? destroying ${LODEVICE} using ${FILE}"
+               rm -f ${FILE} || exit 1
+       done
+
+       msg "${RMMOD} scsi_debug"
+       ${RMMOD} scsi_debug || die "Error $? removing scsi_debug devices"
+}