diff options
author | Herbert Xu <herbert@gondor.apana.org.au> | 2014-12-23 00:40:19 -0500 |
---|---|---|
committer | Herbert Xu <herbert@gondor.apana.org.au> | 2014-12-25 16:33:35 -0500 |
commit | ac3a497f13e42a99ed6fe188ebf2dcc39eb7ac20 (patch) | |
tree | 6c06a3de482d03a83d7a7c6ad8ea32f099c9530c /drivers/char/hw_random/core.c | |
parent | 15b66cd54291186011f733cc750263f320b8a0a4 (diff) |
hwrng: core - Do not register device opportunistically
Currently we only register the device when a valid RNG is added.
However the way it's done is buggy because we test whether there
is a current RNG to determine whether we need to register. As
the current RNG may be missing due to a reinitialisation error
this can lead to a reregistration of the device.
As the device already has to handle a NULL current RNG anyway,
let's just register the device always and remove the complexity.
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Diffstat (limited to 'drivers/char/hw_random/core.c')
-rw-r--r-- | drivers/char/hw_random/core.c | 23 |
1 files changed, 12 insertions, 11 deletions
diff --git a/drivers/char/hw_random/core.c b/drivers/char/hw_random/core.c index 42827fd5f38d..1d342f0cb0c1 100644 --- a/drivers/char/hw_random/core.c +++ b/drivers/char/hw_random/core.c | |||
@@ -372,14 +372,14 @@ static DEVICE_ATTR(rng_available, S_IRUGO, | |||
372 | NULL); | 372 | NULL); |
373 | 373 | ||
374 | 374 | ||
375 | static void unregister_miscdev(void) | 375 | static void __exit unregister_miscdev(void) |
376 | { | 376 | { |
377 | device_remove_file(rng_miscdev.this_device, &dev_attr_rng_available); | 377 | device_remove_file(rng_miscdev.this_device, &dev_attr_rng_available); |
378 | device_remove_file(rng_miscdev.this_device, &dev_attr_rng_current); | 378 | device_remove_file(rng_miscdev.this_device, &dev_attr_rng_current); |
379 | misc_deregister(&rng_miscdev); | 379 | misc_deregister(&rng_miscdev); |
380 | } | 380 | } |
381 | 381 | ||
382 | static int register_miscdev(void) | 382 | static int __init register_miscdev(void) |
383 | { | 383 | { |
384 | int err; | 384 | int err; |
385 | 385 | ||
@@ -484,12 +484,6 @@ int hwrng_register(struct hwrng *rng) | |||
484 | if (err) | 484 | if (err) |
485 | goto out_unlock; | 485 | goto out_unlock; |
486 | set_current_rng(rng); | 486 | set_current_rng(rng); |
487 | |||
488 | err = register_miscdev(); | ||
489 | if (err) { | ||
490 | drop_current_rng(); | ||
491 | goto out_unlock; | ||
492 | } | ||
493 | } | 487 | } |
494 | list_add_tail(&rng->list, &rng_list); | 488 | list_add_tail(&rng->list, &rng_list); |
495 | 489 | ||
@@ -530,7 +524,6 @@ void hwrng_unregister(struct hwrng *rng) | |||
530 | 524 | ||
531 | if (list_empty(&rng_list)) { | 525 | if (list_empty(&rng_list)) { |
532 | mutex_unlock(&rng_mutex); | 526 | mutex_unlock(&rng_mutex); |
533 | unregister_miscdev(); | ||
534 | if (hwrng_fill) | 527 | if (hwrng_fill) |
535 | kthread_stop(hwrng_fill); | 528 | kthread_stop(hwrng_fill); |
536 | } else | 529 | } else |
@@ -540,16 +533,24 @@ void hwrng_unregister(struct hwrng *rng) | |||
540 | } | 533 | } |
541 | EXPORT_SYMBOL_GPL(hwrng_unregister); | 534 | EXPORT_SYMBOL_GPL(hwrng_unregister); |
542 | 535 | ||
543 | static void __exit hwrng_exit(void) | 536 | static int __init hwrng_modinit(void) |
537 | { | ||
538 | return register_miscdev(); | ||
539 | } | ||
540 | |||
541 | static void __exit hwrng_modexit(void) | ||
544 | { | 542 | { |
545 | mutex_lock(&rng_mutex); | 543 | mutex_lock(&rng_mutex); |
546 | BUG_ON(current_rng); | 544 | BUG_ON(current_rng); |
547 | kfree(rng_buffer); | 545 | kfree(rng_buffer); |
548 | kfree(rng_fillbuf); | 546 | kfree(rng_fillbuf); |
549 | mutex_unlock(&rng_mutex); | 547 | mutex_unlock(&rng_mutex); |
548 | |||
549 | unregister_miscdev(); | ||
550 | } | 550 | } |
551 | 551 | ||
552 | module_exit(hwrng_exit); | 552 | module_init(hwrng_modinit); |
553 | module_exit(hwrng_modexit); | ||
553 | 554 | ||
554 | MODULE_DESCRIPTION("H/W Random Number Generator (RNG) driver"); | 555 | MODULE_DESCRIPTION("H/W Random Number Generator (RNG) driver"); |
555 | MODULE_LICENSE("GPL"); | 556 | MODULE_LICENSE("GPL"); |