aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTheodore Ts'o <tytso@mit.edu>2013-11-03 07:56:17 -0500
committerTheodore Ts'o <tytso@mit.edu>2013-11-03 18:18:49 -0500
commitae9ecd92ddabc250817baa7eb401df3cfbd4c2da (patch)
tree6aeb29fb1d59dcf1d9a3c43252b9ac4834fff177
parent301f0595c0e788edacc3521c4caa90b4e56ffee1 (diff)
random: don't zap entropy count in rand_initialize()
The rand_initialize() function was being run fairly late in the kernel boot sequence. This was unfortunate, since it zero'ed the entropy counters, thus throwing away credit that was accumulated earlier in the boot sequence, and it also meant that initcall functions run before rand_initialize were using a minimally initialized pool. To fix this, fix init_std_data() to no longer zap the entropy counter; it wasn't necessary, and move rand_initialize() to be an early initcall. Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
-rw-r--r--drivers/char/random.c16
1 files changed, 9 insertions, 7 deletions
diff --git a/drivers/char/random.c b/drivers/char/random.c
index a19a7a63ec35..a38d97a21455 100644
--- a/drivers/char/random.c
+++ b/drivers/char/random.c
@@ -1228,14 +1228,11 @@ static void init_std_data(struct entropy_store *r)
1228 ktime_t now = ktime_get_real(); 1228 ktime_t now = ktime_get_real();
1229 unsigned long rv; 1229 unsigned long rv;
1230 1230
1231 r->entropy_count = 0;
1232 r->entropy_total = 0;
1233 r->last_data_init = 0;
1234 r->last_pulled = jiffies; 1231 r->last_pulled = jiffies;
1235 mix_pool_bytes(r, &now, sizeof(now), NULL); 1232 mix_pool_bytes(r, &now, sizeof(now), NULL);
1236 for (i = r->poolinfo->poolbytes; i > 0; i -= sizeof(rv)) { 1233 for (i = r->poolinfo->poolbytes; i > 0; i -= sizeof(rv)) {
1237 if (!arch_get_random_long(&rv)) 1234 if (!arch_get_random_long(&rv))
1238 break; 1235 rv = random_get_entropy();
1239 mix_pool_bytes(r, &rv, sizeof(rv), NULL); 1236 mix_pool_bytes(r, &rv, sizeof(rv), NULL);
1240 } 1237 }
1241 mix_pool_bytes(r, utsname(), sizeof(*(utsname())), NULL); 1238 mix_pool_bytes(r, utsname(), sizeof(*(utsname())), NULL);
@@ -1258,7 +1255,7 @@ static int rand_initialize(void)
1258 init_std_data(&nonblocking_pool); 1255 init_std_data(&nonblocking_pool);
1259 return 0; 1256 return 0;
1260} 1257}
1261module_init(rand_initialize); 1258early_initcall(rand_initialize);
1262 1259
1263#ifdef CONFIG_BLOCK 1260#ifdef CONFIG_BLOCK
1264void rand_initialize_disk(struct gendisk *disk) 1261void rand_initialize_disk(struct gendisk *disk)
@@ -1433,10 +1430,15 @@ static long random_ioctl(struct file *f, unsigned int cmd, unsigned long arg)
1433 return 0; 1430 return 0;
1434 case RNDZAPENTCNT: 1431 case RNDZAPENTCNT:
1435 case RNDCLEARPOOL: 1432 case RNDCLEARPOOL:
1436 /* Clear the entropy pool counters. */ 1433 /*
1434 * Clear the entropy pool counters. We no longer clear
1435 * the entropy pool, as that's silly.
1436 */
1437 if (!capable(CAP_SYS_ADMIN)) 1437 if (!capable(CAP_SYS_ADMIN))
1438 return -EPERM; 1438 return -EPERM;
1439 rand_initialize(); 1439 input_pool.entropy_count = 0;
1440 nonblocking_pool.entropy_count = 0;
1441 blocking_pool.entropy_count = 0;
1440 return 0; 1442 return 0;
1441 default: 1443 default:
1442 return -EINVAL; 1444 return -EINVAL;