From 1e4de81653bae3f5e6d06e3384853d31d564bbec Mon Sep 17 00:00:00 2001 From: Axel Lin Date: Wed, 29 Jun 2011 15:57:53 +0800 Subject: firmware: gsmi: remove sysfs entries when unload the module This patch removes sysfs entries in gsmi_exit() and gsmi_init() error path. Also move the driver successfully loaded message to the end of gsmi_init() and return proper error if register_efivars() fails. Signed-off-by: Axel Lin Signed-off-by: Greg Kroah-Hartman --- drivers/firmware/google/gsmi.c | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) (limited to 'drivers/firmware') diff --git a/drivers/firmware/google/gsmi.c b/drivers/firmware/google/gsmi.c index fa7f0b3e81dd..68810fd1a59d 100644 --- a/drivers/firmware/google/gsmi.c +++ b/drivers/firmware/google/gsmi.c @@ -869,8 +869,6 @@ static __init int gsmi_init(void) goto out_err; } - printk(KERN_INFO "gsmi version " DRIVER_VERSION " loaded\n"); - /* Register in the firmware directory */ ret = -ENOMEM; gsmi_kobj = kobject_create_and_add("gsmi", firmware_kobj); @@ -890,12 +888,13 @@ static __init int gsmi_init(void) ret = sysfs_create_files(gsmi_kobj, gsmi_attrs); if (ret) { printk(KERN_INFO "gsmi: Failed to add attrs"); - goto out_err; + goto out_remove_bin_file; } - if (register_efivars(&efivars, &efivar_ops, gsmi_kobj)) { + ret = register_efivars(&efivars, &efivar_ops, gsmi_kobj); + if (ret) { printk(KERN_INFO "gsmi: Failed to register efivars\n"); - goto out_err; + goto out_remove_sysfs_files; } register_reboot_notifier(&gsmi_reboot_notifier); @@ -903,9 +902,15 @@ static __init int gsmi_init(void) atomic_notifier_chain_register(&panic_notifier_list, &gsmi_panic_notifier); + printk(KERN_INFO "gsmi version " DRIVER_VERSION " loaded\n"); + return 0; - out_err: +out_remove_sysfs_files: + sysfs_remove_files(gsmi_kobj, gsmi_attrs); +out_remove_bin_file: + sysfs_remove_bin_file(gsmi_kobj, &eventlog_bin_attr); +out_err: kobject_put(gsmi_kobj); gsmi_buf_free(gsmi_dev.param_buf); gsmi_buf_free(gsmi_dev.data_buf); @@ -925,6 +930,8 @@ static void __exit gsmi_exit(void) &gsmi_panic_notifier); unregister_efivars(&efivars); + sysfs_remove_files(gsmi_kobj, gsmi_attrs); + sysfs_remove_bin_file(gsmi_kobj, &eventlog_bin_attr); kobject_put(gsmi_kobj); gsmi_buf_free(gsmi_dev.param_buf); gsmi_buf_free(gsmi_dev.data_buf); -- cgit v1.2.3-59-g8ed1b