#!/bin/bash typeset -i I ITERATIONS PHASE LOC COUNT MAXCOUNT ME=`basename $0` if [ "$#" -ne 3 ] then echo "$ME: Usage: $ME <iterations> <maxcount> <filesystem_image>" >&2 exit 1; fi ITERATIONS="$1" MAXCOUNT="$2" ORIG_FS_IMAGE="$3" FIXED_FS_IMAGE="/tmp/fixedfsimage.$$" NEW_FS_IMAGE="/tmp/newfsimage.$$" if [ ! -f "$ORIG_FS_IMAGE" ] then echo "$ME: Filesystem image $NEW_FS_IMAGE does not exist" >&2 exit 1 fi trap "rm -f $NEW_FS_IMAGE $FIXED_FS_IMAGE" 0 1 2 3 15 rm -f "$NEW_FS_IMAGE" "$FIXED_FS_IMAGE" # Create the fixed image to compare against cp "$ORIG_FS_IMAGE" "$FIXED_FS_IMAGE" ext4fixup "$FIXED_FS_IMAGE" if [ "$?" -ne 0 ] then echo "$ME: ext4fixup failed!\n" exit 1 fi I=0 while [ "$I" -lt "$ITERATIONS" ] do # There is also a phase 4, which is writing out the updated superblocks and # block group descriptors. Test the with a separate script. let PHASE="$RANDOM"%3 # 0 to 2 let PHASE++ # 1 to 3 let LOC="$RANDOM"%2 # 0 to 1 let LOC++ # 1 to 2 let COUNT="$RANDOM"%"$MAXCOUNT" # Make a copy of the original image to fixup cp "$ORIG_FS_IMAGE" "$NEW_FS_IMAGE" # Run the fixup tool, but die partway through to see if we can recover ext4fixup -d "$PHASE,$LOC,$COUNT" "$NEW_FS_IMAGE" 2>/dev/null # run it again without -d to have it finish the job ext4fixup "$NEW_FS_IMAGE" if cmp "$FIXED_FS_IMAGE" "$NEW_FS_IMAGE" then : else echo "$ME: test failed with parameters $PHASE, $LOC, $COUNT" exit 1 fi rm -f "$NEW_FS_IMAGE" let I++ done