#!/sbin/runscript
# Copyright 1999-2013 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
# $Header: /var/cvsroot/gentoo-x86/sys-fs/lvm2/files/lvm.rc-2.02.95-r2,v 1.2 2013/04/09 11:00:26 ssuominen Exp $

depend() {
	use dmeventd
	before checkfs fsck
	after dmeventd modules device-mapper
}

config='global { locking_dir = "/run/lock/lvm" }'

dm_in_proc() {
	local retval=0
	for x in devices misc ; do
		grep -qs 'device-mapper' /proc/${x}
		retval=$((${retval} + $?))
	done
	return ${retval}
}

start() {
	# LVM support for /usr, /home, /opt ....
	# This should be done *before* checking local
	# volumes, or they never get checked.
	
	# NOTE: Add needed modules for LVM or RAID, etc
	#       to /etc/modules.autoload if needed
	for lvm_path in /bin/lvm /sbin/lvm ; do
		[ -x "$lvm_path" ] && break
	done
	if [ ! -x "$lvm_path" ]; then
		eerror "Cannot find lvm binary in /sbin or /bin!"
		return 1
	fi
	if [ -z "${CDBOOT}" ] ; then
		if [ -e /proc/modules ] && ! dm_in_proc ; then
			modprobe dm-mod 2>/dev/null
		fi
		if [ -d /proc/lvm ] || dm_in_proc ; then
			ebegin "Setting up the Logical Volume Manager"
			#still echo stderr for debugging
			lvm_commands="#! ${lvm_path} --config '${config}'\n"
			# Extra PV find pass because some devices might not have been available until very recently
			lvm_commands="${lvm_commands}pvscan\n"
			# Now make the nodes
			lvm_commands="${lvm_commands}vgscan --mknodes\n"
			# And turn them on!
			lvm_commands="${lvm_commands}vgchange --sysinit -a ly\n"
			# Order of this is important, have to work around dash and LVM readline
			printf "%b\n" "${lvm_commands}" | $lvm_path /proc/self/fd/0 --config "${config}" >/dev/null
			eend $? "Failed to setup the LVM"
		fi
	fi
}

stop() {
	for lvm_path in /bin/lvm /sbin/lvm ; do
		[ -x "$lvm_path" ] && break
	done
	if [ ! -x "$lvm_path" ]; then
		eerror "Cannot find lvm binary in /sbin or /bin!"
		return 1
	fi
# Stop LVM2
if [ -x /sbin/vgs ] && \
   [ -x /sbin/vgchange ] && \
   [ -x /sbin/lvchange ] && \
   [ -f /etc/lvmtab -o -d /etc/lvm ] && \
   [ -d /proc/lvm  -o "`grep device-mapper /proc/misc 2>/dev/null`" ]
then
	einfo "Shutting down the Logical Volume Manager"
	

        VGS=$($lvm_path vgs --config "${config}" -o vg_name --noheadings --nosuffix 2> /dev/null)

        if [ "$VGS" ]
        then
            ebegin "  Shutting Down LVs & VGs"
			#still echo stderr for debugging
			lvm_commands="#! ${lvm_path} --config '${config}'\n"
			# Extra PV find pass because some devices might not have been available until very recently
			lvm_commands="${lvm_commands}lvchange --sysinit -a ln ${VGS}\n"
			# Now make the nodes
			lvm_commands="${lvm_commands}vgchange --sysinit -a ln\n"
			# Order of this is important, have to work around dash and LVM readline
			printf "%b\n" "${lvm_commands}" | $lvm_path /proc/self/fd/0 --config "${config}" >/dev/null
			eend $? "Failed"
        fi

	einfo "Finished Shutting down the Logical Volume Manager"
fi
}

# vim:ts=4
