Browse Source
In some cases, user only want to include the watchdog module, not the wdctl or any other userspace helper. For example, systemd have a RebootWatchdogSec option that use watchdog to prevent reboot hangs. And it can help prevent machines hangs when reboot directly within the initramfs stage. So split the module installation to a standlone module. Also when watchdog-module get included, install driver for all loaded watchdog instaed of only install driver for active watchdog. Both watchdog and watchdog-module return 255 in check(), so it's enabled only when manually included, the watchdog may get configured/activated later. Signed-off-by: Kairui Song <kasong@redhat.com>master


2 changed files with 63 additions and 48 deletions
@ -0,0 +1,61 @@ |
|||||||
|
#!/bin/bash |
||||||
|
|
||||||
|
# called by dracut |
||||||
|
check() { |
||||||
|
return 255 |
||||||
|
} |
||||||
|
|
||||||
|
# called by dracut |
||||||
|
depends() { |
||||||
|
return 0 |
||||||
|
} |
||||||
|
|
||||||
|
# called by dracut |
||||||
|
install() { |
||||||
|
return 0 |
||||||
|
} |
||||||
|
|
||||||
|
installkernel() { |
||||||
|
local -A _drivers |
||||||
|
local _alldrivers _wdtdrv _wdtppath _dir |
||||||
|
[[ -d /sys/class/watchdog/ ]] || return |
||||||
|
for _dir in /sys/class/watchdog/*; do |
||||||
|
[[ -d "$_dir" ]] || continue |
||||||
|
[[ -f "$_dir/state" ]] || continue |
||||||
|
# device/modalias will return driver of this device |
||||||
|
_wdtdrv=$(< "$_dir/device/modalias") |
||||||
|
# There can be more than one module represented by same |
||||||
|
# modalias. Currently load all of them. |
||||||
|
# TODO: Need to find a way to avoid any unwanted module |
||||||
|
# represented by modalias |
||||||
|
_wdtdrv=$(modprobe --set-version "$kernel" -R $_wdtdrv 2>/dev/null) |
||||||
|
if [[ $_wdtdrv ]]; then |
||||||
|
instmods $_wdtdrv |
||||||
|
for i in $_wdtdrv; do |
||||||
|
_drivers[$i]=1 |
||||||
|
done |
||||||
|
fi |
||||||
|
# however in some cases, we also need to check that if there is |
||||||
|
# a specific driver for the parent bus/device. In such cases |
||||||
|
# we also need to enable driver for parent bus/device. |
||||||
|
_wdtppath=$(readlink -f "$_dir/device") |
||||||
|
while [[ -d "$_wdtppath" ]] && [[ "$_wdtppath" != "/sys" ]]; do |
||||||
|
_wdtppath=$(readlink -f "$_wdtppath/..") |
||||||
|
[[ -f "$_wdtppath/modalias" ]] || continue |
||||||
|
|
||||||
|
_wdtdrv=$(< "$_wdtppath/modalias") |
||||||
|
_wdtdrv=$(modprobe --set-version "$kernel" -R $_wdtdrv 2>/dev/null) |
||||||
|
if [[ $_wdtdrv ]]; then |
||||||
|
instmods $_wdtdrv |
||||||
|
for i in $_wdtdrv; do |
||||||
|
_drivers[$i]=1 |
||||||
|
done |
||||||
|
fi |
||||||
|
done |
||||||
|
done |
||||||
|
# ensure that watchdog module is loaded as early as possible |
||||||
|
_alldrivers="${!_drivers[*]}" |
||||||
|
[[ $_alldrivers ]] && echo "rd.driver.pre=${_alldrivers// /,}" > ${initdir}/etc/cmdline.d/00-watchdog.conf |
||||||
|
|
||||||
|
return 0 |
||||||
|
} |
Loading…
Reference in new issue