#!/sbin/runscript # METHOD # ------ # if /dev/ide exists, find all block devices beneath it named disc, cd, or # generic. # # for the disc and cd ones, if there is a a matching /dev/hdX symlink and # hdX_args is set in the config file, use hdX_args. otherwise, if there is a # matching /dev/discs/discX or /dev/cdroms/cdromX symlink, and discX_args or # cdromX_args is set in the config file, use discX_args / cdromX_args. finally, # if all_args is set in the config file, use that. # # for the generic ones, sort them and look for genericX_args in the config file # or use all_args. # # if /dev/ide does not exist, check the /dev/hdX entries, and see which ones # correspond to real devices by opening them for reading. then check hdX_args # and all_args in the config file. # # for each device considered, if no args are found in the config file, do not # run hdparm. depend() { before bootmisc } do_hdparm() { local e= eval e=\$${extra_args} [ -z "${args}${all_args}${e}" ] && return 0 if [ -n "${args:=${all_args} ${e}}" ] ; then local orgdevice=$(readlink -f "${device}") if [ -b "${orgdevice}" ] ; then ebegin "Running hdparm on ${device}" hdparm ${args} "${device}" > /dev/null eend $? fi fi } scan_devfs() { local extra_args="pata_all_args" device= alias= args= # devfs compatible systems for device in $(find /dev/ide -name disc) ; do args='' for alias in /dev/hd? ; do if [ "${alias}" -ef "${device}" ] ; then device=${alias} eval args=\$"$(basename "${alias}")"_args break fi done if [ -z "$args" ] ; then for alias in /dev/discs/* ; do if [ "${alias}"/disc -ef "${device}" ]; then device="${alias}/disc" eval args=\$"$(basename "${alias}")"_args break fi done fi do_hdparm done for device in $(find /dev/ide -name cd) ; do args='' for alias in /dev/hd? ; do if [ "${alias}" -ef "${device}" ] ; then device=${alias} eval args=\$"$(basename "${alias}")"_args break fi done if [ -z "$args" ] ; then for alias in /dev/cdroms/* ; do if [ "${alias}" -ef "${device}" ] ; then device=${alias} eval args=\$"$(basename "${alias}")"_args break fi done fi do_hdparm done local count=0 # of course, the sort approach would fail here if any of the # host/bus/target/lun numbers reached 2 digits.. for device in $(find /dev/ide -name generic | sort) ; do eval args=\$generic${count}_args do_hdparm count=$((${count} + 1)) done } scan_nondevfs() { # non-devfs compatible system for device in /dev/hd* /dev/sd* ; do [ -e "${device}" ] || continue case "${device}" in *[0-9]) continue ;; /dev/hd*) extra_args="pata_all_args" ;; /dev/sd*) extra_args="sata_all_args" ;; *) extra_args="" ;; esac # check that the block device really exists by # opening it for reading local errmsg= status= nomed=1 errmsg=$(export LC_ALL=C ; : 2>&1 <"${device}") status=$? case ${errmsg} in *": No medium found") nomed=0;; esac if [ -b "${device}" ] && [ "${status}" = "0" -o "${nomed}" = "0" ] ; then local conf_var="${device##*/}_args" eval args=\$${conf_var} do_hdparm fi done } start() { if get_bootparam "nohdparm" ; then ewarn "Skipping hdparm init as requested in kernel cmdline" return 0 fi if [ -e /dev/.devfsd -a -d /dev/ide ] ; then scan_devfs else scan_nondevfs fi }