diff options
author | Hector Palacios <hector.palacios@digi.com> | 2013-04-08 11:06:32 -0400 |
---|---|---|
committer | Wim Van Sebroeck <wim@iguana.be> | 2013-07-11 15:14:39 -0400 |
commit | fcf95670fd29359a382e0755e573b36076d6283e (patch) | |
tree | f529d381c5f34de259208c52de6dcbd079f2a19a | |
parent | 5f314970b25a6960dd056b0038ffc7b88dc2973e (diff) |
watchdog: core: don't try to stop device if not running
A watchdog device may be stopped from userspace using WDIOC_SETOPTIONS
ioctl and flag WDIOS_DISABLECARD. If the device is closed after this
operation, watchdog_release() is called and status bits checked for
stopping it. Besides, if the device has not been unregistered a critical
message "watchdog did not stop!" is printed, although the ioctl may have
successfully stopped it already.
Without the patch a user application sample code like this will successfully
stop the watchdog, but the kernel will output the message
"watchdog did not stop!":
wd_fd = open("/dev/watchdog", O_RDWR);
flags = WDIOS_DISABLECARD;
ioctl(wd_fd, WDIOC_SETOPTIONS, &flags);
close(wd_fd);
Signed-off-by: Hector Palacios <hector.palacios@digi.com>
Reviewed-by: Guenter Roeck <linux@roeck-us.net>
Signed-off-by: Wim Van Sebroeck <wim@iguana.be>
-rw-r--r-- | drivers/watchdog/watchdog_dev.c | 6 |
1 files changed, 4 insertions, 2 deletions
diff --git a/drivers/watchdog/watchdog_dev.c b/drivers/watchdog/watchdog_dev.c index faf4e189fe42..6aaefbad303e 100644 --- a/drivers/watchdog/watchdog_dev.c +++ b/drivers/watchdog/watchdog_dev.c | |||
@@ -469,8 +469,10 @@ static int watchdog_release(struct inode *inode, struct file *file) | |||
469 | * or if WDIOF_MAGICCLOSE is not set. If nowayout was set then | 469 | * or if WDIOF_MAGICCLOSE is not set. If nowayout was set then |
470 | * watchdog_stop will fail. | 470 | * watchdog_stop will fail. |
471 | */ | 471 | */ |
472 | if (test_and_clear_bit(WDOG_ALLOW_RELEASE, &wdd->status) || | 472 | if (!test_bit(WDOG_ACTIVE, &wdd->status)) |
473 | !(wdd->info->options & WDIOF_MAGICCLOSE)) | 473 | err = 0; |
474 | else if (test_and_clear_bit(WDOG_ALLOW_RELEASE, &wdd->status) || | ||
475 | !(wdd->info->options & WDIOF_MAGICCLOSE)) | ||
474 | err = watchdog_stop(wdd); | 476 | err = watchdog_stop(wdd); |
475 | 477 | ||
476 | /* If the watchdog was not stopped, send a keepalive ping */ | 478 | /* If the watchdog was not stopped, send a keepalive ping */ |