#!/bin/sh set -e #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 ;; *) echo "Usage: $MYNAME {stop|start|restart|reload|force-reload}" >&2 exit 3 ;; esac if [ "$FORCE_RUN" != 'yes' ]; then if grep -w -q "nohdparm" /proc/cmdline ; then report "*** Skipping setup of disc parameters. ***" 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 report_error "*** RAID status not OK. Exiting. ***" exit 0 fi fi echo -n "Setting parameters of disc:" 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 } ITEMS_ECHOED=no # 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 if [ "$ITEMS_ECHOED" = yes ] ; then echo -n ", $drive" else echo -n " $drive" ITEMS_ECHOED=yes fi 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 ;; ROOTFS) ROOTFS=$VALUE ;; *) report_error_and_exit "unknown option $KEY" ;; esac ;; "") case $KEY in '}') if [ -z "$DISC" ]; then if [ "$WAS_RUN" != '1' ]; then report_error_and_exit "No disk enabled. Exiting" fi fi if [ -n "$OPTIONS" ]; then if [ -b "$DISC" ]; then if [ -n "$ROOTFS" ]; then if [ "$FIRST" = 'yes' -a "$DISC" != "$ROOTFS" ]; then continue fi if [ "$FIRST" = 'no' -a "$DISC" = "$ROOTFS" ]; then continue fi fi # Flush the drive's internal write cache to the disk. /sbin/hdparm -q -f $DISC /sbin/hdparm $OPTIONS $DISC if [ "$ITEMS_ECHOED" = yes ] ; then echo -n ", $DISC" else echo -n " $DISC" ITEMS_ECHOED=yes fi fi 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 ;; *) report_error_and_exit "unknown option $KEY" ;; esac ;; *) report_error_and_exit "unknown separator $SEP" ;; esac else $KEY $SEP $VALUE NEXT_LINE=no-go WAS_RUN=1 fi done if [ "$ITEMS_ECHOED" = yes ] ; then echo "." else echo " (none)." fi }