1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
|
#!/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
}
|