Hi Xunlei,
Thanks for your comment.
On 11/07/2016:08:42:49 PM, Xunlei Pang wrote:
On 2016/07/11 at 10:47, 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
>
> Signed-off-by: Pratyush Anand <panand(a)redhat.com>
> Acked-by: Dave Young <dyoung(a)redhat.com>
> ---
> kdumpctl | 32 ++++++++++++++++++++++++++++++++
> 1 file changed, 32 insertions(+)
>
> diff --git a/kdumpctl b/kdumpctl
> index c8fc54fc7677..12e7aa005c5d 100755
> --- a/kdumpctl
> +++ b/kdumpctl
> @@ -427,6 +427,32 @@ check_dump_fs_modified()
> return 1
> }
>
> +check_wdt_modified()
> +{
> + NOWDT=$(grep ^nowdt $KDUMP_CONFIG_FILE | cut -d' ' -f2)
> + [[ -z $NOWDT ]] || return 0
> + [[ -d /sys/class/watchdog/ ]] || return 0
> +
> + for dir in /sys/class/watchdog/*; do
> + [[ -d "$dir" ]] || continue
If the wdt module was unloaded leaving an empty /sys/class/watchdog/, it will hit here
and return,
then if the initramfs contains any wdt, I think we will miss a necessary rebuild.
Yes, you are right, I did not consider this test case. But not sure, how to
check that. Because, when there was not any directory in /sys/class/watchdog/,
then we must rebuild if there is any watchdog driver in kdump kernel initrd,
which is not easy to check.
So, either we need to keep a variable in initrd which tells us that there
exists atleast one watchdog module in initrd.
OR, we can leave it as it is, because I do not see any disadvantage even when a
watchdog module is added for inactive wdt (In fact we add iTCO_wdt currently
without checking its state).
> + [[ -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
> +
> + return 0
> +}
> +
> # returns 0 if system is not modified
> # returns 1 if system is modified
> # returns 2 if system modification is invalid
> @@ -448,6 +474,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
> }
>
~Pratyush