On 2016/07/21 at 02:12, Pratyush Anand wrote:
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
I think this can work pretty well:
- For modules loaded but state changes cases, we can catch it by the state checking
above,
- For modules unloaded cases, "lsmod | grep $mod" will surely catch it.
Regards,
Xunlei
+
+ 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
}