#!/bin/sh

# the following is the LSB init header see
# http://www.linux-foundation.org/spec//booksets/LSB-Core-generic/LSB-Core-generic.html#INITSCRCOMCONV
#
# Flashcache initscript
# (C) 2012 Phattanon Duangdara <sfalpha@gmail.com>
# This work is licensed under the Creative Commons Attribution-ShareAlike 3.0 Unported License.
# To view a copy of this license, visit http://creativecommons.org/licenses/by-sa/3.0/.
#
### BEGIN INIT INFO
# Provides: flashcachehome
# Default-Start: 3 4 5
# Short-Description: Setup flashcachehome
# Description: Setup flashcachehome
### END INIT INFO

# the following is chkconfig init header
#
# flashcachehome:   initlize flashcacchhomee
#
# chkconfig: 345 90 10
# Description: Setup flashcachehome
#

# Source function library.
. /etc/rc.d/init.d/functions

SERVICE=flashcachehome
SUBSYS_LOCK="/var/lock/subsys/$SERVICE"

FLASHCACHE_LOAD=/sbin/flashcache_load
FLASHCACHE_CREATE=/sbin/flashcache_create
DMSETUP=`/usr/bin/which dmsetup`
LVM=`/usr/bin/which lvm`

FLASHCACHE_MODE="writethrough"
FLASHCACHE_NAME="sdc1+sda2"
FLASHCACHE_DEV="cachedev_home"
FLASHCACHE_CACHE_DEV="/dev/sdc1"
FLASHCACHE_BACKEND_DEV="/dev/sda2"
FLASHCACHE_LVM=
FLASHCACHE_MOUNT=/home
FLASHCACHE_SKIP_THRESH_KB=64
FLASHCACHE_RECLAIM_POLICY=1

test -f /etc/sysconfig/$SERVICE && . /etc/sysconfig/$SERVICE

start() {   
    echo -n $"Starting flashcache: "

    /sbin/modprobe flashcache
    RETVAL=$?
    if [ $RETVAL -ne 0 ]; then
        echo $"Error loading flashcache kernel module"
        return -1
    fi

    if [ "$FLASHCACHE_MODE" = "writeback" ]; then	
    	$FLASHCACHE_LOAD $FLASHCACHE_CACHE_DEV $FLASHCACHE_DEV
    elif [ "$FLASHCACHE_MODE" = "writearound" ]; then
        $FLASHCACHE_CREATE -p around $FLASHCACHE_DEV $FLASHCACHE_CACHE_DEV $FLASHCACHE_BACKEND_DEV
    elif [ "$FLASHCACHE_MODE" = "writethrough" ]; then
        $FLASHCACHE_CREATE -p thru $FLASHCACHE_DEV $FLASHCACHE_CACHE_DEV $FLASHCACHE_BACKEND_DEV
    else
        echo $"FLASHCACHE_MODE not set or invalid"
        return -1
    fi
    RETVAL=$?
    [ "$RETVAL" -eq 0 ] && success || failure
    
    echo $FLASHCACHE_SKIP_THRESH_KB > /proc/sys/dev/flashcache/$FLASHCACHE_NAME/skip_seq_thresh_kb
    echo $FLASHCACHE_RECLAIM_POLICY > /proc/sys/dev/flashcache/$FLASHCACHE_NAME/reclaim_policy

    if [ -n "$FLASHCACHE_LVM" ]; then
	echo -n $"Starting flashcache LVM $FLASHCACHE_LVM:"
        $LVM vgscan > /dev/null 2>&1
        $LVM vgchange -ay $FLASHCACHE_LVM > /dev/null 2>&1
    	RETVAL2=$?
        [ "$RETVAL2" -eq 0 ] && success || failure
    fi

    if [ -n "$FLASHCACHE_MOUNT" ]; then
	echo -n $"Mount flashcache $FLASHCACHE_MOUNT:"
        /bin/mount /dev/mapper/$FLASHCACHE_DEV $FLASHCACHE_MOUNT
    	RETVAL2=$?
        [ "$RETVAL2" -eq 0 ] && success || failure
    fi

    touch $SUBSYS_LOCK

    return $RETVAL
}

stop() {
    if [ -n "$FLASHCACHE_MOUNT" ]; then
	echo -n $"Unmount flashcache $FLASHCACHE_MOUNT:"
        /bin/umount $FLASHCACHE_MOUNT
    	RETVAL2=$?
        [ "$RETVAL2" -eq 0 ] && success || failure
    fi

    if [ -n "$FLASHCACHE_LVM" ]; then
	echo -n $"Shutdown flashcache LVM $FLASHCACHE_LVM:"
        $LVM vgchange -an $FLASHCACHE_LVM > /dev/null 2>&1
    	RETVAL2=$?
        [ "$RETVAL2" -eq 0 ] && success || failure
    fi

    echo -n $"Stopping flashcache: "
    
    $DMSETUP remove $FLASHCACHE_DEV
    RETVAL=$?
    [ "$RETVAL" -eq 0 ] && success || failure

    rm -f $SUBSYS_LOCK

    return $RETVAL
}

status() {
    [ -f $SUBSYS_LOCK ] && echo "Flashcache started" || echo "Flashcache not started";
    $DMSETUP status $FLASHCACHE_DEV
    exit $?
}

restart() {
    stop
    start
}

# See how we were called.
case "$1" in
    start)
        start
    ;;
    stop)
        stop
    ;;
    restart)
        stop
        start
    ;;
    status)
        status
    ;;
    *)
        echo $"Usage: $0 {start|stop|restart|status}"
        exit 2
    ;;
esac
exit $RETVAL


