#!/bin/sh
set -e
. /lib/lsb/init-functions
. /etc/default/rcS
#In certian cases you may wish to run this script twice. Once at S07
#and once later in the boot process. If you do this call /etc/init.d/hdparm
#again from rcS.d with a name such as S27hdparm.second.
#
#See /usr/share/doc/hdparm/README.Debian for more details.
case "$0" in
*hdparm)
FIRST=yes
;;
*)
FIRST=no
;;
esac
MYNAME="$0"
report()
{
echo "${MYNAME}: $*"
}
report_error()
{
echo "${MYNAME}: Error: $*" >&2
}
report_error_and_exit()
{
report_error "$*. Exiting."
exit 1
}
case $1 in
start|restart|reload|force-reload)
;;
stop)
exit 0
;;
*)
log_success_msg "Usage: $0 {stop|start|restart|reload|force-reload}"
exit 1
;;
esac
if grep -w -q "nohdparm" /proc/cmdline ; then
log_success_msg "Skipping setup of disc parameters as specified..."
exit 0
fi
raidstat=OK
if [ -e /proc/mdstat ]; then
if grep -iq resync /proc/mdstat; then
raidstat=RESYNC
fi
elif [ -e /proc/rd/status ]; then
raidstat=`cat /proc/rd/status`
fi
if ! [ "$raidstat" = 'OK' ]; then
log_warning_msg "RAID status not OK. Exiting."
exit 0
fi
log_begin_msg "Setting disc parameters..."
DISC=
DEFAULT=
OPTIONS=
DEF_QUIET=
OPT_QUIET=
# set_option() adds $1 to the $OPTIONS list if in a disk stanza
# and adds $1 to the $DEFAULT list if not in a disk stanza
#
# the block beginning:
# if test x${i%${i#??}} != x${1%${1#??}}; then
# checks to see if $1 is already in the list and
# if so removes the first instance
set_option()
{
if test -n "$DISC"; then
NEW_OPT=
for i in $OPTIONS; do
if test x${i%${i#??}} != x${1%${1#??}}; then
NEW_OPT="$NEW_OPT $i"
else
NEW_OPT=${NEW_OPT%-q}
fi
done
OPTIONS="$NEW_OPT $OPT_QUIET $1"
else
NEW_DEF=
for i in $DEFAULT; do
if test x${i%${i#??}} != x${1%${1#??}}; then
NEW_DEF="$NEW_DEF $i"
else
NEW_DEF=${NEW_DEF%-q}
fi
done
DEFAULT="$NEW_DEF $DEF_QUIET $1"
fi
}
eval_value()
{
case $1 in
off|0)
set_option "$2"0
;;
on|1)
set_option "$2"1
;;
*)
return 1
;;
esac
}
# Get blocks as far as the drive's write cache.
/bin/sync
# Set options for a group of disks in /etc/default/hdparm
[ -e /etc/default/hdparm ] && . /etc/default/hdparm
if [ -n "$harddisks" -a -n "$hdparm_opts" ]; then
for drive in $harddisks; do
/sbin/hdparm -q -f $drive
hdparm -q $hdparm_opts -q $drive
[ "$VERBOSE" != no ] && log_success_msg "Found enabled disk: $drive"
done
fi
egrep -v '^[[:space:]]*(#|$)' /etc/hdparm.conf | while read KEY SEP VALUE; do
if [ "$NEXT_LINE" != 'go' ]; then
case $SEP in
'{')
case $KEY in
command_line)
NEXT_LINE=go
unset DISC
unset OPTIONS
unset OPT_QUIET
;;
*)
DISC=$KEY
OPTIONS=$DEFAULT
OPT_QUIET=$DEF_QUIET
WAS_RUN=0
;;
esac
;;
=)
case $KEY in
read_ahead_sect)
set_option -a$VALUE
;;
lookahead)
eval_value $VALUE -A
;;
bus)
eval_value $VALUE -b
;;
apm)
set_option -B$VALUE
;;
io32_support)
set_option -c$VALUE
;;
dma)
eval_value $VALUE -d
;;
defect_mana)
eval_value $VALUE -D
;;
cd_speed)
set_option -E$VALUE
;;
mult_sect_io)
set_option -m$VALUE
;;
prefetch_sect)
set_option -P$VALUE
;;
read_only)
eval_value $VALUE -r
;;
spindown_time)
set_option -S$VALUE
;;
interrupt_unmask)
eval_value $VALUE -u
;;
write_cache)
eval_value $VALUE -W
;;
transfer_mode)
set_option -X$VALUE
;;
acoustic_management)
set_option -M$VALUE
;;
keep_settings_over_reset)
eval_value $VALUE -k
;;
keep_features_over_reset)
eval_value $VALUE -K
;;
chipset_pio_mode)
set_option -p$VALUE
;;
*)
log_failure_msg "Unknown option $KEY!"
exit 1
;;
esac
;;
"")
case $KEY in
})
if [ -z "$DISC" ]; then
if [ "$WAS_RUN" != 1 ]; then
log_failure_msg "No disk enabled. Exiting..."
exit 1
fi
fi
if [ -n "$OPTIONS" ]; then
# Flush the drive's internal write cache to the disk.
/sbin/hdparm -q -f $DISC
/sbin/hdparm $OPTIONS $DISC
[ "$VERBOSE" != no ] && log_success_msg "Found enabled disk: $DISC"
fi
;;
quiet)
if [ -n "$DISC" ]; then
OPT_QUIET=-q
else
DEF_QUIET=-q
fi
;;
standby)
set_option -y
;;
sleep)
set_option -Y
;;
disable_seagate)
set_option -Z
;;
*)
log_failure_msg "Unknown option $KEY!"
exit 1
;;
esac
;;
*)
log_failure_msg "Unknown separator $SEP!"
exit 1
;;
esac
else
$KEY $SEP $VALUE
NEXT_LINE=no-go
WAS_RUN=1
fi
done
log_end_msg 0