#!/bin/sh

# Not supported in GNU/Linux: afs minix3 sfs

NOBIG=y

echo -n "FILESYS        NDEV DIR  LDIR TIME LTIM LABL UUID FSTM SYM  LSYM FILE LFIL "
if [ x"$NOBIG" != xy ]; then
    echo -n "BIG  "
fi
echo
echo > report.txt

GRUBFSTEST="/home/phcoder/compile/grub-fstest"

run_grubfstest () {
    echo "$fs:" "$NDEVICES" "$@" >> time_report.txt
    case x$fs in
	# RAID 1 has to work with even one device of the set.
	xzfs_mirror)
	    /usr/bin/time -a -o time_report.txt valgrind --log-file="valreport/${fs}_%p.txt" --leak-check=full "$GRUBFSTEST" -c 1 "${FSIMAGES[0]}" "$@";;
	# Degrade raidz by removing first and last device
	xzfs_raidz2)
	    unset CURDEVICES
	    for ((i=1;i < NDEVICES - 1; i++)); do
		CURDEVICES[i-1]="${FSIMAGES[i]}";
	    done
	    /usr/bin/time -a -o time_report.txt valgrind --log-file="valreport/${fs}_%p.txt" --leak-check=full "$GRUBFSTEST" -c $((NDEVICES-2)) "${CURDEVICES[@]}" "$@";;

	# Degrade raidz and btrfs RAID1 by removing first device
 	xbtrfs_raid1 | xbtrfs_raid10 | xzfs_raidz)
	    unset CURDEVICES
	    for ((i=1;i < NDEVICES; i++)); do
		CURDEVICES[i-1]="${FSIMAGES[i]}";
	    done
	    /usr/bin/time -a -o time_report.txt valgrind --log-file="valreport/${fs}_%p.txt" --leak-check=full "$GRUBFSTEST" -c $((NDEVICES-1)) "${CURDEVICES[@]}" "$@";;
	*)
	    /usr/bin/time -a -o time_report.txt valgrind --log-file="valreport/${fs}_%p.txt" --leak-check=full "$GRUBFSTEST" -c $NDEVICES "${FSIMAGES[@]}"  "$@";;

    esac
}

# ufs2 ufs1 
for fs in iso9660 affs cpiofs tarfs squash4 minix minix2 udf fat exfat bfs ntfs reiserfs xfs jfs romfs hfs hfsplus ext2 ext3 ext4 nilfs2 zfs_raidz2 zfs_raidz zfs_mirror zfs_stripe zfs btrfs btrfs_raid0 btrfs_raid1 btrfs_single btrfs_raid10; do
    MAXDEVICES=1
    MINDEVICES=1
    export fs
    case x"$fs" in
	x"zfs_raidz" | x"zfs_stripe" | x"zfs_mirror" | xbtrfs_raid0 | xbtrfs_raid1)
	    MINDEVICES=2
	    MAXDEVICES=5
	    ;;
	xbtrfs_raid10)
	    MINDEVICES=4
	    MAXDEVICES=10
	    ;;
	x"zfs_raidz2")
	    MINDEVICES=3
	    MAXDEVICES=5;;
    esac
    for ((NDEVICES=MINDEVICES; NDEVICES <= MAXDEVICES; NDEVICES++)); do
	export NDEVICES
	unset FSIMAGES
	for ((i=0; i < NDEVICES; i++)); do
	    FSIMAGES[i]="/home/phcoder/compile/${fs}_$i.img"
	done
	export FSIMAGES
	MNTPOINTRO="/mnt/${fs}_ro"
	MNTPOINTRW="/mnt/${fs}_rw"
	MOUNTOPTS=""
	MOUNTFS="$fs"
	MASTER=master
	FSLABEL=grub_test
    # Limited by NAME_MAX (usually 255) in GNU/Linux
	LONGNAME="qwertzuiopasdfghjklyxcvbnm1234567890qwertzuiopasdfghjklyxcvbnm1234567890oiewqfiewioqoiqoiurqruewqoiuwoieoiiuewqroreqiufieiuwrnureweriuvceoiroiewqoiricdsalkcndsakfirefoiwqeoircorejwoijfreoijojoiewjfwnfcoirenfoirefnreoifenoiwfnoirewoifoiwqwoieqfrqwioerijewr"
	rm -rf "$MASTER"

    # FS LIMITATION: FAT doesn't accept nice labels
	case x"$fs" in
	    x"ufs1" | x"ufs2")
		FSLABEL="grubtest";;
	    x"fat")
		FSLABEL="GRUBTEST";;
	    #Preformatted image has this label
	    x"affs")
		FSLABEL="Empty";;
	esac
    # FS LIMITATION: some filesystems limit file size
	BIGBLOCKCNT=5000
	case x"$fs" in
	    x"fat" | x"cpiofs" | x"romfs")
		BIGBLOCKCNT=4095;;
	    # minix FS is atmost 64M. Leave some space for other files.
	    x"minix")
		BIGBLOCKCNT=53;;
	    x"minix2" | x"hfs" | x"affs")
		BIGBLOCKCNT=2047;;
	# We already test the FS for big files separately. Save some time here.
	    x"zfs_"* | x"btrfs_"*)
		BIGBLOCKCNT=1000;;
	esac
    # FS LIMITATION: no symlinks on FAT, exFAT and HFS
    # ntfs-3g limitation: it creates interix symlinks which aren't real symlinks
	NOSYMLINK=n
	case x"$fs" in
	    x"fat" | x"hfs" | x"exfat" | x"ntfs")
		NOSYMLINK=y;;
	esac
    # FS LIMITATION: some filesystems limit file name size
	case x"$fs" in
	    x"hfs")
		LONGNAME="`echo $LONGNAME |head -c 31`";;
	    x"minix" | x"minix2" | x"affs")
		LONGNAME="`echo $LONGNAME |head -c 30`";;
	    x"udf")
		LONGNAME="`echo $LONGNAME |head -c 192`";;
	esac
	NOFILETIME=n
	NOFSTIME=n
	case x"$fs" in
	# as far as I know those FS don't store their last modification date.
	    x"jfs" | x"xfs"| x"btrfs"* | x"reiserfs" | x"bfs" \
		| x"tarfs" | x"cpiofs" | x"minix" | x"minix2" \
		| x"ntfs" | x"affs" | x"udf")
		NOFSTIME=y;;
	# FAT and exFAT use localtime. Unusable for GRUB
	    x"fat" | x"exfat")
		NOFILETIME=y; NOFSTIME=y;;
	# FS limitation: romfs has no timestamps.
	    x"romfs")
		NOFILETIME=y; NOFSTIME=y;;
	esac

	NOFSLABEL=n
	case x"$fs" in
	    x"cpiofs" | x"tarfs" | x"squash4" | x"minix" | x"minix2")
		NOFSLABEL=y;;
	esac

	printf "%-16s%3d " $fs $NDEVICES;
	echo $fs $NDEVICES >> report.txt
	unset LODEVICES
	case x"$fs" in
	    x"tarfs" | x"cpiofs" | x"iso9660" | x"romfs" | x"squash4")
		MNTPOINTRW="$MASTER"
		MNTPOINTRO="$MASTER"
		mkdir -p "$MASTER";;
	    # No mkfs for GNU/Linux. Just unpack preformatted empty image
	    x"affs")
		mkdir -p "$MNTPOINTRW"
		mkdir -p "$MNTPOINTRO"
		xz -d < /home/phcoder/diskimg/affs.img.xz > "${FSIMAGES[0]}"
		for ((i=0; i < NDEVICES; i++)); do
		    LODEVICES[i]=`losetup -f`
		    losetup "${LODEVICES[i]}" "${FSIMAGES[i]}"
		done ;;
	    *)
		mkdir -p "$MNTPOINTRW"
		mkdir -p "$MNTPOINTRO"
		for ((i=0; i < NDEVICES; i++)); do
		    qemu-img create "${FSIMAGES[i]}" 10G > /dev/null
		    LODEVICES[i]=`losetup -f`
		    losetup "${LODEVICES[i]}" "${FSIMAGES[i]}"
		done ;;
	esac

	case x"$fs" in
	    x"affs") ;;
	    x"bfs")
		LD_LIBRARY_PATH=/home/phcoder/repos/bfs_le /home/phcoder/repos/bfs_le/bfs_shell --initialize "${FSIMAGES[0]}" "$FSLABEL" &>> report.txt;;
	    x"btrfs")
		"/sbin/mkfs.btrfs" -L "$FSLABEL" "${LODEVICES[0]}" &>> report.txt;;
	    x"btrfs_raid0")
		"/sbin/mkfs.btrfs" -d raid0 -L "$FSLABEL" "${LODEVICES[@]}" &>> report.txt
		MOUNTFS="btrfs"
		;;
	    x"btrfs_raid1")
		"/sbin/mkfs.btrfs" -d raid1 -L "$FSLABEL" "${LODEVICES[@]}" &>> report.txt
		MOUNTFS="btrfs"
		;;
	    x"btrfs_raid10")
		"/sbin/mkfs.btrfs" -d raid10 -L "$FSLABEL" "${LODEVICES[@]}" &>> report.txt
		MOUNTFS="btrfs"
		;;
	    x"btrfs_single")
		"/sbin/mkfs.btrfs" -d single -L "$FSLABEL" "${LODEVICES[@]}" &>> report.txt
		MOUNTFS="btrfs"
		;;
	    x"exfat")
		"/sbin/mkfs.$fs" -n "$FSLABEL" "${LODEVICES[0]}" &>> report.txt;;
	    x"minix")
		"/sbin/mkfs.$fs" "${LODEVICES[0]}" &>> report.txt;;
	# mkfs.hfs and mkfs.hfsplus don't fill UUID.
	    x"hfsplus")
		"/sbin/mkfs.$fs" -v "$FSLABEL" "${LODEVICES[0]}" &>> report.txt
		dd if=/dev/urandom of="${LODEVICES[0]}" bs=1 seek=$((16#468)) conv=notrunc count=8 &>> report.txt;;
	    x"hfs")
		"/sbin/mkfs.$fs" -v "$FSLABEL" -h "${LODEVICES[0]}" &>> report.txt
		dd if=/dev/urandom of="${LODEVICES[0]}" bs=1 seek=$((16#474)) conv=notrunc count=8 &>> report.txt
		;;
	    x"fat")
		"/sbin/mkfs.vfat" -n "$FSLABEL" "${LODEVICES[0]}" &>> report.txt
		MKFSOPTS=""
		MOUNTFS="vfat";;
	    x"minix2")
		"/sbin/mkfs.minix" -v "${LODEVICES[0]}" &>> report.txt
		MKFSOPTS="-v"
		MOUNTFS="minix";;
	    x"ntfs")
		"/sbin/mkfs.ntfs" -L "$FSLABEL" -Q -q "${LODEVICES[0]}" &>> report.txt;;
	    x"udf")
		"/usr/bin/mkudffs" --lvid="$FSLABEL" "${LODEVICES[0]}" &>> report.txt;;
	    x"ufs2")
		"/sbin/mkfs.ufs" -L "$FSLABEL" -O 2 "${LODEVICES[0]}" &>> report.txt
		MOUNTOPTS="ufstype=ufs2,"
		MOUNTFS="ufs";;
	    x"ufs1")
		"/sbin/mkfs.ufs" -L "$FSLABEL" -O 1 "${LODEVICES[0]}" &>> report.txt
		MOUNTOPTS="ufstype=44bsd,"
		MOUNTFS="ufs";;
	    x"zfs")
		zfs-fuse
		sleep 1
		"/usr/local/sbin/zpool" create -R "$MNTPOINTRW" "$FSLABEL" "${LODEVICES[0]}"
		sleep 1
		"/usr/local/sbin/zfs" create "$FSLABEL"/grubfs
		sleep 1;;
	    x"zfs_raidz")
		zfs-fuse
		sleep 1
		"/usr/local/sbin/zpool" create -R "$MNTPOINTRW" "$FSLABEL" raidz "${LODEVICES[@]}"
		sleep 1
		"/usr/local/sbin/zfs" create "$FSLABEL"/grubfs
		sleep 1;;
	    x"zfs_raidz2")
		zfs-fuse
		sleep 1
		"/usr/local/sbin/zpool" create -R "$MNTPOINTRW" "$FSLABEL" raidz2 "${LODEVICES[@]}"
		sleep 1
		"/usr/local/sbin/zfs" create "$FSLABEL"/grubfs
		sleep 1;;
	    x"zfs_mirror")
		zfs-fuse
		sleep 1
		"/usr/local/sbin/zpool" create -R "$MNTPOINTRW" "$FSLABEL" mirror "${LODEVICES[@]}"
		sleep 1
		"/usr/local/sbin/zfs" create "$FSLABEL"/grubfs
		sleep 1;;
	    x"zfs_stripe")
		zfs-fuse
		sleep 1
		"/usr/local/sbin/zpool" create -R "$MNTPOINTRW" "$FSLABEL" "${LODEVICES[@]}"
		sleep 1
		"/usr/local/sbin/zfs" create "$FSLABEL"/grubfs
		sleep 1;;
	    x"tarfs" | x"cpiofs" | x"iso9660" | x"romfs" | x"squash4") ;;
	    x"reiserfs")
		"/sbin/mkfs.$fs" -l "$FSLABEL" -q "${LODEVICES[0]}" &>> report.txt;;
	    *)
		"/sbin/mkfs.$fs" -L "$FSLABEL" -q "${LODEVICES[0]}" &>> report.txt;;
	esac
	BASEFILE="1.img"
	BIGFILE="big.img"
	BASESYM="sym"
	LONGSYM="longsym"
	OSDIR=""
	GRUBDIR="(loop0)"
	case x"$fs" in
	    x"zfs"*)	    
		OSDIR="grubfs/"
		GRUBDIR="(loop0)/grubfs@";;
	    x"bfs")
		/home/phcoder/repos/bfs_le/bfs_fuse "${FSIMAGES[0]}" "$MNTPOINTRW" &>> report.txt
		OSDIR="myfs/";;
	    x"tarfs" | x"cpiofs" | x"iso9660" | x"romfs" | x"squash4") 
		;;
	    *)
		mount -t "$MOUNTFS" "${LODEVICES[0]}" "$MNTPOINTRW" -o ${MOUNTOPTS}rw &>> report.txt;;
	esac
	if [ x"$fs" = x"minix" ]; then
	    BLOCKCNT=5
	else
	    BLOCKCNT=5
	fi
	openssl rand $((BLOCKCNT * 1048576)) > "$MNTPOINTRW/$OSDIR/$BASEFILE"
	openssl rand $((BLOCKCNT * 1048576)) > "$MNTPOINTRW/$OSDIR/$LONGNAME"
	if [ x$NOBIG != xy ]; then
	    (openssl rand $((BIGBLOCKCNT * 262144)); openssl rand $((BIGBLOCKCNT * 262144)); openssl rand $((BIGBLOCKCNT * 262144)); openssl rand $((BIGBLOCKCNT * 262144))) > "$MNTPOINTRW/$OSDIR/$BIGFILE"
	fi

	if [ x$NOSYMLINK != xy ]; then
	    ln -s "$BASEFILE" "$MNTPOINTRW/$OSDIR/$BASESYM"
	    ln -s "$LONGNAME" "$MNTPOINTRW/$OSDIR/$LONGSYM"
	fi
	case x"$fs" in
	    x"zfs"*)
		sleep 5
		zpool export "$FSLABEL"
		sleep 5
		"/usr/local/sbin/zpool" import -R "$MNTPOINTRO" "$FSLABEL"
		;;
	    x"tarfs")
		(cd "$MASTER"; tar cf "${FSIMAGES[0]}" .) &>> report.txt;;
	    x"cpiofs")
		(cd "$MASTER"; find . | cpio -o > "${FSIMAGES[0]}" ) &>> report.txt;;
	    x"iso9660")
		FSUUID=$(date -u +%Y-%m-%d-%H-%M-%S-00);
		xorrisofs -graft-points -R -J -V "$FSLABEL" --modification-date=$(echo ${FSUUID} | sed 's/-//g;') -o "${FSIMAGES[0]}" /="$MASTER" &>> report.txt;;
	    
	    x"romfs")
		genromfs -V "$FSLABEL" -f "${FSIMAGES[0]}" -d "$MASTER" &>> report.txt;;
	    x"squash4")
		mksquashfs "$MASTER" "${FSIMAGES[0]}" &>> report.txt;;
	    x"bfs")
		sleep 1
		OSDIR=""
		fusermount -u "$MNTPOINTRW" &>> report.txt
		mount -t befs "${LODEVICES[0]}" "$MNTPOINTRO" -o ${MOUNTOPTS}ro &>> report.txt;;
	    *)
		sleep 1
		umount "$MNTPOINTRW" &>> report.txt
		sleep 1
		mount -t "$MOUNTFS" "${LODEVICES[0]}" "$MNTPOINTRO" -o ${MOUNTOPTS}ro &>> report.txt;;
	esac

	case x"$fs" in
	    x"zfs"*)
		LSROUT=$(run_grubfstest ls -- -l '(loop0)/grubfs@/');;
	    *)
		LSROUT=$(run_grubfstest ls -- -l '(loop0)/');;
	esac
	if echo "$LSROUT" | grep "$BASEFILE" > /dev/null; then
	    echo LIST OK >> report.txt
	    echo -n "OK   "
	else
	    echo LIST FAIL >> report.txt
	    echo "$LSROUT" >> report.txt
	    TZ=UTC ls --time-style=+%Y%m%d%H%M%S.%N -l "$MNTPOINTRO" >> report.txt
	    echo -n "FAIL "
	fi

	if echo "$LSROUT" | grep "$LONGNAME" > /dev/null; then
	    echo LONG LIST OK >> report.txt
	    echo -n "OK   "
	else
	    echo LONG LIST FAIL >> report.txt
	    echo "$LSROUT" >> report.txt
	    TZ=UTC ls --time-style=+%Y%m%d%H%M%S.%N -l "$MNTPOINTRO" >> report.txt
	    echo -n "FAIL "
	fi

	if [ x$NOFILETIME != xy ]; then
	    filtime=$(TZ=UTC ls --time-style=+%Y%m%d%H%M%S -l -d "$MNTPOINTRO/$OSDIR/$BASEFILE"|awk '{print $6; }')
	    if echo "$LSROUT" | grep "$filtime $BASEFILE" > /dev/null; then
		echo TIME OK >> report.txt
		echo -n "OK   "
	    else
		echo TIME FAIL >> report.txt
		echo "$LSROUT" >> report.txt
		TZ=UTC ls --time-style=+%Y%m%d%H%M%S.%N -l "$MNTPOINTRO" >> report.txt
		echo -n "FAIL "
	    fi
	    
	    filtime=$(TZ=UTC ls --time-style=+%Y%m%d%H%M%S -l -d "$MNTPOINTRO/$OSDIR/$LONGNAME"|awk '{print $6; }')
	    if echo "$LSROUT" | grep "$filtime $LONGNAME" > /dev/null; then
		echo LONG TIME OK >> report.txt
		echo -n "OK   "
	    else
		echo LONG TIME FAIL >> report.txt
		echo "$LSROUT" >> report.txt
		TZ=UTC ls --time-style=+%Y%m%d%H%M%S.%N -l "$MNTPOINTRO" >> report.txt
		echo -n "FAIL "
	    fi
	else
	    echo -n "N/A  N/A  "
	fi

	LSOUT=`run_grubfstest ls -- -l '(loop0)'`
	if [ x"$NOFSLABEL" = xy ]; then
	    echo -n "N/A  "
	elif echo "$LSOUT" | grep 'Label "'"$FSLABEL"'"' > /dev/null; then
	    echo LABEL OK >> report.txt
	    echo -n "OK   "
	else
	    echo LABEL FAIL >> report.txt
	    echo "$LSOUT" >> report.txt
	    blkid "$LODEVICE" >> report.txt
	    echo -n "FAIL "
	fi

    # Inconsistencies between GRUB and blkid.
	case x"$fs" in
	    x"iso9660") ;;
	    x"ufs1" | x"ufs2")
		ID=$(dumpfs.ufs "$LODEVICE" |head -n 2|tail -n 1 | sed 's,^.*id,,g;s,\[,,g;s,\],,g')
		ID1="$(echo $ID | awk '{ print $1; }')"
		ID2="$(echo $ID | awk '{ print $2; }')"
		FSUUID=$(printf "%08x%08x\n" 0x$ID1 0x$ID2)
		;;
	    x"zfs"*)
		FSUUID=$(printf "%016x\n" $(blkid -o export "${LODEVICES[0]}" |grep UUID=|sed s,UUID=,,g));;
	    *)
		FSUUID=`blkid -o export "${LODEVICES[0]}" |grep UUID=|sed s,UUID=,,g`
		;;
	esac
	case x"$fs" in
	    x"hfs" | x"hfsplus")
		GRUBUUID="`run_grubfstest xnu_uuid 'loop0'`" &>>report.txt
		if [ x"$GRUBUUID" = x"$FSUUID" ]; then
		    echo UUID OK >> report.txt
		    echo -n "OK   "
		else
		    echo UUID FAIL >> report.txt
		    echo "$LSOUT" >> report.txt
		    echo "$GRUBUUID" >> report.txt
		    blkid "${LODEVICES[0]}" >> report.txt
		    echo -n "FAIL "
		fi
		;;
        # FS LIMITATION: romfs, cpio, tar, squash4, minix and minix2 
	# have no UUID.
	    x"romfs" | x"cpiofs" | x"tarfs" | x"squash4" | x"minix" \
		| x"minix2" | x"affs" | x"udf")
		echo -n "N/A  ";;
	    
	    *)
		if echo "$LSOUT" | grep 'UUID '"$FSUUID"' ' > /dev/null; then
		    echo UUID OK >> report.txt
		    echo -n "OK   "
		else
		    echo UUID FAIL >> report.txt
		    echo "$FSUUID" >> report.txt
		    echo "$LSOUT" >> report.txt
		    blkid "${LODEVICES[0]}" >> report.txt
		    echo -n "FAIL "
		fi
		;;
	esac

	if [ x$fs != xiso9660 ]; then
	    FSTIME="$(TZ=UTC ls --time-style="+%Y-%m-%d_%H:%M:%S" -l -d "${FSIMAGES[0]}"|awk '{print $6; }'|sed 's,_, ,g')"
	else
	    FSTIME="$(date -d "$(echo ${FSUUID} | awk -F - '{ print $1"-"$2"-"$3" "$4":"$5":"$6 ;}')" '+%Y-%m-%d %H:%M:%S')"
	fi

	if [ x$NOFSTIME = xy ]; then
	    echo -n "N/A  "
	elif echo "$LSOUT" | grep 'Last modification time '"$FSTIME" > /dev/null; then
	    echo FSTIME OK >> report.txt
	    echo -n "OK   "
	else
	    echo FSTIME FAIL >> report.txt
	    echo "$FSTIME" >> report.txt
	    echo "$LSOUT" >> report.txt
	    echo -n "FAIL "
	fi

	if [ x$NOSYMLINK != xy ]; then
	    if run_grubfstest cmp "$GRUBDIR/$BASESYM" "$MNTPOINTRO/$OSDIR/$BASEFILE" &>> report.txt ; then
		echo SYMLINK OK >> report.txt
		echo -n "OK   "
	    else
		echo -n "FAIL "
		echo SYMLINK FAIL >> report.txt
	    fi
	    if run_grubfstest cmp "$GRUBDIR/$LONGSYM" "$MNTPOINTRO/$OSDIR/$LONGNAME" &>> report.txt ; then
		echo LONG SYMLINK OK >> report.txt
		echo -n "OK   "
	    else
		echo -n "FAIL "
		echo LONG SYMLINK FAIL >> report.txt
	    fi
	else
	    echo -n "N/A  N/A  "	
	fi

	if run_grubfstest cmp "$GRUBDIR/$BASEFILE" "$MNTPOINTRO/$OSDIR/$BASEFILE" &>> report.txt ; then
	    echo READ OK >> report.txt
	    echo -n "OK   "
	else
	    echo -n "FAIL "
	    echo READ FAIL >> report.txt
	fi
	if run_grubfstest cmp "$GRUBDIR/$LONGNAME" "$MNTPOINTRO/$OSDIR/$LONGNAME" &>> report.txt ; then
	    echo LONG NAME READ OK >> report.txt
	    echo -n "OK   "
	else
	    echo -n "FAIL "
	    echo LONG NAME READ FAIL >> report.txt
	fi
	if [ x$NOBIG != xy ]; then
	    if run_grubfstest cmp "$GRUBDIR/$BIGFILE" "$MNTPOINTRO/$OSDIR/$BIGFILE" &>> report.txt ; then
		echo BIG OK >> report.txt
		echo -n "OK "
	    else
		echo -n "FAIL "
		echo BIG FAIL >> report.txt
	    fi
	fi
	echo
	sleep 1
	case x"$fs" in
	    x"zfs"*)
		zpool export "$FSLABEL";;
	    x"tarfs" | x"cpiofs" | x"iso9660" | x"romfs" | x"squash4") 
		;;
	    *)
		umount "$MNTPOINTRO" &>> report.txt || true
		umount "$MNTPOINTRW"&>> report.txt || true 
	esac
	sleep 1
	for ((i=0; i < NDEVICES; i++)); do
	    case x"$fs" in
		x"tarfs" | x"cpiofs" | x"iso9660" | x"romfs" | x"squash4") ;;
		*)
		    losetup -d "${LODEVICES[i]}";;
	    esac
	    rm "${FSIMAGES[i]}"
	done
	if [ x"$fs" = x"zfs" ]; then
	    rmdir "$MNTPOINTRW"/grubfs &>> report.txt || true 
	    rmdir "$MNTPOINTRO"/grubfs &>> report.txt || true
	fi
	rmdir "$MNTPOINTRW" &>> report.txt || true
	rmdir "$MNTPOINTRO" &>> report.txt || true
    done
done
