extcon: Unregister compat class at module unload to fix oops
If you compile extcon with CONFIG_ANDROID and then load and unload the
module you get a simple oops as the driver does not unregister its
compat class and thus cannot register it again.
Full trace:
root@(none):~# modprobe extcon_class
root@(none):~# rmmod extcon_class
root@(none):~# modprobe extcon_class
------------[ cut here ]------------
WARNING: at fs/sysfs/dir.c:536 sysfs_add_one+0xde/0x100()
sysfs: cannot create duplicate filename '/class/switch'
Modules linked in: extcon_class(+) [last unloaded: extcon_class]
Call Trace:
9f451a00: [<
602a58bc>] printk+0x0/0xa8
9f451a18: [<
60039b43>] warn_slowpath_common+0x93/0xd0
9f451a28: [<
6012c6de>] sysfs_add_one+0xde/0x100
9f451a50: [<
601d3d90>] strcat+0x0/0x40
9f451a68: [<
60039cdc>] warn_slowpath_fmt+0x9c/0xa0
9f451a90: [<
6002fe32>] unblock_signals+0x0/0x84
9f451ab0: [<
60039c40>] warn_slowpath_fmt+0x0/0xa0
9f451ac0: [<
6002fe32>] unblock_signals+0x0/0x84
9f451ae8: [<
6012bd97>] sysfs_pathname.isra.10+0x57/0x70
9f451b00: [<
601d3d90>] strcat+0x0/0x40
9f451b18: [<
6012bd97>] sysfs_pathname.isra.10+0x57/0x70
9f451b48: [<
6012c6de>] sysfs_add_one+0xde/0x100
9f451b78: [<
6012c96f>] create_dir+0x8f/0x100
9f451bc0: [<
a0861000>] extcon_class_init+0x0/0x12 [extcon_class]
9f451bd8: [<
6012cda6>] sysfs_create_dir+0xa6/0x1c0
9f451be8: [<
601d89f1>] kvasprintf+0x81/0xa0
9f451bf8: [<
601cf0f0>] kobject_get+0x0/0x50
9f451c18: [<
601cf396>] kobject_add_internal+0x96/0x280
9f451c60: [<
a0861000>] extcon_class_init+0x0/0x12 [extcon_class]
9f451c78: [<
601cfb93>] kobject_add+0xd3/0x140
9f451cc0: [<
601cfac0>] kobject_add+0x0/0x140
9f451cd0: [<
6002fe32>] unblock_signals+0x0/0x84
9f451cf8: [<
6002fffc>] set_signals+0x29/0x3f
9f451d28: [<
600c1de1>] kmem_cache_alloc+0xe1/0x100
9f451d78: [<
601cffa0>] kobject_create_and_add+0x50/0xa0
9f451da8: [<
601fbe76>] class_compat_register+0x56/0x80
9f451dc8: [<
a085d118>] create_extcon_class+0x88/0xd0 [extcon_class]
9f451de8: [<
a0861010>] extcon_class_init+0x10/0x12 [extcon_class]
9f451df8: [<
600189a8>] do_one_initcall+0x48/0x1f0
9f451e20: [<
60061920>] blocking_notifier_call_chain+0x0/0x20
9f451e30: [<
60061920>] blocking_notifier_call_chain+0x0/0x20
9f451e58: [<
6007e3c3>] sys_init_module+0xa3/0x280
9f451e88: [<
6001e2ad>] handle_syscall+0x8d/0x90
9f451ea8: [<
60033370>] userspace+0x405/0x531
9f451ee8: [<
6001e380>] copy_chunk_to_user+0x0/0x40
9f451ef8: [<
6001e5cd>] do_op_one_page+0x14d/0x220
9f451fd8: [<
6001a355>] fork_handler+0x95/0xa0
---[ end trace
dd512cc03fe1c367 ]---
------------[ cut here ]------------
WARNING: at lib/kobject.c:196 kobject_add_internal+0x26e/0x280()
kobject_add_internal failed for switch with -EEXIST, don't try to
register things with the same name in the same directory.
Modules linked in: extcon_class(+) [last unloaded: extcon_class]
Call Trace:
9f451ad0: [<
602a58bc>] printk+0x0/0xa8
9f451ae8: [<
60039b43>] warn_slowpath_common+0x93/0xd0
9f451af8: [<
601cf56e>] kobject_add_internal+0x26e/0x280
9f451b18: [<
601cf140>] kobject_put+0x0/0x70
9f451b20: [<
a0861000>] extcon_class_init+0x0/0x12 [extcon_class]
9f451b38: [<
60039cdc>] warn_slowpath_fmt+0x9c/0xa0
9f451b88: [<
60039c40>] warn_slowpath_fmt+0x0/0xa0
9f451bc0: [<
a0861000>] extcon_class_init+0x0/0x12 [extcon_class]
9f451bd8: [<
6012cda6>] sysfs_create_dir+0xa6/0x1c0
9f451be8: [<
601d89f1>] kvasprintf+0x81/0xa0
9f451bf8: [<
601cf0f0>] kobject_get+0x0/0x50
9f451c18: [<
601cf56e>] kobject_add_internal+0x26e/0x280
9f451c60: [<
a0861000>] extcon_class_init+0x0/0x12 [extcon_class]
9f451c78: [<
601cfb93>] kobject_add+0xd3/0x140
9f451cc0: [<
601cfac0>] kobject_add+0x0/0x140
9f451cd0: [<
6002fe32>] unblock_signals+0x0/0x84
9f451cf8: [<
6002fffc>] set_signals+0x29/0x3f
9f451d28: [<
600c1de1>] kmem_cache_alloc+0xe1/0x100
9f451d78: [<
601cffa0>] kobject_create_and_add+0x50/0xa0
9f451da8: [<
601fbe76>] class_compat_register+0x56/0x80
9f451dc8: [<
a085d118>] create_extcon_class+0x88/0xd0 [extcon_class]
9f451de8: [<
a0861010>] extcon_class_init+0x10/0x12 [extcon_class]
9f451df8: [<
600189a8>] do_one_initcall+0x48/0x1f0
9f451e20: [<
60061920>] blocking_notifier_call_chain+0x0/0x20
9f451e30: [<
60061920>] blocking_notifier_call_chain+0x0/0x20
9f451e58: [<
6007e3c3>] sys_init_module+0xa3/0x280
9f451e88: [<
6001e2ad>] handle_syscall+0x8d/0x90
9f451ea8: [<
60033370>] userspace+0x405/0x531
9f451ee8: [<
6001e380>] copy_chunk_to_user+0x0/0x40
9f451ef8: [<
6001e5cd>] do_op_one_page+0x14d/0x220
9f451fd8: [<
6001a355>] fork_handler+0x95/0xa0
---[ end trace
dd512cc03fe1c368 ]---
kobject_create_and_add: kobject_add error: -17
------------[ cut here ]------------
WARNING: at drivers/extcon/extcon_class.c:545
create_extcon_class+0xbc/0xd0 [extcon_class]()
cannot allocate
Modules linked in: extcon_class(+) [last unloaded: extcon_class]
Call Trace:
9f451c80: [<
602a58bc>] printk+0x0/0xa8
9f451c98: [<
60039b43>] warn_slowpath_common+0x93/0xd0
9f451ca0: [<
6002fe32>] unblock_signals+0x0/0x84
9f451ca8: [<
a085d14c>] create_extcon_class+0xbc/0xd0 [extcon_class]
9f451cd0: [<
a0861000>] extcon_class_init+0x0/0x12 [extcon_class]
9f451ce8: [<
60039cdc>] warn_slowpath_fmt+0x9c/0xa0
9f451d20: [<
6002fe32>] unblock_signals+0x0/0x84
9f451d28: [<
60039c40>] warn_slowpath_fmt+0x0/0xa0
9f451d48: [<
6002fffc>] set_signals+0x29/0x3f
9f451d58: [<
601cf172>] kobject_put+0x32/0x70
9f451d78: [<
600c22c3>] kfree+0xb3/0x100
9f451da8: [<
601fbe9a>] class_compat_register+0x7a/0x80
9f451dc8: [<
a085d14c>] create_extcon_class+0xbc/0xd0 [extcon_class]
9f451de8: [<
a0861010>] extcon_class_init+0x10/0x12 [extcon_class]
9f451df8: [<
600189a8>] do_one_initcall+0x48/0x1f0
9f451e20: [<
60061920>] blocking_notifier_call_chain+0x0/0x20
9f451e30: [<
60061920>] blocking_notifier_call_chain+0x0/0x20
9f451e58: [<
6007e3c3>] sys_init_module+0xa3/0x280
9f451e88: [<
6001e2ad>] handle_syscall+0x8d/0x90
9f451ea8: [<
60033370>] userspace+0x405/0x531
9f451ee8: [<
6001e380>] copy_chunk_to_user+0x0/0x40
9f451ef8: [<
6001e5cd>] do_op_one_page+0x14d/0x220
9f451fd8: [<
6001a355>] fork_handler+0x95/0xa0
---[ end trace
dd512cc03fe1c369 ]---
FATAL: Error inserting extcon_class
(/lib/modules/
3.6.0-rc6-00178-g811315f/kernel/drivers/extcon/extcon_class.ko):
Cannot allocate memory
This patch fixes this.
Cc: stable@vger.kernel.org
Signed-off-by: Peter Huewe <peterhuewe@gmx.de>
Signed-off-by: Chanwoo Choi <cw00.choi@samsung.com>