If state of a watchdog device is changed by an user after kdumpctl restart
then initramfs must be rebuilt on the basis of new watchdog status.
Testing:
-------------------------------------------------------
Initramfs wdt state
Prev Current Result
-------------------------------------------------------
Not Exist NA X Rebuild
Exist Inact Inact No Rebuild
Exist Inact Act Force Rebuild
Exist Act Inact Force Rebuild
Exist Act Act(Same wdt) No Rebuild
Exist Act Act(Diff wdt) Force Rebuild
Exist Act Module Removed Force Rebuild
Signed-off-by: Pratyush Anand <panand(a)redhat.com>
Acked-by: Dave Young <dyoung(a)redhat.com>
---
kdumpctl | 40 ++++++++++++++++++++++++++++++++++++++++
1 file changed, 40 insertions(+)
diff --git a/kdumpctl b/kdumpctl
index c8fc54fc7677..0436bfc6c73b 100755
--- a/kdumpctl
+++ b/kdumpctl
@@ -427,6 +427,40 @@ check_dump_fs_modified()
return 1
}
+check_wdt_modified()
+{
+ is_wdt_mod_omitted
+ [[ $? -eq 0 ]] && return 0
+ [[ -d /sys/class/watchdog/ ]] || return 0
+
+ for dir in /sys/class/watchdog/*; do
+ [[ -d "$dir" ]] || continue
+ [[ -f "$dir/state" ]] || continue
+ wdtdrv=$(< "$dir/device/modalias")
+ wdtdrv=$(modinfo $wdtdrv | grep filename | awk -F"kernel/" '{print
$2}')
+ active=$(< "$dir/state")
+ # rebuild when:
+ # module for this watchdog is not found and watchdog is active
+ # module for this watchdog is found and watchdog is inactive
+ lsinitrd $TARGET_INITRD | grep $wdtdrv &> /dev/null
+ if [ $? -ne 0 ]; then
+ [[ "$active" = "active" ]] && return 1
+ else
+ [[ "$active" = "inactive" ]] && return 1
+ fi
+ done
+
+ # check if watchdog kernel module unloaded.
+ loaded_mods=$(lsinitrd $TARGET_INITRD -f etc/cmdline.d/00-watchdog.conf)
+ [[ -n $loaded_mods ]] && loaded_mods=$(echo $loaded_mods | awk
-F"rd.driver.pre=" '{print $2}' | sed "s/,/ /g")
+ for mod in $loaded_mods ; do
+ lsmod | grep $mod &> /dev/null
+ [[ $? != 0 ]] && return 1
+ done
+
+ return 0
+}
+
# returns 0 if system is not modified
# returns 1 if system is modified
# returns 2 if system modification is invalid
@@ -448,6 +482,12 @@ check_system_modified()
return $ret
fi
+ check_wdt_modified
+ if [ $? -ne 0 ]; then
+ echo "Detected change in watchdog state"
+ return 1
+ fi
+
return 0
}
--
2.5.5