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;
 }
 
 /**

_