# 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
}