From: gleb@nbase.co.il (Gleb Natapov) There is inconsistency in fops->write() implementation in different watchdog drivers. Some of them return number of bytes written while others return 1. I think the correct implementation should always return number of bytes written (we examine all the buffer after all) otherwise "echo V > /dev/watchdog" doesn't work as expected (it doesn't stop watchdog). drivers/char/watchdog/i810-tco.c | 3 +-- drivers/char/watchdog/ib700wdt.c | 3 +-- drivers/char/watchdog/indydog.c | 3 +-- drivers/char/watchdog/machzwd.c | 3 +-- drivers/char/watchdog/mixcomwd.c | 3 +-- drivers/char/watchdog/pcwd.c | 3 +-- drivers/char/watchdog/sa1100_wdt.c | 2 +- drivers/char/watchdog/softdog.c | 3 +-- drivers/char/watchdog/wdt.c | 3 +-- 9 files changed, 9 insertions(+), 17 deletions(-) diff -puN drivers/char/watchdog/i810-tco.c~watchdog-retval-fix drivers/char/watchdog/i810-tco.c --- 25/drivers/char/watchdog/i810-tco.c~watchdog-retval-fix 2003-11-16 13:30:54.000000000 -0800 +++ 25-akpm/drivers/char/watchdog/i810-tco.c 2003-11-16 13:30:54.000000000 -0800 @@ -232,9 +232,8 @@ static ssize_t i810tco_write (struct fil /* someone wrote to us, we should reload the timer */ tco_timer_reload (); - return 1; } - return 0; + return len; } static int i810tco_ioctl (struct inode *inode, struct file *file, diff -puN drivers/char/watchdog/ib700wdt.c~watchdog-retval-fix drivers/char/watchdog/ib700wdt.c --- 25/drivers/char/watchdog/ib700wdt.c~watchdog-retval-fix 2003-11-16 13:30:54.000000000 -0800 +++ 25-akpm/drivers/char/watchdog/ib700wdt.c 2003-11-16 13:30:54.000000000 -0800 @@ -161,9 +161,8 @@ ibwdt_write(struct file *file, const cha } } ibwdt_ping(); - return 1; } - return 0; + return count; } static int diff -puN drivers/char/watchdog/indydog.c~watchdog-retval-fix drivers/char/watchdog/indydog.c --- 25/drivers/char/watchdog/indydog.c~watchdog-retval-fix 2003-11-16 13:30:54.000000000 -0800 +++ 25-akpm/drivers/char/watchdog/indydog.c 2003-11-16 13:30:54.000000000 -0800 @@ -113,9 +113,8 @@ static ssize_t indydog_write(struct file } } indydog_ping(); - return 1; } - return 0; + return len; } static int indydog_ioctl(struct inode *inode, struct file *file, diff -puN drivers/char/watchdog/machzwd.c~watchdog-retval-fix drivers/char/watchdog/machzwd.c --- 25/drivers/char/watchdog/machzwd.c~watchdog-retval-fix 2003-11-16 13:30:54.000000000 -0800 +++ 25-akpm/drivers/char/watchdog/machzwd.c 2003-11-16 13:30:54.000000000 -0800 @@ -343,10 +343,9 @@ static ssize_t zf_write(struct file *fil next_heartbeat = jiffies + ZF_USER_TIMEO; dprintk("user ping at %ld\n", jiffies); - return 1; } - return 0; + return count; } static int zf_ioctl(struct inode *inode, struct file *file, unsigned int cmd, diff -puN drivers/char/watchdog/mixcomwd.c~watchdog-retval-fix drivers/char/watchdog/mixcomwd.c --- 25/drivers/char/watchdog/mixcomwd.c~watchdog-retval-fix 2003-11-16 13:30:54.000000000 -0800 +++ 25-akpm/drivers/char/watchdog/mixcomwd.c 2003-11-16 13:30:54.000000000 -0800 @@ -156,9 +156,8 @@ static ssize_t mixcomwd_write(struct fil } } mixcomwd_ping(); - return 1; } - return 0; + return len; } static int mixcomwd_ioctl(struct inode *inode, struct file *file, diff -puN drivers/char/watchdog/pcwd.c~watchdog-retval-fix drivers/char/watchdog/pcwd.c --- 25/drivers/char/watchdog/pcwd.c~watchdog-retval-fix 2003-11-16 13:30:54.000000000 -0800 +++ 25-akpm/drivers/char/watchdog/pcwd.c 2003-11-16 13:30:54.000000000 -0800 @@ -419,9 +419,8 @@ static ssize_t pcwd_write(struct file *f } } pcwd_send_heartbeat(); - return 1; } - return 0; + return len; } static int pcwd_open(struct inode *ino, struct file *filep) diff -puN drivers/char/watchdog/sa1100_wdt.c~watchdog-retval-fix drivers/char/watchdog/sa1100_wdt.c --- 25/drivers/char/watchdog/sa1100_wdt.c~watchdog-retval-fix 2003-11-16 13:30:54.000000000 -0800 +++ 25-akpm/drivers/char/watchdog/sa1100_wdt.c 2003-11-16 13:30:54.000000000 -0800 @@ -106,7 +106,7 @@ static ssize_t sa1100dog_write(struct fi OSMR3 = OSCR + pre_margin; } - return len ? 1 : 0; + return len; } static struct watchdog_info ident = { diff -puN drivers/char/watchdog/softdog.c~watchdog-retval-fix drivers/char/watchdog/softdog.c --- 25/drivers/char/watchdog/softdog.c~watchdog-retval-fix 2003-11-16 13:30:54.000000000 -0800 +++ 25-akpm/drivers/char/watchdog/softdog.c 2003-11-16 13:30:54.000000000 -0800 @@ -155,9 +155,8 @@ static ssize_t softdog_write(struct file } } mod_timer(&watchdog_ticktock, jiffies+(soft_margin*HZ)); - return 1; } - return 0; + return len; } static int softdog_ioctl(struct inode *inode, struct file *file, diff -puN drivers/char/watchdog/wdt.c~watchdog-retval-fix drivers/char/watchdog/wdt.c --- 25/drivers/char/watchdog/wdt.c~watchdog-retval-fix 2003-11-16 13:30:54.000000000 -0800 +++ 25-akpm/drivers/char/watchdog/wdt.c 2003-11-16 13:30:54.000000000 -0800 @@ -265,9 +265,8 @@ static ssize_t wdt_write(struct file *fi } } wdt_ping(); - return 1; } - return 0; + return count; } /** _