From: Darrick J. Wong <djwong@xxxxxxxxxx> Upgrade the dmflakey code to coordinate making external scratch log and scratch realtime devices flakey along with the scratch device. Note that unlike SCRATCH_DEV, we save the old rt/log devices as separate variables and replace SCRATCH_{RT,LOG}DEV so that helper functions continue to work without modification. Signed-off-by: Darrick J. Wong <djwong@xxxxxxxxxx> --- common/dmflakey | 106 +++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 103 insertions(+), 3 deletions(-) diff --git a/common/dmflakey b/common/dmflakey index b4e11ae9..af4371a3 100644 --- a/common/dmflakey +++ b/common/dmflakey @@ -10,6 +10,7 @@ FLAKEY_ERROR_WRITES=2 _init_flakey() { + # Scratch device local BLK_DEV_SIZE=`blockdev --getsz $SCRATCH_DEV` FLAKEY_DEV=/dev/mapper/flakey-test FLAKEY_TABLE="0 $BLK_DEV_SIZE flakey $SCRATCH_DEV 0 180 0" @@ -17,11 +18,50 @@ _init_flakey() FLAKEY_TABLE_ERROR="0 $BLK_DEV_SIZE flakey $SCRATCH_DEV 0 0 180 1 error_writes" _dmsetup_create flakey-test --table "$FLAKEY_TABLE" || \ _fatal "failed to create flakey device" + + # Realtime device + if [ -n "$SCRATCH_RTDEV" ]; then + if [ -z "$NON_FLAKEY_RTDEV" ]; then + # Set up the device switch + local backing_dev="$SCRATCH_RTDEV" + export NON_FLAKEY_RTDEV="$SCRATCH_RTDEV" + SCRATCH_RTDEV=/dev/mapper/flakey-rttest + else + # Already set up; recreate tables + local backing_dev="$NON_FLAKEY_RTDEV" + fi + local BLK_DEV_SIZE=`blockdev --getsz $backing_dev` + FLAKEY_RTTABLE="0 $BLK_DEV_SIZE flakey $backing_dev 0 180 0" + FLAKEY_RTTABLE_DROP="0 $BLK_DEV_SIZE flakey $backing_dev 0 0 180 1 drop_writes" + FLAKEY_RTTABLE_ERROR="0 $BLK_DEV_SIZE flakey $backing_dev 0 0 180 1 error_writes" + _dmsetup_create flakey-rttest --table "$FLAKEY_RTTABLE" || \ + _fatal "failed to create flakey rt device" + fi + + # External log device + if [ -n "$SCRATCH_LOGDEV" ]; then + if [ -z "$NON_FLAKEY_LOGDEV" ]; then + # Set up the device switch + local backing_dev="$SCRATCH_LOGDEV" + export NON_FLAKEY_LOGDEV="$SCRATCH_LOGDEV" + SCRATCH_LOGDEV=/dev/mapper/flakey-logtest + else + # Already set up; recreate tables + local backing_dev="$NON_FLAKEY_LOGDEV" + fi + local BLK_DEV_SIZE=`blockdev --getsz $backing_dev` + FLAKEY_LOGTABLE="0 $BLK_DEV_SIZE flakey $backing_dev 0 180 0" + FLAKEY_LOGTABLE_DROP="0 $BLK_DEV_SIZE flakey $backing_dev 0 0 180 1 drop_writes" + FLAKEY_LOGTABLE_ERROR="0 $BLK_DEV_SIZE flakey $backing_dev 0 0 180 1 error_writes" + _dmsetup_create flakey-logtest --table "$FLAKEY_LOGTABLE" || \ + _fatal "failed to create flakey log device" + fi } _mount_flakey() { _scratch_options mount + mount -t $FSTYP $SCRATCH_OPTIONS $MOUNT_OPTIONS $FLAKEY_DEV $SCRATCH_MNT } @@ -34,9 +74,21 @@ _cleanup_flakey() { # If dmsetup load fails then we need to make sure to do resume here # otherwise the umount will hang + test -n "$NON_FLAKEY_LOGDEV" && $DMSETUP_PROG resume flakey-logtest &> /dev/null + test -n "$NON_FLAKEY_RTDEV" && $DMSETUP_PROG resume flakey-rttest &> /dev/null $DMSETUP_PROG resume flakey-test > /dev/null 2>&1 + $UMOUNT_PROG $SCRATCH_MNT > /dev/null 2>&1 + _dmsetup_remove flakey-test + test -n "$NON_FLAKEY_LOGDEV" && _dmsetup_remove flakey-logtest + test -n "$NON_FLAKEY_RTDEV" && _dmsetup_remove flakey-rttest + + SCRATCH_LOGDEV="$NON_FLAKEY_LOGDEV" + unset NON_FLAKEY_LOGDEV + + SCRATCH_RTDEV="$NON_FLAKEY_RTDEV" + unset NON_FLAKEY_RTDEV } # _load_flakey_table <table> [lockfs] @@ -45,22 +97,70 @@ _cleanup_flakey() # table, so it simulates power failure. _load_flakey_table() { - table="$FLAKEY_TABLE" - [ $1 -eq $FLAKEY_DROP_WRITES ] && table="$FLAKEY_TABLE_DROP" - [ $1 -eq $FLAKEY_ERROR_WRITES ] && table="$FLAKEY_TABLE_ERROR" + case "$1" in + "$FLAKEY_DROP_WRITES") + table="$FLAKEY_TABLE_DROP" + logtable="$FLAKEY_LOGTABLE_DROP" + rttable="$FLAKEY_RTTABLE_DROP" + ;; + "$FLAKEY_ERROR_WRITES") + table="$FLAKEY_TABLE_ERROR" + logtable="$FLAKEY_LOGTABLE_ERROR" + rttable="$FLAKEY_RTTABLE_ERROR" + ;; + *) + table="$FLAKEY_TABLE" + logtable="$FLAKEY_LOGTABLE" + rttable="$FLAKEY_RTTABLE" + ;; + esac suspend_opt="--nolockfs" [ $# -gt 1 ] && [ $2 -eq 1 ] && suspend_opt="" + # Suspend the scratch device before the log and realtime devices so + # that the kernel can freeze and flush the filesystem if the caller + # wanted a freeze. $DMSETUP_PROG suspend $suspend_opt flakey-test [ $? -ne 0 ] && _fatal "failed to suspend flakey-test" + if [ -n "$NON_FLAKEY_RTDEV" ]; then + $DMSETUP_PROG suspend $suspend_opt flakey-rttest + [ $? -ne 0 ] && _fatal "failed to suspend flakey-rttest" + fi + + if [ -n "$NON_FLAKEY_LOGDEV" ]; then + $DMSETUP_PROG suspend $suspend_opt flakey-logtest + [ $? -ne 0 ] && _fatal "failed to suspend flakey-logtest" + fi + # There may be multiple dm targets in the table, and these dm targets # will be joined by the newline ("\n"). Option --table can not cope with # the multiple-targets case, so get them by reading from standard input. echo -e "$table" | $DMSETUP_PROG load flakey-test [ $? -ne 0 ] && _fatal "failed to load table into flakey-test" + if [ -n "$NON_FLAKEY_RTDEV" ]; then + echo -e "$rttable" | $DMSETUP_PROG load flakey-rttest + [ $? -ne 0 ] && _fatal "failed to load table into flakey-rttest" + fi + + if [ -n "$NON_FLAKEY_LOGDEV" ]; then + echo -e "$logtable" | $DMSETUP_PROG load flakey-logtest + [ $? -ne 0 ] && _fatal "failed to load table into flakey-logtest" + fi + + # Resume devices in the opposite order that we suspended them. + if [ -n "$NON_FLAKEY_LOGDEV" ]; then + $DMSETUP_PROG resume flakey-logtest + [ $? -ne 0 ] && _fatal "failed to resume flakey-logtest" + fi + + if [ -n "$NON_FLAKEY_RTDEV" ]; then + $DMSETUP_PROG resume flakey-rttest + [ $? -ne 0 ] && _fatal "failed to resume flakey-rttest" + fi + $DMSETUP_PROG resume flakey-test [ $? -ne 0 ] && _fatal "failed to resume flakey-test" }