#!/bin/bash

set -e

ROOT=mount
DEV=container_mount/pv1

rm -f container
rm -fr container_mount
rm -fr mount

mkdir -p container_mount

# create a container fs that can hold a 5T sparse file
truncate -s 3G container
/sbin/mke2fs -t ext4 -O \
  none,has_journal,ext_attr,dir_index,filetype,extent,64bit,flex_bg,sparse_super,large_file,huge_file,dir_nlink,extra_isize,metadata_csum \
  -b 4096 container

#fuse2fs -o fakeroot -o lockfile container container_mount
fuse2fs -o fakeroot -o lockfile=container.inuse container container_mount

mkdir -p "$ROOT"

echo "truncate $(date)"
time truncate -s 5T "${DEV}"

echo "mke2fs $(date)"
time /sbin/mkfs.ext4 -N 1000000 -O \
  none,has_journal,ext_attr,dir_index,filetype,extent,64bit,flex_bg,sparse_super,large_file,huge_file,dir_nlink,extra_isize,metadata_csum \
  -b 1024 "$DEV"

echo "fuse2fs ${DEV} ${ROOT} $(date)"
#time fuse2fs -o fakeroot -o lockfile "$DEV" "$ROOT"
time fuse2fs -o fakeroot -o lockfile="$DEV.inuse" "$DEV" "$ROOT"

echo "make filler $(date) - this is slow"
time fallocate -l 4294967295K "${ROOT}/filler"

echo "fusermount -u $ROOT $(date)"
time fusermount -u "$ROOT"

#while [[ -f "${DEV}.lck" ]]; do
while [[ -f "${DEV}.inuse" ]]; do
  sleep 10
  echo "Waiting for fuse to complete"
done

echo "fuse2fs ${DEV} ${ROOT} $(date)"
#time fuse2fs -o fakeroot -o lockfile "$DEV" "$ROOT"
time fuse2fs -o fakeroot -o lockfile="$DEV.inuse" "$DEV" "$ROOT"

echo "rm filler $(date) - this is slow"
time rm "${ROOT}/filler"

echo "fusermount -u $ROOT $(date)"
time fusermount -u "$ROOT"

#while [[ -f "${DEV}.lck" ]]; do
while [[ -f "${DEV}.inuse" ]]; do
  sleep 10
  echo "Waiting for fuse to complete"
done

fusermount -u container_mount

#while [[ -f container.lck ]]; do
while [[ -f container.inuse ]]; do
  echo "Waiting for container fuse"
  sleep 10
done

rm container
rmdir $ROOT
rmdir container_mount

exit 0
