aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/platform
diff options
context:
space:
mode:
authorAxel Lin <axel.lin@gmail.com>2010-07-20 18:19:49 -0400
committerMatthew Garrett <mjg@redhat.com>2010-08-03 09:49:01 -0400
commita0dba697eec78fb2d4e2b76b83104a2b251ae70d (patch)
treef15804af288681c2bb58fcd7f13e6aeacea935ff /drivers/platform
parent6a984a06487129f013ee2df6ce98b6cfada1e7b1 (diff)
acerhdf: fix resource reclaim in error path
Fix resource reclaim in below cases: 1. acerhdf_register_platform() does not properly handle platform_device_alloc() failure and platform_device_add() failure This patch adds error handing for acerhdf_register_platform(). 2. acerhdf_register_platform() return err with acerhdf_dev == NULL. as a result, acerhdf_unregister_platform() does not do resource reclaim in acerhdf_init() error path. This patch adds error handing for acerhdf_register_platform(), thus correct the error handing path in acerhdf_init(). goto out_err instead of err_unreg if acerhdf_register_platform() fail. 3. platform_device_del() should only used in error handling. Current implementation missed a platform_device_put() in acerhdf_exit. This patch fixes it by using platform_device_unregister() instead of platform_device_del() in acerhdf_unregister_platform. Signed-off-by: Axel Lin <axel.lin@gmail.com> Acked-by: Peter Feuerer <peter@piie.net> Cc: Matthew Garrett <mjg@redhat.com> Acked-by: Borislav Petkov <bp@alien8.de> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Matthew Garrett <mjg@redhat.com>
Diffstat (limited to 'drivers/platform')
-rw-r--r--drivers/platform/x86/acerhdf.c23
1 files changed, 16 insertions, 7 deletions
diff --git a/drivers/platform/x86/acerhdf.c b/drivers/platform/x86/acerhdf.c
index 4ce28d901b9a..60f9cfcac93f 100644
--- a/drivers/platform/x86/acerhdf.c
+++ b/drivers/platform/x86/acerhdf.c
@@ -615,17 +615,26 @@ static int acerhdf_register_platform(void)
615 return err; 615 return err;
616 616
617 acerhdf_dev = platform_device_alloc("acerhdf", -1); 617 acerhdf_dev = platform_device_alloc("acerhdf", -1);
618 platform_device_add(acerhdf_dev); 618 if (!acerhdf_dev) {
619 err = -ENOMEM;
620 goto err_device_alloc;
621 }
622 err = platform_device_add(acerhdf_dev);
623 if (err)
624 goto err_device_add;
619 625
620 return 0; 626 return 0;
627
628err_device_add:
629 platform_device_put(acerhdf_dev);
630err_device_alloc:
631 platform_driver_unregister(&acerhdf_driver);
632 return err;
621} 633}
622 634
623static void acerhdf_unregister_platform(void) 635static void acerhdf_unregister_platform(void)
624{ 636{
625 if (!acerhdf_dev) 637 platform_device_unregister(acerhdf_dev);
626 return;
627
628 platform_device_del(acerhdf_dev);
629 platform_driver_unregister(&acerhdf_driver); 638 platform_driver_unregister(&acerhdf_driver);
630} 639}
631 640
@@ -669,7 +678,7 @@ static int __init acerhdf_init(void)
669 678
670 err = acerhdf_register_platform(); 679 err = acerhdf_register_platform();
671 if (err) 680 if (err)
672 goto err_unreg; 681 goto out_err;
673 682
674 err = acerhdf_register_thermal(); 683 err = acerhdf_register_thermal();
675 if (err) 684 if (err)
@@ -682,7 +691,7 @@ err_unreg:
682 acerhdf_unregister_platform(); 691 acerhdf_unregister_platform();
683 692
684out_err: 693out_err:
685 return -ENODEV; 694 return err;
686} 695}
687 696
688static void __exit acerhdf_exit(void) 697static void __exit acerhdf_exit(void)