diff --git a/tests/xfs/117 b/tests/xfs/117 index d3f4675f..32be525f 100755 --- a/tests/xfs/117 +++ b/tests/xfs/117 @@ -39,8 +39,7 @@ _require_xfs_db_blocktrash_z_command test -z "${FUZZ_ARGS}" && FUZZ_ARGS="-n 8 -3" rm -f $seqres.full -TESTDIR="${SCRATCH_MNT}/scratchdir" -TESTFILE="${TESTDIR}/testfile" +victimdir="${SCRATCH_MNT}/scratchdir" echo "+ create scratch fs" _scratch_mkfs_xfs > /dev/null @@ -50,37 +49,49 @@ _scratch_mount blksz="$(stat -f -c '%s' "${SCRATCH_MNT}")" echo "+ make some files" -mkdir -p "${TESTDIR}" -for x in `seq 1 1024`; do - touch "${SCRATCH_MNT}/junk.${x}" - inode="$(stat -c '%i' "${SCRATCH_MNT}/junk.${x}")" - if [ "$x" -gt 512 ] && [ "$((inode % 64))" -eq 0 ]; then - mv "${SCRATCH_MNT}/junk.${x}" "${TESTFILE}.1" - break - fi +mkdir -p "$victimdir" + +rootdir="$(stat -c '%i' "$SCRATCH_MNT")" +rootchunk=$(( rootdir / 64 )) + +# First we create some dummy file so that the victim files don't get created +# in the same inode chunk as the root directory, because a corrupt inode in +# the root chunk causes mount to fail. +for ((i = 0; i < 256; i++)); do + fname="$SCRATCH_MNT/dummy.$i" + touch "$fname" + ino="$(stat -c '%i' "$fname")" + ichunk=$(( ino / 64 )) + test "$ichunk" -gt "$rootchunk" && break done -for x in `seq 2 64`; do - touch "${TESTFILE}.${x}" + +# Now create some victim files +inos=() +for ((i = 0; i < 64; i++)); do + fname="$victimdir/test.$i" + touch "$fname" + inos+=("$(stat -c '%i' "$fname")") done -inode="$(stat -c '%i' "${TESTFILE}.1")" +echo "First victim inode is: " >> $seqres.full +stat -c '%i' "$fname" >> $seqres.full umount "${SCRATCH_MNT}" echo "+ check fs" _scratch_xfs_repair -n >> $seqres.full 2>&1 || _fail "xfs_repair should not fail" echo "+ corrupt image" -seq "${inode}" "$((inode + 63))" | while read ino; do +for ino in "${inos[@]}"; do _scratch_xfs_db -x -c "inode ${ino}" -c "stack" -c "blocktrash -x 32 -y $((blksz * 8)) -z ${FUZZ_ARGS}" >> $seqres.full 2>&1 done echo "+ mount image && modify files" broken=1 if _try_scratch_mount >> $seqres.full 2>&1; then - - for x in `seq 1 64`; do - stat "${TESTFILE}.${x}" >> $seqres.full 2>&1 + for ((i = 0; i < 64; i++)); do + fname="$victimdir/test.$i" + stat "$fname" &>> $seqres.full test $? -eq 0 && broken=0 - touch "${TESTFILE}.${x}" >> $seqres.full 2>&1 + touch "$fname" &>> $seqres.full test $? -eq 0 && broken=0 done umount "${SCRATCH_MNT}"