#!/bin/bash
# umount volume from /vasm
# kill process if any have an open file on volume
#
# 
# Note: Linux version

FUSER=/sbin/fuser
UMOUNT=/bin/umount
FS_TIMEOUT=4
vol=$1

signal_processes() {
        local dir=$1
        local sig=$2
        $FUSER -$sig -m -k "$dir/.vasm-info" >/dev/null 2>&1
}

is_mounted() {
	local mount_point=$1
	[ -z "$mount_point"  ] && return 1
	[ $mount_point = '/' ] && return 1
	grep -q " $mount_point " /proc/mounts
}

fs_stop() {
        local SUB=$1 timeout=$2 sig cnt
        for sig in TERM KILL; do
                cnt=$((timeout/2)) # try half time with TERM
                while [ $cnt -gt 0 ]; do
                        $UMOUNT $SUB >/dev/null 2>&1 && return 0
                        signal_processes $SUB $sig
                        cnt=$((cnt-1))
                        sleep 1
                done
        done
        return 1
}

# MAIN ===================================================

[ -z "$vol" ] && {
  echo
  echo "usage: $0 uuid"
  echo
  exit 1
}

[ $vol = '<all>' ] && {                  # unmount all
  for mnt in `ls -d /vasm/*-*-*-*-*`
  do
    is_mounted $mnt && fs_stop $mnt $FS_TIMEOUT
  done
  exit 0
}

[ -d "/vasm/$vol" ] || {
  echo
  echo "mount point /vasm/$vol is not found"
  echo
  exit 2
}

is_mounted /vasm/$vol || exit 0

fs_stop /vasm/$vol $FS_TIMEOUT

