summaryrefslogtreecommitdiffstats
path: root/meta-phosphor/recipes-core/busybox/busybox/0001-Stop-watchdog-first-on-startup.patch
diff options
context:
space:
mode:
Diffstat (limited to 'meta-phosphor/recipes-core/busybox/busybox/0001-Stop-watchdog-first-on-startup.patch')
-rw-r--r--meta-phosphor/recipes-core/busybox/busybox/0001-Stop-watchdog-first-on-startup.patch63
1 files changed, 63 insertions, 0 deletions
diff --git a/meta-phosphor/recipes-core/busybox/busybox/0001-Stop-watchdog-first-on-startup.patch b/meta-phosphor/recipes-core/busybox/busybox/0001-Stop-watchdog-first-on-startup.patch
new file mode 100644
index 000000000..7128b8108
--- /dev/null
+++ b/meta-phosphor/recipes-core/busybox/busybox/0001-Stop-watchdog-first-on-startup.patch
@@ -0,0 +1,63 @@
+From a4c493ae42926ab36fdc805a5da9f0682bb98b45 Mon Sep 17 00:00:00 2001
+From: Matt Spinler <spinler@us.ibm.com>
+Date: Tue, 13 Jun 2017 15:26:49 -0500
+Subject: [PATCH] Stop watchdog first on startup
+
+Some watchdog implementations may do things other than issue
+a reboot on a watchdog timeout. In this case, there's the
+possibility of restarting this program from the state of
+the watchdog device not being properly stopped (done by writing
+a 'V' and closing the device). Since it wasn't stopped, the
+driver may not be able to restart the watchdog when this program
+reopens it and starts pinging it.
+
+To fix this, the code will always first issue the stop when it
+starts up.
+
+Signed-off-by: Matt Spinler <spinler@us.ibm.com>
+---
+ miscutils/watchdog.c | 21 +++++++++++++++++++--
+ 1 file changed, 19 insertions(+), 2 deletions(-)
+
+diff --git a/miscutils/watchdog.c b/miscutils/watchdog.c
+index 07ae64e52..223e3c32d 100644
+--- a/miscutils/watchdog.c
++++ b/miscutils/watchdog.c
+@@ -53,6 +53,24 @@ static void watchdog_shutdown(int sig UNUSED_PARAM)
+ _exit(EXIT_SUCCESS);
+ }
+
++static void watchdog_open(const char* device)
++{
++ static const char magic_value = 'V';
++
++ /* If the watchdog driver can do something other than cause a reboot
++ * on a timeout, then it's possible this program may be starting from
++ * a state when the watchdog hadn't been previously stopped with
++ * the magic write followed by a close. In this case the driver may
++ * not start properly, so always do the proper stop first just in case.
++ */
++
++ /* Use known fd # - avoid needing global 'int fd' */
++ xmove_fd(xopen(device, O_WRONLY), 3);
++ write(3, &magic_value, 1);
++ close(3);
++ xmove_fd(xopen(device, O_WRONLY), 3);
++}
++
+ int watchdog_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
+ int watchdog_main(int argc, char **argv)
+ {
+@@ -88,8 +106,7 @@ int watchdog_main(int argc, char **argv)
+
+ bb_signals(BB_FATAL_SIGS, watchdog_shutdown);
+
+- /* Use known fd # - avoid needing global 'int fd' */
+- xmove_fd(xopen(argv[argc - 1], O_WRONLY), 3);
++ watchdog_open(argv[argc - 1]);
+
+ /* WDIOC_SETTIMEOUT takes seconds, not milliseconds */
+ htimer_duration = htimer_duration / 1000;
+--
+2.11.0
+
OpenPOWER on IntegriCloud