]> git.ipfire.org Git - thirdparty/util-linux.git/commitdiff
wdctl: Workaround reported boot-status bits not being present in wd->ident.options
authorHans de Goede <hdegoede@redhat.com>
Fri, 30 Jul 2021 11:22:54 +0000 (13:22 +0200)
committerKarel Zak <kzak@redhat.com>
Wed, 18 Aug 2021 09:45:22 +0000 (11:45 +0200)
Some watchdog drivers are capable of reporting WDIOF_CARDRESET in their
bootstatus, but they do not advertise this in the options field
returned by the WDIOC_GETSUPPORT ioctl.

This causes wdctl to not print the CARDRESET flag on these devices,
even when the reset was caused by the watchdog and this is being
reported in the WDIOC_GETBOOTSTATUS return.

Add a workaround by or-ing any bits which are set in the status and
bstatus returns into wd->ident.options so that reported flags will
get printend independent of them being advertised as supported in
wd->ident.options.

This will make wdctl print a CARDRESET line when the system was
actually reset by the watchdog while omitting it when it was not
reset by the watchdog.  At least on drivers which have the
CARDRESET is missing from info.options problem.  On other drivers
the CARDRESET line will always be printend, but the actual reported
value will change.

Signed-off-by: Hans de Goede <hdegoede@redhat.com>
sys-utils/wdctl.c

index 8de5d5a2d9a01e87fd0d5ca1e8788c74a1f746e0..6b9affa0aa76da031d205461b15d25fd5a41de85 100644 (file)
@@ -419,6 +419,13 @@ static int read_watchdog_from_device(struct wd_device *wd)
                ioctl(fd, WDIOC_GETSTATUS, &wd->status);
                ioctl(fd, WDIOC_GETBOOTSTATUS, &wd->bstatus);
 
+               /*
+                * Sometimes supported options like WDIOF_CARDRESET are missing from
+                * ident.options, add anything set in status/bstatus to ident.options.
+                */
+               wd->ident.options |= wd->status;
+               wd->ident.options |= wd->bstatus;
+
                if (ioctl(fd, WDIOC_GETTIMEOUT, &wd->timeout) >= 0)
                        wd->has_timeout = 1;
                if (ioctl(fd, WDIOC_GETPRETIMEOUT, &wd->pretimeout) >= 0)