Gitweb:     
http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=ac36393de6034be7266264a435360e7628849005
Commit:     ac36393de6034be7266264a435360e7628849005
Parent:     7a883eaf62f4b943ebec738ce3b0796c67ef5d32
Author:     Henrique de Moraes Holschuh <[EMAIL PROTECTED]>
AuthorDate: Fri Jul 27 17:04:40 2007 -0300
Committer:  Len Brown <[EMAIL PROTECTED]>
CommitDate: Fri Aug 3 15:32:58 2007 -0400

    ACPI: thinkpad-acpi: fix the module init failure path
    
    Thomas Renninger reports that if one tries to load thinkpad-acpi in a
    non-thinkpad, one gets:
    
    Call Trace:
     [<ffffffff802fa57d>] kref_get+0x2f/0x36
     [<ffffffff802f97f7>] kobject_get+0x12/0x17
     [<ffffffff8036dfd7>] get_driver+0x14/0x1a
     [<ffffffff8036dfee>] driver_remove_file+0x11/0x32
     [<ffffffff8823b9be>] :thinkpad_acpi:thinkpad_acpi_module_exit+0xa8/0xfc
     [<ffffffff8824b8a0>] :thinkpad_acpi:thinkpad_acpi_module_init+0x74a/0x776
     [<ffffffff8024f968>] __link_module+0x0/0x25
     [<ffffffff80252269>] sys_init_module+0x162c/0x178f
     [<ffffffff8020bc2e>] system_call+0x7e/0x83
    
    So, track if the platform driver and its driver attributes were registered,
    and only deallocate them in that case.
    
    This patch is based on Thomas Renninger's patch for the issue.
    
    Signed-off-by: Henrique de Moraes Holschuh <[EMAIL PROTECTED]>
    Acked-by: Thomas Renninger <[EMAIL PROTECTED]>
    Signed-off-by: Len Brown <[EMAIL PROTECTED]>
---
 drivers/misc/thinkpad_acpi.c |   10 ++++++++--
 drivers/misc/thinkpad_acpi.h |    2 ++
 2 files changed, 10 insertions(+), 2 deletions(-)

diff --git a/drivers/misc/thinkpad_acpi.c b/drivers/misc/thinkpad_acpi.c
index fa80f35..f6cd34a 100644
--- a/drivers/misc/thinkpad_acpi.c
+++ b/drivers/misc/thinkpad_acpi.c
@@ -4668,12 +4668,15 @@ static int __init thinkpad_acpi_module_init(void)
                thinkpad_acpi_module_exit();
                return ret;
        }
+       tp_features.platform_drv_registered = 1;
+
        ret = tpacpi_create_driver_attributes(&tpacpi_pdriver.driver);
        if (ret) {
                printk(IBM_ERR "unable to create sysfs driver attributes\n");
                thinkpad_acpi_module_exit();
                return ret;
        }
+       tp_features.platform_drv_attrs_registered = 1;
 
 
        /* Device initialization */
@@ -4756,8 +4759,11 @@ static void thinkpad_acpi_module_exit(void)
        if (tpacpi_pdev)
                platform_device_unregister(tpacpi_pdev);
 
-       tpacpi_remove_driver_attributes(&tpacpi_pdriver.driver);
-       platform_driver_unregister(&tpacpi_pdriver);
+       if (tp_features.platform_drv_attrs_registered)
+               tpacpi_remove_driver_attributes(&tpacpi_pdriver.driver);
+
+       if (tp_features.platform_drv_registered)
+               platform_driver_unregister(&tpacpi_pdriver);
 
        if (proc_dir)
                remove_proc_entry(IBM_PROC_DIR, acpi_root_dir);
diff --git a/drivers/misc/thinkpad_acpi.h b/drivers/misc/thinkpad_acpi.h
index 88af089..eee8809 100644
--- a/drivers/misc/thinkpad_acpi.h
+++ b/drivers/misc/thinkpad_acpi.h
@@ -246,6 +246,8 @@ static struct {
        u16 wan:1;
        u16 fan_ctrl_status_undef:1;
        u16 input_device_registered:1;
+       u16 platform_drv_registered:1;
+       u16 platform_drv_attrs_registered:1;
 } tp_features;
 
 struct thinkpad_id_data {
-
To unsubscribe from this list: send the line "unsubscribe git-commits-head" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to