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 | |
| 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>
| -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; |
