
From: Matt Mackall <mpm@selenic.com>

- Re-init all three pools in ioctls

- Clear entropy count in init_std_data under a lock

- Add kerneldoc comment

Signed-off-by: Matt Mackall <mpm@selenic.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
---

 25-akpm/drivers/char/random.c |   22 +++++++++++++---------
 1 files changed, 13 insertions(+), 9 deletions(-)

diff -puN drivers/char/random.c~random-pt2-re-init-all-pools-on-zero drivers/char/random.c
--- 25/drivers/char/random.c~random-pt2-re-init-all-pools-on-zero	2005-03-07 20:41:47.000000000 -0800
+++ 25-akpm/drivers/char/random.c	2005-03-07 21:14:22.000000000 -0800
@@ -1473,16 +1473,14 @@ void get_random_bytes(void *buf, int nby
 
 EXPORT_SYMBOL(get_random_bytes);
 
-/*********************************************************************
- *
- * Functions to interface with Linux
- *
- *********************************************************************/
-
 /*
- * Initialize the random pool with standard stuff.
+ * init_std_data - initialize pool with system data
  *
- * NOTE: This is an OS-dependent function.
+ * @r: pool to initialize
+ *
+ * This function clears the pool's entropy count and mixes some system
+ * data into the pool to prepare it for use. The pool is not cleared
+ * as that can only decrease the entropy in the pool.
  */
 static void init_std_data(struct entropy_store *r)
 {
@@ -1490,6 +1488,11 @@ static void init_std_data(struct entropy
 	__u32 words[2];
 	char *p;
 	int i;
+	unsigned long flags;
+
+	spin_lock_irqsave(&r->lock, flags);
+	r->entropy_count = 0;
+	spin_unlock_irqrestore(&r->lock, flags);
 
 	do_gettimeofday(&tv);
 	words[0] = tv.tv_sec;
@@ -1753,8 +1756,9 @@ random_ioctl(struct inode * inode, struc
 		/* Clear the entropy pool counters. */
 		if (!capable(CAP_SYS_ADMIN))
 			return -EPERM;
-		random_state->entropy_count = 0;
 		init_std_data(random_state);
+		init_std_data(sec_random_state);
+		init_std_data(urandom_state);
 		return 0;
 	default:
 		return -EINVAL;
_
