From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: From: Feng Hong To: , , CC: , Feng Hong Subject: [PATCH] Bluetooth: Avoid dumplicate conn dev register Date: Tue, 9 Apr 2013 14:43:46 +0800 Message-ID: <1365489826-30652-1-git-send-email-hongfeng@marvell.com> MIME-Version: 1.0 Content-Type: text/plain List-ID: Once hit dumplicate connection device register: [ 651.865509] WARNING: at lib/kobject.c:198 kobject_add_internal+0x1f4/0x264() [ 651.872894] kobject_add_internal failed for hci0:1 with -EEXIST, don't try to register things with the same name in the same directory. [ 651.885650] Modules linked in: runcase_sysfs(O) sd8xxx(O) mlan(O) bt8xxx(O) cidatattydev(O) gs_diag(O) diag(O) gs_modem(O) ccinetdev(O) cci_datastub(O) citty(O) msocketk(O) smsmdtv seh(O) cploaddev(O) blcr(O) blcr_imports(O) geu(O) galcore(O) [ 651.910125] [] (unwind_backtrace+0x0/0x11c) from [] (warn_slowpath_common+0x4c/0x64) [ 651.920013] [] (warn_slowpath_common+0x4c/0x64) from [] (warn_slowpath_fmt+0x2c/0x3c) [ 651.930053] [] (warn_slowpath_fmt+0x2c/0x3c) from [] (kobject_add_internal+0x1f4/0x264) [ 651.940246] [] (kobject_add_internal+0x1f4/0x264) from [] (kobject_add+0x68/0x8c) [ 651.949890] [] (kobject_add+0x68/0x8c) from [] (device_add+0x104/0x5b8) [ 651.958831] [] (device_add+0x104/0x5b8) from [] (hci_conn_add_sysfs+0x4c/0x80) [ 651.968109] [] (hci_conn_add_sysfs+0x4c/0x80) from [] (hci_event_packet+0x530/0x6428) [ 651.978149] [] (hci_event_packet+0x530/0x6428) from [] (hci_rx_work+0xd0/0x390) [ 651.987640] [] (hci_rx_work+0xd0/0x390) from [] (process_one_work+0x280/0x488) [ 651.996978] [] (process_one_work+0x280/0x488) from [] (worker_thread+0x214/0x3b4) [ 652.006652] [] (worker_thread+0x214/0x3b4) from [] (kthread+0x80/0x8c) [ 652.015228] [] (kthread+0x80/0x8c) from [] (kernel_thread_exit+0x0/0x8) [ 652.023925] ---[ end trace 7d6ac73956376f0a ]--- [ 652.035034] Bluetooth: Failed to register connection device dev->device_private struct will be freed in device_add, later on anyone go through father/child list will meet panic like this: [ 668.902984] Unable to handle kernel NULL pointer dereference at virtual address 00000004 [ 668.903015] pgd = c0104000 [ 668.903015] [00000004] *pgd=00000000 [ 668.903045] Internal error: Oops: 805 [#1] PREEMPT SMP ARM [ 668.903106] Modules linked in: runcase_sysfs(O) sd8xxx(O) mlan(O) bt8xxx(O) cidatattydev(O) gs_diag(O) diag(O) gs_modem(O) ccinetdev(O) cci_datastub(O) citty(O) msocketk(O) smsmdtv seh(O ) cploaddev(O) blcr(O) blcr_imports(O) geu(O) galcore(O) [ 668.903228] CPU: 1 Tainted: G W O (3.4.5+ #1) [ 668.903259] PC is at klist_release+0x30/0xe0 [ 668.903289] LR is at warn_slowpath_null+0x18/0x1c [ 668.908081] [] (klist_release+0x30/0xe0) from [] (klist_dec_and_del+0x34/0x44) [ 668.908142] [] (klist_dec_and_del+0x34/0x44) from [] (klist_next+0x2c/0xd8) [ 668.908172] [] (klist_next+0x2c/0xd8) from [] (device_for_each_child+0x44/0x70) [ 668.908233] [] (device_for_each_child+0x44/0x70) from [] (__device_suspend+0x20/0x340) [ 668.908294] [] (__device_suspend+0x20/0x340) from [] (dpm_suspend+0xa8/0x210) [ 668.908325] [] (dpm_suspend+0xa8/0x210) from [] (suspend_devices_and_enter+0xd4/0x390) [ 668.908386] [] (suspend_devices_and_enter+0xd4/0x390) from [] (pm_suspend+0x150/0x234) [ 668.908416] [] (pm_suspend+0x150/0x234) from [] (try_to_suspend+0x64/0xa8) [ 668.908477] [] (try_to_suspend+0x64/0xa8) from [] (process_one_work+0x280/0x488) [ 668.908508] [] (process_one_work+0x280/0x488) from [] (worker_thread+0x214/0x3b4) [ 668.908569] [] (worker_thread+0x214/0x3b4) from [] (kthread+0x80/0x8c) [ 668.908630] [] (kthread+0x80/0x8c) from [] (kernel_thread_exit+0x0/0x8) This patch is trying to add protection in this case. Change-Id: I028d9bda88139bdaba475a5cebbf27acbcaf3a05 Signed-off-by: Feng Hong --- net/bluetooth/hci_sysfs.c | 5 +++++ 1 files changed, 5 insertions(+), 0 deletions(-) diff --git a/net/bluetooth/hci_sysfs.c b/net/bluetooth/hci_sysfs.c index 23b4e24..5c23d13 100644 --- a/net/bluetooth/hci_sysfs.c +++ b/net/bluetooth/hci_sysfs.c @@ -116,6 +116,11 @@ void hci_conn_add_sysfs(struct hci_conn *conn) { struct hci_dev *hdev = conn->hdev; + if (device_is_registered(&conn->dev)) { + BT_ERR("Duplicate register connection device"); + return; + } + BT_DBG("conn %p", conn); dev_set_name(&conn->dev, "%s:%d", hdev->name, conn->handle); -- 1.7.0.4