#!@SHELL@
#
# zfs-mount     This script will mount/umount the zfs filesystems.
#
# chkconfig:    2345 06 99
# description:  This script will mount/umount the zfs filesystems during
#               system boot/shutdown. Configuration of which filesystems
#               should be mounted is handled by the zfs 'mountpoint' and
#               'canmount' properties. See the zfs(8) man page for details.
#               It is also responsible for all userspace zfs services.
# probe: true
#
### BEGIN INIT INFO
# Provides:          zfs-mount
# Required-Start:    $local_fs zfs-import
# Required-Stop:     $local_fs zfs-import
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# X-Stop-After:      zfs-zed
# Short-Description: Mount ZFS filesystems and volumes
# Description: Run the `zfs mount -a` or `zfs umount -a` commands.
### END INIT INFO
#
# Released under the 2-clause BSD license.
#
# The original script that acted as a template for this script came from
# the Debian GNU/Linux kFreeBSD ZFS packages (which did not include a
# licensing stansa) in the commit dated Mar 24, 2011:
#   https://github.com/zfsonlinux/pkg-zfs/commit/80a3ae582b59c0250d7912ba794dca9e669e605a

# Source the common init script
. @sysconfdir@/zfs/zfs-functions

# ----------------------------------------------------

chkroot() {
	while read line; do
		set -- $line
		if [ "$2" = "/" ]; then
			return 0
		fi
	done < /proc/self/mounts

	return 1
}

do_depend()
{
	# Try to allow people to mix and match fstab with ZFS in a way that makes sense.
	if [ "$(mountinfo -s /)" = 'zfs' ]
	then
		before localmount
	else
		after localmount
	fi

	# bootmisc will log to /var which may be a different zfs than root.
	before bootmisc logger

	after zfs-import sysfs
	use mtab
	keyword -lxc -openvz -prefix -vserver
}

# Mount all datasets/filesystems
do_mount()
{
	local verbose overlay i mntpt val

	check_boolean "$VERBOSE_MOUNT" && verbose=v
	check_boolean "$DO_OVERLAY_MOUNTS" && overlay=O

	zfs_action "Mounting ZFS filesystem(s)" \
	    "$ZFS" mount -a$verbose$overlay "$MOUNT_EXTRA_OPTIONS"

	# Require each volume/filesystem to have 'noauto' and no fsck
	# option. This shouldn't really be necessary, as long as one
	# can get zfs-import to run sufficiently early on in the boot
	# process - before local mounts. This is just here in case/if
	# this isn't possible.
	check_boolean "$VERBOSE_MOUNT" && \
	    zfs_log_begin_msg "Mounting volumes and filesystems registered in fstab"

	read_mtab  "^/dev/(zd|zvol)"
	read_fstab "^/dev/(zd|zvol)"
	i=0; var=$(eval echo FSTAB_$i)
	while [ -n "$(eval echo "$""$var")" ]
	do
		mntpt=$(eval echo "$""$var")
		dev=$(eval echo "$"FSTAB_dev_$i)
		if ! in_mtab "$mntpt" && ! is_mounted "$mntpt" && [ -e "$dev" ]
		then
			check_boolean "$VERBOSE_MOUNT" && \
				zfs_log_progress_msg "$mntpt "
			fsck "$dev" && mount "$mntpt"
		fi

		i=$((i + 1))
		var=$(eval echo FSTAB_$i)
	done

	read_mtab  "[[:space:]]zfs[[:space:]]"
	read_fstab "[[:space:]]zfs[[:space:]]"
	i=0; var=$(eval echo FSTAB_$i)
	while [ -n "$(eval echo "$""$var")" ]
	do
		mntpt=$(eval echo "$""$var")
		if ! in_mtab "$mntpt" && ! is_mounted "$mntpt"
		then
			check_boolean "$VERBOSE_MOUNT" && \
				zfs_log_progress_msg "$mntpt "
			mount "$mntpt"
		fi

		i=$((i + 1))
		var=$(eval echo FSTAB_$i)
	done
	check_boolean "$VERBOSE_MOUNT" && zfs_log_end_msg 0

	return 0
}

# Unmount all filesystems
do_unmount()
{
	local i var mntpt

	# This shouldn't really be necessary, as long as one can get
	# zfs-import to run sufficiently late in the shutdown/reboot process
	# - after unmounting local filesystems. This is just here in case/if
	# this isn't possible.
	zfs_action "Unmounting ZFS filesystems" "$ZFS" unmount -a

	check_boolean "$VERBOSE_MOUNT" && \
	    zfs_log_begin_msg "Unmounting volumes and filesystems registered in fstab"

	read_mtab  "^/dev/(zd|zvol)"
	read_fstab "^/dev/(zd|zvol)"
	i=0; var=$(eval echo FSTAB_$i)
	while [ -n "$(eval echo "$""$var")" ]
	do
		mntpt=$(eval echo "$""$var")
		dev=$(eval echo "$"FSTAB_dev_$i)
		if in_mtab "$mntpt"
		then
			check_boolean "$VERBOSE_MOUNT" && \
				zfs_log_progress_msg "$mntpt "
			umount "$mntpt"
		fi

		i=$((i + 1))
		var=$(eval echo FSTAB_$i)
	done

	read_mtab  "[[:space:]]zfs[[:space:]]"
	read_fstab "[[:space:]]zfs[[:space:]]"
	i=0; var=$(eval echo FSTAB_$i)
	while [ -n "$(eval echo "$""$var")" ]
	do
		mntpt=$(eval echo "$""$var")
		if in_mtab "$mntpt"; then
			check_boolean "$VERBOSE_MOUNT" && \
			    zfs_log_progress_msg "$mntpt "
			umount "$mntpt"
		fi

		i=$((i + 1))
		var=$(eval echo FSTAB_$i)
	done
	check_boolean "$VERBOSE_MOUNT" && zfs_log_end_msg 0

	return 0
}

do_start()
{
	check_boolean "$ZFS_MOUNT" || exit 0

	check_module_loaded "zfs" || exit 0

	# Ensure / exists in /proc/self/mounts.
	# This should be handled by rc.sysinit but lets be paranoid.
	if ! chkroot
	then
		mount -f /
	fi

	do_mount
}

do_stop()
{
	check_boolean "$ZFS_UNMOUNT" || exit 0

	check_module_loaded "zfs" || exit 0

	do_unmount
}

# ----------------------------------------------------

if [ ! -e /sbin/openrc-run ]
then
	case "$1" in
		start)
			do_start
			;;
		stop)
			do_stop
			;;
		force-reload|condrestart|reload|restart|status)
			# no-op
			;;
		*)
			[ -n "$1" ] && echo "Error: Unknown command $1."
			echo "Usage: $0 {start|stop}"
			exit 3
			;;
	esac

	exit $?
else
	# Create wrapper functions since Gentoo don't use the case part.
	depend() { do_depend; }
	start() { do_start; }
	stop() { do_stop; }
fi
