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