#!/bin/bash

rm /root/results/* -rf

if [ "`grep testdir /proc/mounts | wc -l`" -eq "1" ]; then
  umount /testdir
  rm -rf /testdir
fi

for fs in ext2 ext3 ext4 xfs reiserfs btrfs zfs ntfs; do
  for disk in sda3 sdb1; do
    if [ "$fs" = "xfs" ] || [ "$fs" = "reiserfs" ]; then
      force="-f"
    elif [ "$fs" = "ntfs" ]; then
      force="-Q"
    else
      force=""
    fi
    # create resultstructure
    mkdir -p /root/results/${fs}/${disk}
    echo "make filesystem ${fs} on ${disk}"
    echo mkfs.${fs} $force /dev/${disk} > /root/results/${fs}/${disk}/time.mkfs.command
    sync && echo 3 > /proc/sys/vm/drop_caches && echo 3 > /proc/sys/vm/drop_caches
    START="`date +%s.%N`"
    if [ "$fs" = "zfs" ]; then
      if [ "$disk" = "sda3" ]; then
        zfsdev="scsi-3600605b0042a84301746d5fb1dfd0662-part3" 
      else
        zfsdev="scsi-3600605b0042a8430174809a4139b7907-part1"
      fi
      rm /testdir -rf
      zpool create testdir $zfsdev -f
    else
      mkfs.${fs} $force /dev/${disk}
    fi
    END="`date +%s.%N`"
    echo "$END - $START" | bc > /root/results/${fs}/${disk}/mkfs.time
    # mount fs
    mkdir /testdir
    mount -t ${fs} /dev/${disk} /testdir

    sync && echo 3 > /proc/sys/vm/drop_caches && echo 3 > /proc/sys/vm/drop_caches
    START="`date +%s.%N`"
    for i in `seq 1 16`; do
      mkdir -p /testdir/${i}
      for j in `seq 1 1024`; do
        mkdir -p /testdir/${i}/${j}
      done
    done
    sync
    END="`date +%s.%N`"
    echo "$END - $START" | bc > /root/results/${fs}/${disk}/mkdir.time

    sync && echo 3 > /proc/sys/vm/drop_caches && echo 3 > /proc/sys/vm/drop_caches
    START="`date +%s.%N`"
    for i in `seq 1 16`; do
      for j in `seq 1 1024`; do
        touch /testdir/${i}/${j}/file
      done
    done
    sync
    END="`date +%s.%N`"
    echo "$END - $START" | bc > /root/results/${fs}/${disk}/touch.time

    sync && echo 3 > /proc/sys/vm/drop_caches && echo 3 > /proc/sys/vm/drop_caches
    START="`date +%s.%N`"
    for i in `seq 1 16`; do
      for j in `seq 1 1024`; do
        echo ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789 > /testdir/${i}/${j}/file
      done
    done
    sync
    END="`date +%s.%N`"
    echo "$END - $START" | bc > /root/results/${fs}/${disk}/echo.time

    sync && echo 3 > /proc/sys/vm/drop_caches && echo 3 > /proc/sys/vm/drop_caches
    START="`date +%s.%N`"
    for i in `seq 1 16`; do
      for j in `seq 1 1024`; do
        cat /testdir/${i}/${j}/file &> /dev/null
      done
    done
    sync
    END="`date +%s.%N`"
    echo "$END - $START" | bc > /root/results/${fs}/${disk}/cat.time

    sync && echo 3 > /proc/sys/vm/drop_caches && echo 3 > /proc/sys/vm/drop_caches
    START="`date +%s.%N`"
    for i in `seq 1 16`; do
      for j in `seq 1 128`; do
        dd if=/dev/zero of=/testdir/${i}/${j}/dd bs=512 count=2048 &> /dev/null
      done
    done
    sync
    END="`date +%s.%N`"
    echo "$END - $START" | bc > /root/results/${fs}/${disk}/ddwrite1m-512.time

    sync && echo 3 > /proc/sys/vm/drop_caches && echo 3 > /proc/sys/vm/drop_caches
    START="`date +%s.%N`"
    for i in `seq 1 16`; do
      for j in `seq 1 128`; do
        dd if=/dev/zero of=/testdir/${i}/${j}/dd bs=512 count=20480 &> /dev/null
      done
    done
    sync
    END="`date +%s.%N`"
    echo "$END - $START" | bc > /root/results/${fs}/${disk}/ddwrite10m-512.time

    sync && echo 3 > /proc/sys/vm/drop_caches && echo 3 > /proc/sys/vm/drop_caches
    START="`date +%s.%N`"
    for i in `seq 1 16`; do
      for j in `seq 1 128`; do
        dd if=/dev/zero of=/testdir/${i}/${j}/dd bs=4096 count=512 &> /dev/null
      done
    done
    sync
    END="`date +%s.%N`"
    echo "$END - $START" | bc > /root/results/${fs}/${disk}/ddwrite1m-4096.time

    sync && echo 3 > /proc/sys/vm/drop_caches && echo 3 > /proc/sys/vm/drop_caches
    START="`date +%s.%N`"
    for i in `seq 1 16`; do
      for j in `seq 1 128`; do
        dd if=/dev/zero of=/testdir/${i}/${j}/dd bs=4096 count=5120 &> /dev/null
      done
    done
    sync
    END="`date +%s.%N`"
    echo "$END - $START" | bc > /root/results/${fs}/${disk}/ddwrite10m-4096.time

    sync && echo 3 > /proc/sys/vm/drop_caches && echo 3 > /proc/sys/vm/drop_caches
    START="`date +%s.%N`"
    for i in `seq 1 16`; do
      for j in `seq 1 128`; do
        dd if=/testdir/${i}/${j}/dd of=/dev/null &> /dev/null
      done
    done
    END="`date +%s.%N`"
    sync
    echo "$END - $START" | bc > /root/results/${fs}/${disk}/ddread.time

    sync && echo 3 > /proc/sys/vm/drop_caches && echo 3 > /proc/sys/vm/drop_caches
    START="`date +%s.%N`"
    find /testdir/ -type f -exec rm {} \;
    sync
    END="`date +%s.%N`"
    echo "$END - $START" | bc > /root/results/${fs}/${disk}/rmfile.time

    sync && echo 3 > /proc/sys/vm/drop_caches && echo 3 > /proc/sys/vm/drop_caches
    START="`date +%s.%N`"
    find /testdir/ -type d -exec rm -rf {} \;
    sync
    END="`date +%s.%N`"
    echo "$END - $START" | bc > /root/results/${fs}/${disk}/rmdir.time

    sync && echo 3 > /proc/sys/vm/drop_caches && echo 3 > /proc/sys/vm/drop_caches
    START="`date +%s.%N`"
    iozone -Rb /root/results/${fs}/${disk}/iozone.xls -f /testdir/iotest -az -i0 -i1 -i2 -o -p -I -g 32m > /root/results/${fs}/${disk}/iozone.data
    sync
    END="`date +%s.%N`"
    echo "$END - $START" | bc > /root/results/${fs}/${disk}/iozone.time

    sync && echo 3 > /proc/sys/vm/drop_caches && echo 3 > /proc/sys/vm/drop_caches
      fileop -e -s 1M -f 16 -t -d /testdir > /root/results/${fs}/${disk}/fileop.data
    sync

    if [ "$fs" = "zfs" ]; then
      zpool destroy testdir
    else
      umount /testdir
    fi
  done
done
