diff options
author | Robert Richter <robert.richter@amd.com> | 2010-08-30 04:56:18 -0400 |
---|---|---|
committer | Robert Richter <robert.richter@amd.com> | 2010-08-31 04:26:26 -0400 |
commit | 10f0412f57f2a76a90eff4376f59cbb0a39e4e18 (patch) | |
tree | 6e038c3816b5e1f61a498ed69cd730d5e4e832ef /arch/x86/oprofile | |
parent | 750d857c682f4db60d14722d430c7ccc35070962 (diff) |
oprofile, x86: fix init_sysfs error handling
On failure init_sysfs() might not properly free resources. The error
code of the function is not checked. And, when reinitializing the exit
function might be called twice. This patch fixes all this.
Cc: stable@kernel.org
Signed-off-by: Robert Richter <robert.richter@amd.com>
Diffstat (limited to 'arch/x86/oprofile')
-rw-r--r-- | arch/x86/oprofile/nmi_int.c | 16 |
1 files changed, 13 insertions, 3 deletions
diff --git a/arch/x86/oprofile/nmi_int.c b/arch/x86/oprofile/nmi_int.c index f6b48f6c5951..73a41d3c6c09 100644 --- a/arch/x86/oprofile/nmi_int.c +++ b/arch/x86/oprofile/nmi_int.c | |||
@@ -568,8 +568,13 @@ static int __init init_sysfs(void) | |||
568 | int error; | 568 | int error; |
569 | 569 | ||
570 | error = sysdev_class_register(&oprofile_sysclass); | 570 | error = sysdev_class_register(&oprofile_sysclass); |
571 | if (!error) | 571 | if (error) |
572 | error = sysdev_register(&device_oprofile); | 572 | return error; |
573 | |||
574 | error = sysdev_register(&device_oprofile); | ||
575 | if (error) | ||
576 | sysdev_class_unregister(&oprofile_sysclass); | ||
577 | |||
573 | return error; | 578 | return error; |
574 | } | 579 | } |
575 | 580 | ||
@@ -695,6 +700,8 @@ int __init op_nmi_init(struct oprofile_operations *ops) | |||
695 | char *cpu_type = NULL; | 700 | char *cpu_type = NULL; |
696 | int ret = 0; | 701 | int ret = 0; |
697 | 702 | ||
703 | using_nmi = 0; | ||
704 | |||
698 | if (!cpu_has_apic) | 705 | if (!cpu_has_apic) |
699 | return -ENODEV; | 706 | return -ENODEV; |
700 | 707 | ||
@@ -774,7 +781,10 @@ int __init op_nmi_init(struct oprofile_operations *ops) | |||
774 | 781 | ||
775 | mux_init(ops); | 782 | mux_init(ops); |
776 | 783 | ||
777 | init_sysfs(); | 784 | ret = init_sysfs(); |
785 | if (ret) | ||
786 | return ret; | ||
787 | |||
778 | using_nmi = 1; | 788 | using_nmi = 1; |
779 | printk(KERN_INFO "oprofile: using NMI interrupt.\n"); | 789 | printk(KERN_INFO "oprofile: using NMI interrupt.\n"); |
780 | return 0; | 790 | return 0; |