From mboxrd@z Thu Jan 1 00:00:00 1970 Return-path: Received: from mx1.redhat.com ([209.132.183.28]:57664 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753016Ab2HGS1c (ORCPT ); Tue, 7 Aug 2012 14:27:32 -0400 Received: from int-mx02.intmail.prod.int.phx2.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id q77IRWDs007665 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Tue, 7 Aug 2012 14:27:32 -0400 Received: from redhat.com (s01.msp.redhat.com [10.15.95.15]) by int-mx02.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id q77IRUnu005289 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES128-SHA bits=128 verify=NO) for ; Tue, 7 Aug 2012 14:27:31 -0400 Date: Tue, 7 Aug 2012 14:27:30 -0400 From: David Teigland To: linux-watchdog@vger.kernel.org Subject: [PATCH v2] watchdog: new option to skip ping in close Message-ID: <20120807182730.GE29229@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Sender: linux-watchdog-owner@vger.kernel.org List-Id: linux-watchdog@vger.kernel.org If a daemon has /dev/watchdog open, and exits (say by crashing or sigkill), watchdog_release() generates a new watchdog_ping(), extending the life of the machine. However, the daemon may require control over whether or not the watchdog is pinged, and the ping generated by close compromises this control. Signed-off-by: David Teigland --- drivers/watchdog/watchdog_dev.c | 7 ++++++- include/linux/watchdog.h | 2 ++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/drivers/watchdog/watchdog_dev.c b/drivers/watchdog/watchdog_dev.c index ef8edec..47ae7fe 100644 --- a/drivers/watchdog/watchdog_dev.c +++ b/drivers/watchdog/watchdog_dev.c @@ -394,6 +394,9 @@ static long watchdog_ioctl(struct file *file, unsigned int cmd, if (err) return err; return put_user(val, p); + case WDIOC_NOCLOSEPING: + set_bit(WDOG_NO_CLOSE_PING, &wdd->status); + return 0; default: return -ENOTTY; } @@ -480,7 +483,9 @@ static int watchdog_release(struct inode *inode, struct file *file) if (!test_bit(WDOG_UNREGISTERED, &wdd->status)) dev_crit(wdd->dev, "watchdog did not stop!\n"); mutex_unlock(&wdd->lock); - watchdog_ping(wdd); + + if (!test_bit(WDOG_NO_CLOSE_PING, &wdd->status)) + watchdog_ping(wdd); } /* Allow the owner module to be unloaded again */ diff --git a/include/linux/watchdog.h b/include/linux/watchdog.h index da70f0f..4fa10ff 100644 --- a/include/linux/watchdog.h +++ b/include/linux/watchdog.h @@ -31,6 +31,7 @@ struct watchdog_info { #define WDIOC_SETPRETIMEOUT _IOWR(WATCHDOG_IOCTL_BASE, 8, int) #define WDIOC_GETPRETIMEOUT _IOR(WATCHDOG_IOCTL_BASE, 9, int) #define WDIOC_GETTIMELEFT _IOR(WATCHDOG_IOCTL_BASE, 10, int) +#define WDIOC_NOCLOSEPING _IOR(WATCHDOG_IOCTL_BASE, 11, int) #define WDIOF_UNKNOWN -1 /* Unknown flag error */ #define WDIOS_UNKNOWN -1 /* Unknown status error */ @@ -140,6 +141,7 @@ struct watchdog_device { #define WDOG_ALLOW_RELEASE 2 /* Did we receive the magic char ? */ #define WDOG_NO_WAY_OUT 3 /* Is 'nowayout' feature set ? */ #define WDOG_UNREGISTERED 4 /* Has the device been unregistered */ +#define WDOG_NO_CLOSE_PING 5 /* Do not ping in watchdog_release() */ }; #ifdef CONFIG_WATCHDOG_NOWAYOUT -- 1.7.10.1.362.g242cab3