#!/bin/sh
# $NetBSD$

# BEFORE: fsck

$_rc_subr_loaded . /etc/rc.subr

name="drivecache"
rcvar=$name
start_cmd="drivecache_start"
stop_cmd=":"

# Options:
# Set drivecache_flags to OFF to force write caches off
# Set drivecache_list to list of drives to alter

check_dup()
{
	local item search
	item="$1"
	shift
	for search in $*
	do
		[ "$item" = "$search" ] && return 1
	done
	return 0
}

drivecache_start()
{
	# We are running before mount_critlocal, so we might not have access
	# to /usr for awk, sed, grep, etc.
	case "$drivecache_flags" in
	[oO][fF][fF])
		action="disabled"
		cachetype="r"
		;;
	*)
		action="enabled"
		cachetype="rw"
		;;
	esac
	
	disk_action=""
	disk_noaction=""
	disk_nocache=""
	if [ -z "$drivecache_list" ]; then
		drivecache_list="sd* wd*"
	fi

	list=""
	for atom in $drivecache_list
	do
		for disk in  $(/sbin/sysctl -n hw.disknames)
		do
			case "$disk" in
			$atom)
				if check_dup "$disk" $list; then
					list="$list${list:+ }$disk"
				fi
				;;
			esac
		done
	done

	for disk in $list
	do
		current=$(dkctl $disk getcache)
		enabled="n"
		case "$current" in
		*"write-back cache enabled"*)
			enabled="y"
			;;
		esac
		# Skip if no change
		if [ "$enabled" = y -a "$action" = enabled ]; then
			disk_noaction="${disk_noaction} $disk"
			continue
		fi
		if [ "$enabled" = n -a "$action" = disabled ]; then
			disk_noaction="${disk_noaction} $disk"
			continue
		fi

		# Check cache setting is changeable
		case "$current" in
		*"write cache enable is changeable"*)
			disk_action="${disk_action} $disk"
			dkctl $disk setcache $cachetype
			;;
		*)
			disk_nocache="${disk_nocache} $disk"
			;;
		esac
	done
	if [ -n "$disk_noaction" ]; then
		echo "Write-cache already $action on:$disk_noaction"
	fi
	if [ -n "$disk_action" ]; then
		echo "Write-cache force $action on:$disk_action"
	fi
	if [ -n "$disk_nocache" ]; then
		echo "Write-cache cannot be $action on:$disk_nocache"
	fi
}

load_rc_config $name
run_rc_command "$1"
