From: navin Date: Wed, 19 Sep 2012 11:37:27 +0000 (+0530) Subject: staging: usbip: stub_dev: Fixed oops during removal of usbip_host X-Git-Tag: next-20120924~26^2~47 X-Git-Url: https://git.karo-electronics.de/?a=commitdiff_plain;h=b7caecb8c93c0112c060f60f6e0c195da054e309;p=karo-tx-linux.git staging: usbip: stub_dev: Fixed oops during removal of usbip_host stub_shutdown_connection() should set kernel thread pointers to NULL after killing them. so that at the time of usbip_host removal stub_shutdown_connection() doesn't try to kill kernel threads which are already killed. [ 1504.312158] BUG: unable to handle kernel NULL pointer dereference at (null) [ 1504.315833] IP: [] exit_creds+0x1f/0x70 [ 1504.317688] PGD 41f1c067 PUD 41d0f067 PMD 0 [ 1504.319611] Oops: 0000 [#2] SMP [ 1504.321480] Modules linked in: vhci_hcd(O) usbip_host(O-) usbip_core(O) uas usb_storage joydev parport_pc bnep rfcomm ppdev binfmt_misc snd_hda_codec_hdmi snd_hda_codec_conexant snd_hda_intel snd_hda_codec snd_hwdep snd_pcm snd_seq_midi arc4 snd_rawmidi snd_seq_midi_event snd_seq ath9k mac80211 ath9k_common ath9k_hw snd_timer snd_seq_device snd ath i915 drm_kms_helper drm psmouse cfg80211 coretemp soundcore lpc_ich i2c_algo_bit snd_page_alloc video intel_ips wmi btusb mac_hid bluetooth ideapad_laptop lp sparse_keymap serio_raw mei microcode parport r8169 [ 1504.329666] CPU 1 [ 1504.329687] Pid: 2434, comm: usbip_eh Tainted: G D O 3.6.0-rc31+ #2 LENOVO 20042 /Base Board Product Name [ 1504.333502] RIP: 0010:[] [] exit_creds+0x1f/0x70 [ 1504.335371] RSP: 0018:ffff880041c7fdd0 EFLAGS: 00010282 [ 1504.337226] RAX: 0000000000000000 RBX: ffff880041c2db40 RCX: ffff880041e4ae50 [ 1504.339101] RDX: 0000000000000044 RSI: 0000000000000286 RDI: 0000000000000000 [ 1504.341027] RBP: ffff880041c7fde0 R08: ffff880041c7e000 R09: 0000000000000000 [ 1504.342934] R10: 0000000000000001 R11: 0000000000000000 R12: 0000000000000000 [ 1504.344840] R13: 0000000000000000 R14: ffff88004d448000 R15: ffff880041c7fea0 [ 1504.346743] FS: 0000000000000000(0000) GS:ffff880077440000(0000) knlGS:0000000000000000 [ 1504.348671] CS: 0010 DS: 0000 ES: 0000 CR0: 000000008005003b [ 1504.350612] CR2: 0000000000000000 CR3: 0000000041d0d000 CR4: 00000000000007e0 [ 1504.352723] DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000 [ 1504.354734] DR3: 0000000000000000 DR6: 00000000ffff0ff0 DR7: 0000000000000400 [ 1504.356737] Process usbip_eh (pid: 2434, threadinfo ffff880041c7e000, task ffff88004d448000) [ 1504.358711] Stack: [ 1504.360635] ffff880041c7fde0 ffff880041c2db40 ffff880041c7fe00 ffffffff81052aaa [ 1504.362589] ffff880041c2db40 0000000000000000 ffff880041c7fe30 ffffffff8107a148 [ 1504.364539] ffff880041e4ae10 ffff880041e4ae00 ffff88004d448000 ffff88004d448000 [ 1504.366470] Call Trace: [ 1504.368368] [] __put_task_struct+0x4a/0x140 [ 1504.370307] [] kthread_stop+0x108/0x110 [ 1504.370312] [] stub_shutdown_connection+0x3e/0x1b0 [usbip_host] [ 1504.370315] [] event_handler_loop+0x70/0x140 [usbip_core] [ 1504.370318] [] ? add_wait_queue+0x60/0x60 [ 1504.370320] [] ? usbip_stop_eh+0x30/0x30 [usbip_core] [ 1504.370322] [] kthread+0x93/0xa0 [ 1504.370327] [] kernel_thread_helper+0x4/0x10 [ 1504.370330] [] ? flush_kthread_worker+0xb0/0xb0 [ 1504.370332] [] ? gs_change+0x13/0x13 [ 1504.370351] Code: 0b 0f 0b 66 0f 1f 84 00 00 00 00 00 55 48 89 e5 53 48 83 ec 08 66 66 66 66 90 48 8b 87 58 04 00 00 48 89 fb 48 8b bf 50 04 00 00 <8b> 00 48 c7 83 50 04 00 00 00 00 00 00 f0 ff 0f 0f 94 c0 84 c0 [ 1504.370353] RIP [] exit_creds+0x1f/0x70 [ 1504.370353] RSP [ 1504.370354] CR2: 0000000000000000 [ 1504.401376] ---[ end trace 1971ce612a16727a ]--- Signed-off-by: navin patidar Acked-by: Dan Carpenter Signed-off-by: Greg Kroah-Hartman --- diff --git a/drivers/staging/usbip/stub_dev.c b/drivers/staging/usbip/stub_dev.c index 92ced35e6b7f..c8d79a7f0e0e 100644 --- a/drivers/staging/usbip/stub_dev.c +++ b/drivers/staging/usbip/stub_dev.c @@ -187,10 +187,14 @@ static void stub_shutdown_connection(struct usbip_device *ud) } /* 1. stop threads */ - if (ud->tcp_rx) + if (ud->tcp_rx) { kthread_stop_put(ud->tcp_rx); - if (ud->tcp_tx) + ud->tcp_rx = NULL; + } + if (ud->tcp_tx) { kthread_stop_put(ud->tcp_tx); + ud->tcp_tx = NULL; + } /* * 2. close the socket