From: Lennart Poettering Date: Mon, 18 Oct 2021 09:21:42 +0000 (+0200) Subject: watchdog: always prefer /dev/watchdog0 over /dev/watchdog X-Git-Tag: v250-rc1~483^2~2 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=59bcac0b1a48c7821d335bc52b9098da9e125932;p=thirdparty%2Fsystemd.git watchdog: always prefer /dev/watchdog0 over /dev/watchdog --- diff --git a/man/systemd-system.conf.xml b/man/systemd-system.conf.xml index 2307a8f5c95..3805a010e2e 100644 --- a/man/systemd-system.conf.xml +++ b/man/systemd-system.conf.xml @@ -144,7 +144,7 @@ depending on hardware capabilities). If RuntimeWatchdogSec= is set to a non-zero value, the watchdog hardware - (/dev/watchdog or the path specified with WatchdogDevice= or + (/dev/watchdog0 or the path specified with WatchdogDevice= or the kernel option systemd.watchdog-device=) will be programmed to automatically reboot the system if it is not contacted within the specified timeout interval. The system manager will ensure to contact it at least once in half the specified timeout interval. This feature requires @@ -182,7 +182,7 @@ Configure the hardware watchdog device that the runtime and shutdown watchdog timers will open and use. Defaults - to /dev/watchdog. This setting has no + to /dev/watchdog0. This setting has no effect if a hardware watchdog is not available. diff --git a/src/shared/watchdog.c b/src/shared/watchdog.c index 8a551fb5c86..c23a4cbac4c 100644 --- a/src/shared/watchdog.c +++ b/src/shared/watchdog.c @@ -10,6 +10,7 @@ #include "errno-util.h" #include "fd-util.h" #include "log.h" +#include "path-util.h" #include "string-util.h" #include "time-util.h" #include "watchdog.h" @@ -127,7 +128,13 @@ static int open_watchdog(void) { if (watchdog_fd >= 0) return 0; - fn = watchdog_device ?: "/dev/watchdog"; + /* Let's prefer new-style /dev/watchdog0 (i.e. kernel 3.5+) over classic /dev/watchdog. The former + * has the benefit that we can easily find the matching directory in sysfs from it, as the relevant + * sysfs attributes can only be found via /sys/dev/char/: if the new-style device + * major/minor is used, not the old-style. */ + fn = !watchdog_device || path_equal(watchdog_device, "/dev/watchdog") ? + "/dev/watchdog0" : watchdog_device; + watchdog_fd = open(fn, O_WRONLY|O_CLOEXEC); if (watchdog_fd < 0) return log_debug_errno(errno, "Failed to open watchdog device %s, ignoring: %m", fn);