Karel Zak 488ec4
From 006aca565d4c8565baf05296b8e65ca4d5f203d3 Mon Sep 17 00:00:00 2001
Karel Zak 488ec4
From: Hans de Goede <hdegoede@redhat.com>
Karel Zak 488ec4
Date: Fri, 30 Jul 2021 13:22:54 +0200
Karel Zak 488ec4
Subject: wdctl: Workaround reported boot-status bits not being present in
Karel Zak 488ec4
 wd->ident.options
Karel Zak 488ec4
Karel Zak 488ec4
Some watchdog drivers are capable of reporting WDIOF_CARDRESET in their
Karel Zak 488ec4
bootstatus, but they do not advertise this in the options field
Karel Zak 488ec4
returned by the WDIOC_GETSUPPORT ioctl.
Karel Zak 488ec4
Karel Zak 488ec4
This causes wdctl to not print the CARDRESET flag on these devices,
Karel Zak 488ec4
even when the reset was caused by the watchdog and this is being
Karel Zak 488ec4
reported in the WDIOC_GETBOOTSTATUS return.
Karel Zak 488ec4
Karel Zak 488ec4
Add a workaround by or-ing any bits which are set in the status and
Karel Zak 488ec4
bstatus returns into wd->ident.options so that reported flags will
Karel Zak 488ec4
get printend independent of them being advertised as supported in
Karel Zak 488ec4
wd->ident.options.
Karel Zak 488ec4
Karel Zak 488ec4
This will make wdctl print a CARDRESET line when the system was
Karel Zak 488ec4
actually reset by the watchdog while omitting it when it was not
Karel Zak 488ec4
reset by the watchdog.  At least on drivers which have the
Karel Zak 488ec4
CARDRESET is missing from info.options problem.  On other drivers
Karel Zak 488ec4
the CARDRESET line will always be printend, but the actual reported
Karel Zak 488ec4
value will change.
Karel Zak 488ec4
Karel Zak 488ec4
Upstream: http://github.com/util-linux/util-linux/commit/b1b0259fe42aad1bf0997ce1c03a020ce59e38ab
Karel Zak 488ec4
Addresses: https://bugzilla.redhat.com/show_bug.cgi?id=2057046
Karel Zak 488ec4
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Karel Zak 488ec4
---
Karel Zak 488ec4
 sys-utils/wdctl.c | 7 +++++++
Karel Zak 488ec4
 1 file changed, 7 insertions(+)
Karel Zak 488ec4
Karel Zak 488ec4
diff --git a/sys-utils/wdctl.c b/sys-utils/wdctl.c
Karel Zak 488ec4
index 8de5d5a2d..6b9affa0a 100644
Karel Zak 488ec4
--- a/sys-utils/wdctl.c
Karel Zak 488ec4
+++ b/sys-utils/wdctl.c
Karel Zak 488ec4
@@ -419,6 +419,13 @@ static int read_watchdog_from_device(struct wd_device *wd)
Karel Zak 488ec4
 		ioctl(fd, WDIOC_GETSTATUS, &wd->status);
Karel Zak 488ec4
 		ioctl(fd, WDIOC_GETBOOTSTATUS, &wd->bstatus);
Karel Zak 488ec4
 
Karel Zak 488ec4
+		/*
Karel Zak 488ec4
+		 * Sometimes supported options like WDIOF_CARDRESET are missing from
Karel Zak 488ec4
+		 * ident.options, add anything set in status/bstatus to ident.options.
Karel Zak 488ec4
+		 */
Karel Zak 488ec4
+		wd->ident.options |= wd->status;
Karel Zak 488ec4
+		wd->ident.options |= wd->bstatus;
Karel Zak 488ec4
+
Karel Zak 488ec4
 		if (ioctl(fd, WDIOC_GETTIMEOUT, &wd->timeout) >= 0)
Karel Zak 488ec4
 			wd->has_timeout = 1;
Karel Zak 488ec4
 		if (ioctl(fd, WDIOC_GETPRETIMEOUT, &wd->pretimeout) >= 0)
Karel Zak 488ec4
-- 
Karel Zak 488ec4
2.34.1
Karel Zak 488ec4