#!/bin/ash
# prepare usb disk for safe removal
# Copyright (C) James Budiono 2012
# License: GNU GPL Version 3 or later
#
# see here: http://elliotli.blogspot.com.au/2009/01/safely-remove-usb-hard-drive-in-linux.html
# adapted from https://raw.github.com/liyan/suspend-usb-device/master/suspend-usb-device
#
# $1 is partition (or device if it is in "superfloppy" mode)
# return true if successful, or false if not
# if called with non-usb disk, it will always be successful
#
[ -z $1 ] && {
	echo "Usage: $0 [disk|partition]"
	exit 1
}

# 1. starting point
devpath=$(readlink -f /sys/class/block/$1)

# 2. check device is usb device - exit otherwise
case "$devpath" in */usb*) ;; *) exit 0 ;; esac

# 3. find the block device
while [ ! -e "$devpath/../../block" ]; do
	devpath=${devpath%/*}
done
blockdev=${devpath##*/}
#echo $blockdev

# 4. check whether it is mounted - bail out if it is
grep -E "^/dev/$1|^/dev/$blockdev" /proc/mounts > /dev/null && {
	echo "$1 or $blockdev is still mounted."
	exit 1
}

# 5. get the scsi host
while [ ! -e "$devpath/scsi_host" ]; do
	devpath=${devpath%/*}
done

# 7. get the grandparent of scsi_host - this is the usb device 
devpath=${devpath%/*}
devpath=${devpath%/*}
#echo $devpath

# 8. from usb device get the usb-device-id
devid=${devpath##*/}
#echo $devid 

################ action time
# 9. send sdparm
sdparm -C sync /dev/$blockdev
sdparm -C stop /dev/$blockdev

# 10. unbind
echo $devid > /sys/bus/usb/drivers/usb/unbind

# 11. if possible, suspend power
[ -e $devpath/power/level ] && echo 'suspend' > $devpath/power/level

exit 0
