#!/bin/bash DISK=/dev/vda FILE_SIZE=50 PART_NUM=10 PART_GB=2 prepare_test() { parted -s $DISK mktable gpt for i in `seq 1 1 $PART_NUM`; do parted -s -a optimal $DISK mkpart primary \ $(( PART_GB * (i - 1) ))GiB $(( PART_GB * i ))GiB done for i in `seq 1 1 $PART_NUM`; do SIZE=`blockdev --getsize ${DISK}${i}` dmsetup create linear${i} --table \ "0 ${SIZE} linear ${DISK}${i} 0" done sleep 2 for i in `seq 1 1 $PART_NUM`; do mkfs.xfs -f /dev/dm-$(( i - 1 )) done for i in `seq 1 1 $PART_NUM`; do mkdir /mnt/p${i} done for i in `seq 1 1 $PART_NUM`; do mount /dev/dm-$(( i - 1 )) /mnt/p${i} done } cleanup_test() { for i in `seq 1 1 $PART_NUM`; do umount /mnt/p${i} done for i in `seq 1 1 $PART_NUM`; do rm -rf /mnt/p${i} done for i in `seq 1 1 $PART_NUM`; do dmsetup remove linear${i} done } inject_error() { while true; do echo "Error = 0" echo 0 > /sys/kernel/debug/dm_debug/error echo 0 > /sys/kernel/debug/dm_debug/error_counter echo 100 > /sys/kernel/debug/dm_debug/error_max sleep 1 echo "Drop caches" echo 1 > /proc/sys/vm/drop_caches sleep 1 echo "Error = 1" echo 1 > /sys/kernel/debug/dm_debug/error sleep 3 done } inject_stop() { echo 0 > /sys/kernel/debug/dm_debug/error } run_test() { truncate -s 0 md5sum.log inject_error & PID=$! for i in `seq 1 1 $PART_NUM`; do dd if=/dev/urandom bs=1M count=$FILE_SIZE of=/mnt/p${i}/file md5sum /mnt/p${i}/file >> md5sum.log done kill $PID inject_stop md5sum -c md5sum.log } prepare_test run_test cleanup_test