15a60dc51ef5c2b97db192244e79b12ad03ee885eDavid 'Digit' Turner#!/bin/bash 25a60dc51ef5c2b97db192244e79b12ad03ee885eDavid 'Digit' Turner 35a60dc51ef5c2b97db192244e79b12ad03ee885eDavid 'Digit' Turnertypeset -i I ITERATIONS PHASE LOC COUNT MAXCOUNT 45a60dc51ef5c2b97db192244e79b12ad03ee885eDavid 'Digit' Turner 55a60dc51ef5c2b97db192244e79b12ad03ee885eDavid 'Digit' TurnerME=`basename $0` 65a60dc51ef5c2b97db192244e79b12ad03ee885eDavid 'Digit' Turner 75a60dc51ef5c2b97db192244e79b12ad03ee885eDavid 'Digit' Turnerif [ "$#" -ne 3 ] 85a60dc51ef5c2b97db192244e79b12ad03ee885eDavid 'Digit' Turnerthen 95a60dc51ef5c2b97db192244e79b12ad03ee885eDavid 'Digit' Turner echo "$ME: Usage: $ME <iterations> <maxcount> <filesystem_image>" >&2 105a60dc51ef5c2b97db192244e79b12ad03ee885eDavid 'Digit' Turner exit 1; 115a60dc51ef5c2b97db192244e79b12ad03ee885eDavid 'Digit' Turnerfi 125a60dc51ef5c2b97db192244e79b12ad03ee885eDavid 'Digit' Turner 135a60dc51ef5c2b97db192244e79b12ad03ee885eDavid 'Digit' TurnerITERATIONS="$1" 145a60dc51ef5c2b97db192244e79b12ad03ee885eDavid 'Digit' TurnerMAXCOUNT="$2" 155a60dc51ef5c2b97db192244e79b12ad03ee885eDavid 'Digit' TurnerORIG_FS_IMAGE="$3" 165a60dc51ef5c2b97db192244e79b12ad03ee885eDavid 'Digit' TurnerFIXED_FS_IMAGE="/tmp/fixedfsimage.$$" 175a60dc51ef5c2b97db192244e79b12ad03ee885eDavid 'Digit' TurnerNEW_FS_IMAGE="/tmp/newfsimage.$$" 185a60dc51ef5c2b97db192244e79b12ad03ee885eDavid 'Digit' Turner 195a60dc51ef5c2b97db192244e79b12ad03ee885eDavid 'Digit' Turnerif [ ! -f "$ORIG_FS_IMAGE" ] 205a60dc51ef5c2b97db192244e79b12ad03ee885eDavid 'Digit' Turnerthen 215a60dc51ef5c2b97db192244e79b12ad03ee885eDavid 'Digit' Turner echo "$ME: Filesystem image $NEW_FS_IMAGE does not exist" >&2 225a60dc51ef5c2b97db192244e79b12ad03ee885eDavid 'Digit' Turner exit 1 235a60dc51ef5c2b97db192244e79b12ad03ee885eDavid 'Digit' Turnerfi 245a60dc51ef5c2b97db192244e79b12ad03ee885eDavid 'Digit' Turner 255a60dc51ef5c2b97db192244e79b12ad03ee885eDavid 'Digit' Turnertrap "rm -f $NEW_FS_IMAGE $FIXED_FS_IMAGE" 0 1 2 3 15 265a60dc51ef5c2b97db192244e79b12ad03ee885eDavid 'Digit' Turner 275a60dc51ef5c2b97db192244e79b12ad03ee885eDavid 'Digit' Turnerrm -f "$NEW_FS_IMAGE" "$FIXED_FS_IMAGE" 285a60dc51ef5c2b97db192244e79b12ad03ee885eDavid 'Digit' Turner 295a60dc51ef5c2b97db192244e79b12ad03ee885eDavid 'Digit' Turner# Create the fixed image to compare against 305a60dc51ef5c2b97db192244e79b12ad03ee885eDavid 'Digit' Turnercp "$ORIG_FS_IMAGE" "$FIXED_FS_IMAGE" 315a60dc51ef5c2b97db192244e79b12ad03ee885eDavid 'Digit' Turnerext4fixup "$FIXED_FS_IMAGE" 325a60dc51ef5c2b97db192244e79b12ad03ee885eDavid 'Digit' Turner 335a60dc51ef5c2b97db192244e79b12ad03ee885eDavid 'Digit' Turnerif [ "$?" -ne 0 ] 345a60dc51ef5c2b97db192244e79b12ad03ee885eDavid 'Digit' Turnerthen 355a60dc51ef5c2b97db192244e79b12ad03ee885eDavid 'Digit' Turner echo "$ME: ext4fixup failed!\n" 365a60dc51ef5c2b97db192244e79b12ad03ee885eDavid 'Digit' Turner exit 1 375a60dc51ef5c2b97db192244e79b12ad03ee885eDavid 'Digit' Turnerfi 385a60dc51ef5c2b97db192244e79b12ad03ee885eDavid 'Digit' Turner 395a60dc51ef5c2b97db192244e79b12ad03ee885eDavid 'Digit' TurnerI=0 405a60dc51ef5c2b97db192244e79b12ad03ee885eDavid 'Digit' Turnerwhile [ "$I" -lt "$ITERATIONS" ] 415a60dc51ef5c2b97db192244e79b12ad03ee885eDavid 'Digit' Turnerdo 425a60dc51ef5c2b97db192244e79b12ad03ee885eDavid 'Digit' Turner # There is also a phase 4, which is writing out the updated superblocks and 435a60dc51ef5c2b97db192244e79b12ad03ee885eDavid 'Digit' Turner # block group descriptors. Test the with a separate script. 445a60dc51ef5c2b97db192244e79b12ad03ee885eDavid 'Digit' Turner let PHASE="$RANDOM"%3 # 0 to 2 455a60dc51ef5c2b97db192244e79b12ad03ee885eDavid 'Digit' Turner let PHASE++ # 1 to 3 465a60dc51ef5c2b97db192244e79b12ad03ee885eDavid 'Digit' Turner let LOC="$RANDOM"%2 # 0 to 1 475a60dc51ef5c2b97db192244e79b12ad03ee885eDavid 'Digit' Turner let LOC++ # 1 to 2 485a60dc51ef5c2b97db192244e79b12ad03ee885eDavid 'Digit' Turner let COUNT="$RANDOM"%"$MAXCOUNT" 495a60dc51ef5c2b97db192244e79b12ad03ee885eDavid 'Digit' Turner 505a60dc51ef5c2b97db192244e79b12ad03ee885eDavid 'Digit' Turner # Make a copy of the original image to fixup 515a60dc51ef5c2b97db192244e79b12ad03ee885eDavid 'Digit' Turner cp "$ORIG_FS_IMAGE" "$NEW_FS_IMAGE" 525a60dc51ef5c2b97db192244e79b12ad03ee885eDavid 'Digit' Turner 535a60dc51ef5c2b97db192244e79b12ad03ee885eDavid 'Digit' Turner # Run the fixup tool, but die partway through to see if we can recover 545a60dc51ef5c2b97db192244e79b12ad03ee885eDavid 'Digit' Turner ext4fixup -d "$PHASE,$LOC,$COUNT" "$NEW_FS_IMAGE" 2>/dev/null 555a60dc51ef5c2b97db192244e79b12ad03ee885eDavid 'Digit' Turner 565a60dc51ef5c2b97db192244e79b12ad03ee885eDavid 'Digit' Turner # run it again without -d to have it finish the job 575a60dc51ef5c2b97db192244e79b12ad03ee885eDavid 'Digit' Turner ext4fixup "$NEW_FS_IMAGE" 585a60dc51ef5c2b97db192244e79b12ad03ee885eDavid 'Digit' Turner 595a60dc51ef5c2b97db192244e79b12ad03ee885eDavid 'Digit' Turner if cmp "$FIXED_FS_IMAGE" "$NEW_FS_IMAGE" 605a60dc51ef5c2b97db192244e79b12ad03ee885eDavid 'Digit' Turner then 615a60dc51ef5c2b97db192244e79b12ad03ee885eDavid 'Digit' Turner : 625a60dc51ef5c2b97db192244e79b12ad03ee885eDavid 'Digit' Turner else 635a60dc51ef5c2b97db192244e79b12ad03ee885eDavid 'Digit' Turner echo "$ME: test failed with parameters $PHASE, $LOC, $COUNT" 645a60dc51ef5c2b97db192244e79b12ad03ee885eDavid 'Digit' Turner exit 1 655a60dc51ef5c2b97db192244e79b12ad03ee885eDavid 'Digit' Turner fi 665a60dc51ef5c2b97db192244e79b12ad03ee885eDavid 'Digit' Turner 675a60dc51ef5c2b97db192244e79b12ad03ee885eDavid 'Digit' Turner rm -f "$NEW_FS_IMAGE" 685a60dc51ef5c2b97db192244e79b12ad03ee885eDavid 'Digit' Turner 695a60dc51ef5c2b97db192244e79b12ad03ee885eDavid 'Digit' Turner let I++ 705a60dc51ef5c2b97db192244e79b12ad03ee885eDavid 'Digit' Turnerdone 715a60dc51ef5c2b97db192244e79b12ad03ee885eDavid 'Digit' Turner 72