#!/bin/bash
#
# lvm		This script handles the LVM startup/shutdown
#		so that LVMs are properly configured and available.
#

# try to load module in case that hasn't been done yet
modprobe lvm >/dev/null 2>&1
modprobe lvm-mod >/dev/null 2>&1
modprobe dm-mod >/dev/null 2>&1

set -e

. /lib/lsb/init-functions
. /etc/default/rcS

test -x /sbin/lvmiopversion -a -x /sbin/vgscan -a -x /sbin/vgchange || exit 0
test -f /etc/default/lvm-common && . /etc/default/lvm-common

# So much for being "LVM independant" :(
create_lvm_device()
{
    mknod --mode=600 /dev/lvm c 109 0 >/dev/null 2>&1 || true
}

create_dm_device()
{
    dm_dir="/dev/mapper"
    dm_file="$dm_dir/control"

    if [ ! -f /dev/.devfsd ] && [ `/sbin/lvmiopversion` -ge 200 ]
    then
        major=$(grep "[0-9] misc$" /proc/devices | sed 's/[ ]\+misc//')
        minor=$(grep "[0-9] device-mapper$" /proc/misc | sed 's/[ ]\+device-mapper//')
        test -d $dm_dir || mkdir --mode=755 $dm_dir >/dev/null 2>&1
        test -c $dm_file -o -z "$major" -o -z "$minor" || mknod --mode=600 $dm_file c $major $minor >/dev/null 2>&1
     fi 
}

case "$1" in
	start|"")
		log_begin_msg "Setting up LVM Volume Groups..."
		create_lvm_device
		create_dm_device
                test `/sbin/lvmiopversion` != "0" || ( log_end_msg 0 ; exit 0 )
		IGNORELOCKINGFAILURES=""
		MKNODES=""
                test `/sbin/lvmiopversion` -ge "200" && test -x /lib/lvm-200/lvm && IGNORELOCKINGFAILURES="--ignorelockingfailure" && MKNODES="--mknodes"
		if [ "$VERBOSE" != no ]; then
			/sbin/vgscan $IGNORELOCKINGFAILURES $MKNODES || true
	                /sbin/vgchange -a y $IGNORELOCKINGFAILURES
		else
			/sbin/vgscan $IGNORELOCKINGFAILURES $MKNODES >/dev/null 2>&1 || true
	                /sbin/vgchange -a y $IGNORELOCKINGFAILURES >/dev/null 2>&1
		fi
		# Set permissions from /etc/default/lvm-common
		for MODEVAR in ${!MODE_*}; do
                        eval MODE=\$$MODEVAR
                        DEV=${MODEVAR//_/\/}
                        DEV="/dev/${DEV#MODE\/}"
                        MOD=${MODE#* }
                        OWN=${MODE% *}
                        chmod $MOD $DEV
                        chown --dereference $OWN $DEV
                done
		log_end_msg $?
		;;
	
	stop)
		log_begin_msg "Shutting down LVM Volume Groups... "
		if test `/sbin/lvmiopversion` -ge 200 -a -x /lib/lvm-200/lvm; then
			if [ "$VERBOSE" != no ]; then
				/sbin/vgchange --ignorelockingfailure -a n
			else
				/sbin/vgchange --ignorelockingfailure -a n >/dev/null 2>&1
			fi
       		else
			if [ "$VERBOSE" != no ]; then
				[ -e /etc/lvmtab ] && /sbin/vgchange -a n
			else
				[ -e /etc/lvmtab ] && /sbin/vgchange -a n >/dev/null 2>&1
			fi
        	fi
		log_end_msg $?
		;;

	restart|force-reload)
		$0 stop
		sleep 3
		$0 start
		;;
	
	*)
		log_success_msg "Usage: lvm {start|stop|force-reload}"
		exit 1
		;;
esac
