#!/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

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|"")
		echo "Setting up LVM Volume Groups..."
		create_lvm_device
		create_dm_device
                test `/sbin/lvmiopversion` != "0" || exit 0
                
		IGNORELOCKINGFAILURES=""
		MKNODES=""
                test `/sbin/lvmiopversion` -ge "200" && test -x /lib/lvm-200/lvm && IGNORELOCKINGFAILURES="--ignorelockingfailure" && MKNODES="--mknodes"
                /sbin/vgscan $IGNORELOCKINGFAILURES $MKNODES || true
                /sbin/vgchange -a y $IGNORELOCKINGFAILURES
		# 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
		;;
	
	stop)
		echo "Shutting down LVM Volume Groups... "
		if test `/sbin/lvmiopversion` -ge 200 -a -x /lib/lvm-200/lvm; then
			/sbin/vgchange --ignorelockingfailure -a n
       		else
			[ -e /etc/lvmtab ] && /sbin/vgchange -a n
        	fi
		;;

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