Aristeu Rozanski 9a6b1efa6f USB: usb_serial: clean tty reference in the last close
When a usb serial adapter is used as console, the usb serial console
driver bumps the open_count on the port struct used but doesn't attach
a real tty to it (only a fake one temporaly). If this port is opened later
using the regular character device interface, the open method won't
initialize the port, which is the expected, and will receive a brand new
tty struct created by tty layer, which will be stored in port->tty.

When the last close is issued, open_count won't be 0 because of the
console usage and the port->tty will still contain the old tty value. This
is the last ttyUSB<n> close so the allocated tty will be freed by the
tty layer. The usb_serial and usb_serial_port are still in use by the
console, so port_free() won't be called (serial_close() ->
usb_serial_put() -> destroy_serial() -> port_free()), so the scheduled
work (port->work, usb_serial_port_work()) will still run. And
usb_serial_port_work() does:
(...)
        tty = port->tty;
        if (!tty)
                return;

        tty_wakeup(tty);
which causes (manually copied):

Faulting instruction address: 0x6b6b6b68
Oops: Kernel access of bad area, sig: 11 [#1]
PREEMPT PowerMac
Modules linked in: binfmt_misc ipv6 nfs lockd nfs_acl sunrpc dm_snapshot dm_mirror dm_mod hfsplus uinput ams input_polldev genrtc cpufreq_powersave i2c_powermac therm_adt746x snd_aoa_codec_tas snd_aoa_fabric_layout snd_aoa joydev snd_aoa_i2sbus snd_pcm_oss snd_mixer_oss snd_pcm snd_timer snd_page_alloc pmac_zilog serial_core evdev ide_cd cdrom snd appletouch soundcore snd_aoa_soundbus bcm43xx firmware_class usbhid ieee80211softmac ff_memless firewire_ohci firewire_core ieee80211 ieee80211_crypt crc_itu_t sungem sungem_phy uninorth_agp agpart ssb
NIP: 6b6b6b68 LR: c01b2108 CTR: 6b6b6b6b
REGS: c106de80 TRAP: 0400   Not tainted  (2.6.24-rc2)
MSR: 40009032 <EE,ME,IR,DR>  CR: 82004024  XER: 00000000
TASK = c106b4c0[5] 'events/0' THREAD: c106c000
GPR00: 6b6b6b6b c106df30 c106b4c0 c2d613a0 00009032 00000001 00001a00 00000001
GPR08: 00000008 00000000 00000000 c106c000 42004028 00000000 016ffbe0 0171a724
GPR16: 016ffcf4 00240e24 00240e70 016fee68 016ff9a4 c03046c4 c0327f50 c03046fc
GPR24: c106b6b9 c106b4c0 c101d610 c106c000 c02160fc c1eac1dc c2d613ac c2d613a0
NIP [6b6b6b68] 0x6b6b6b68
LR [c01b2108] tty_wakeup+0x6c/0x9c
Call Trace:
[c106df30] [c01b20e8] tty_wakeup+0x4c/0x9c (unreliable)
[c106df40] [c0216138] usb_serial_port_work+0x3c/0x78
[c106df50] [c00432e8] run_workqueue+0xc4/0x15c
[c106df90] [c0043798] worker_thread+0xa0/0x124
[c106dfd0] [c0048224] kthread+0x48/0x84
[c106dff0] [c00129bc] kernel_thread+0x44/0x60
Instruction dump:
XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX
XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX
Slab corruption: size-2048 start=c2d613a0, len=2048
Redzone: 0x9f911029d74e35b/0x9f911029d74e35b.
Last user: [<c01b16d8>](release_one_tty+0xbc/0xf4)
050: 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b
Prev obj: start=c2d60b88, len=2048
Redzone: 0x9f911029d74e35b/0x9f911029d74e35b.
Last user: [<c00f30ec>](show_stat+0x410/0x428)
000: 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b
010: 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b

This patch avoids this, clearing port->tty considering if the port is
used as serial console or not

Signed-off-by: Aristeu Rozanski <arozansk@redhat.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
2008-02-01 14:34:50 -08:00
..
2008-01-28 14:54:13 -08:00
2006-09-26 17:40:24 -04:00
2007-10-14 20:17:39 -07:00
2007-10-17 08:43:03 -07:00
2007-12-26 19:36:35 -08:00
2006-12-04 02:00:22 -05:00
2007-09-11 04:22:16 -07:00
2007-10-18 14:37:20 -07:00
2007-10-10 16:51:59 -07:00
2008-01-23 05:24:15 -05:00
2008-01-28 15:00:14 -08:00
2006-12-02 21:22:55 -08:00
2007-02-20 17:10:15 -08:00
2007-10-17 08:42:45 -07:00
2007-10-17 08:43:07 -07:00
2007-10-18 14:37:29 -07:00
2007-10-19 11:53:42 -07:00
2007-10-19 11:53:42 -07:00
2006-12-08 08:28:39 -08:00
2008-02-01 11:34:49 +01:00
2008-01-29 21:55:15 +01:00
2006-12-07 08:39:20 -08:00
2007-07-31 10:43:05 -05:00
2008-01-28 14:54:10 -08:00
2007-01-30 08:26:45 -08:00
2008-01-23 05:24:14 -05:00
2007-10-19 11:53:36 -07:00
2007-10-19 11:53:36 -07:00
2008-01-30 13:31:48 +01:00
2008-01-28 23:21:18 +01:00
2008-01-28 23:21:18 +01:00
2008-01-28 23:21:18 +01:00
2007-12-06 17:40:19 -05:00
2007-07-10 17:18:59 -07:00
2007-10-17 08:42:52 -07:00
2008-01-25 21:08:02 +01:00
2007-11-19 21:43:22 -05:00
2008-01-30 13:31:10 +01:00
2007-07-17 10:23:04 -07:00
2007-05-10 18:24:13 +02:00
2007-10-16 09:43:09 -07:00
2007-10-21 02:37:45 -04:00
2007-10-19 11:53:36 -07:00
2007-12-20 17:32:12 +00:00
2007-05-08 11:15:26 -07:00
2007-07-09 08:22:54 +01:00
2007-10-20 02:00:58 +01:00
2007-10-18 14:37:21 -07:00
2007-02-09 17:39:36 -05:00
2008-01-23 21:23:13 -05:00
2007-02-11 11:18:07 -08:00
2007-07-19 10:04:54 -07:00
2007-10-22 08:13:19 -07:00
2007-10-22 08:13:20 -07:00
2008-01-30 13:31:56 +01:00
2007-10-17 08:42:51 -07:00
2008-01-28 23:21:18 +01:00
2007-06-01 08:18:29 -07:00
2007-10-29 07:41:32 -07:00
2007-10-22 08:13:21 -07:00
2007-10-17 08:43:02 -07:00
2007-05-09 08:57:56 +02:00
2007-10-17 08:42:48 -07:00
2007-10-17 08:43:01 -07:00
2008-01-28 23:58:27 -05:00
2007-07-18 18:29:37 -04:00
2007-11-29 09:24:54 -08:00
2006-10-02 07:57:12 -07:00
2007-07-10 00:35:17 -04:00
2008-01-25 21:08:33 +01:00
2007-04-28 11:01:07 -04:00
2008-01-28 14:51:22 +01:00
2007-07-19 10:04:41 -07:00
2007-03-16 00:59:29 -04:00
2008-01-30 13:30:27 +01:00
2008-01-27 18:14:50 +01:00
2006-12-10 21:21:29 +01:00
2008-01-27 18:14:52 +01:00
2007-10-16 11:21:00 +02:00
2007-10-22 00:56:52 -04:00
2007-07-16 09:05:34 -07:00
2007-10-10 16:51:59 -07:00
2008-01-28 15:08:27 -08:00
2007-10-17 08:42:52 -07:00
2008-01-28 15:07:58 -08:00
2007-07-14 18:55:06 -07:00
2007-10-10 16:52:04 -07:00
2008-01-28 15:07:57 -08:00
2008-01-28 14:55:09 -08:00
2008-01-28 14:55:09 -08:00
2006-09-28 18:02:29 -07:00
2007-12-05 05:37:32 -08:00
2008-01-31 19:26:46 -08:00
2007-07-16 09:05:50 -07:00
2006-10-10 15:37:22 -07:00
2006-12-02 21:21:21 -08:00
2006-12-07 08:39:47 -08:00
2007-10-18 14:37:32 -07:00
2006-10-04 00:31:09 -07:00
2008-01-31 19:28:20 -08:00
2006-11-30 05:24:39 +01:00
2008-01-28 23:58:27 -05:00
2007-07-11 15:03:53 +01:00
2007-04-25 22:25:52 -07:00
2007-11-05 15:12:32 -08:00
2007-10-17 08:42:52 -07:00
2007-11-29 09:24:52 -08:00
2007-10-19 11:53:49 -07:00
2008-01-08 16:10:35 -08:00
2007-07-18 08:47:40 -07:00
2008-01-24 20:40:05 -08:00
2007-05-09 12:30:53 -07:00
2008-01-25 21:08:34 +01:00
2007-12-07 09:06:53 +00:00
2007-10-25 15:02:50 +10:00
2007-10-25 15:02:50 +10:00
2007-07-17 10:23:03 -07:00
2008-01-30 13:33:13 +01:00
2007-07-17 10:23:13 -07:00
2006-07-31 15:44:29 -04:00
2007-07-24 12:24:59 -07:00
2007-07-16 09:05:34 -07:00
2006-06-05 12:29:17 -07:00
2007-07-18 08:47:45 -07:00
2007-10-19 11:53:55 -07:00
2007-05-09 12:30:49 -07:00
2007-10-10 16:54:03 -07:00
2007-05-03 10:52:22 +03:00
2007-10-23 15:49:54 +10:00
2008-01-28 23:21:18 +01:00
2006-11-30 04:40:22 +01:00
2007-07-16 09:05:42 -07:00
2007-10-19 11:53:44 -07:00
2007-01-23 00:34:54 -05:00
2007-12-06 17:37:59 -05:00
2007-07-16 09:05:51 -07:00
2008-01-28 14:56:29 -08:00
2008-01-28 14:54:18 -08:00
2007-05-09 12:30:54 -07:00
2008-01-30 02:06:08 -05:00
2007-10-17 08:42:58 -07:00
2006-08-27 11:01:32 -07:00
2007-05-04 17:59:07 -07:00
2007-10-16 09:43:02 -07:00
2007-12-06 17:35:41 -05:00
2007-05-08 11:15:05 -07:00
2007-05-05 14:15:32 -07:00
2008-01-28 23:21:18 +01:00
2007-10-17 08:42:44 -07:00
2008-01-30 23:27:58 +01:00
2007-10-19 11:53:41 -07:00
2007-10-19 11:53:41 -07:00
2008-01-31 19:28:36 -08:00
2007-04-17 16:36:26 -07:00
2007-12-27 23:55:13 -05:00
2007-07-26 11:35:21 -07:00
2006-10-03 23:01:26 +02:00
2007-07-16 09:05:50 -07:00
2007-10-19 11:53:41 -07:00
2008-01-28 15:01:36 -08:00
2007-10-17 08:42:45 -07:00
2008-01-30 13:30:53 +01:00
2007-10-17 08:42:56 -07:00
2007-10-16 09:42:53 -07:00
2008-01-25 21:08:24 +01:00
2008-01-25 21:08:24 +01:00
2008-01-25 21:08:24 +01:00
2008-01-25 21:08:24 +01:00
2007-07-18 08:47:40 -07:00
2008-01-30 13:31:47 +01:00
2007-10-22 08:13:20 -07:00
2006-06-25 10:01:06 -07:00
2007-07-21 18:37:10 -07:00
2008-01-31 19:26:46 -08:00
2007-05-17 05:23:06 -07:00
2006-06-25 10:01:14 -07:00
2007-11-29 09:24:54 -08:00
2007-07-16 09:05:50 -07:00
2007-10-16 09:43:17 -07:00
2007-10-19 11:53:44 -07:00
2007-11-29 09:24:53 -08:00
2007-10-19 11:53:44 -07:00
2007-07-22 11:03:37 -07:00
2007-10-17 08:43:01 -07:00
2008-01-02 13:04:48 -08:00
2008-01-02 13:04:48 -08:00
2008-01-02 13:04:48 -08:00
2007-02-20 17:10:14 -08:00
2007-05-21 21:47:27 -07:00
2008-01-25 21:08:33 +01:00
2008-01-31 19:28:30 -08:00
2007-07-16 09:05:46 -07:00
2008-01-30 13:31:20 +01:00
2008-01-30 13:31:20 +01:00
2008-01-30 13:31:20 +01:00
2008-01-25 21:08:34 +01:00
2007-05-08 11:15:18 -07:00
2006-10-01 00:39:18 -07:00
2007-05-09 12:30:57 -07:00
2008-01-31 22:05:48 +01:00
2007-02-20 17:10:13 -08:00
2007-05-11 08:29:34 -07:00
2006-11-30 05:32:19 +01:00
2007-10-17 08:42:53 -07:00
2007-05-11 08:29:36 -07:00
2007-11-26 20:42:19 +01:00
2006-12-02 21:21:08 -08:00
2006-09-28 17:53:59 -07:00
2007-05-11 08:29:35 -07:00
2007-05-11 08:29:35 -07:00
2008-01-24 20:40:26 -08:00
2006-12-15 08:47:51 -08:00
2007-09-19 11:24:18 -07:00
2006-10-01 00:39:19 -07:00
2007-12-26 19:36:35 -08:00
2007-10-23 13:47:31 -05:00
2007-10-23 15:49:54 +10:00
2007-10-23 15:49:54 +10:00
2007-10-23 15:49:55 +10:00
2007-10-23 15:49:54 +10:00
2007-10-23 15:49:54 +10:00
2007-07-17 10:22:59 -07:00
2007-10-17 08:42:56 -07:00
2007-10-19 11:53:34 -07:00
2007-12-06 17:40:14 -05:00
2008-01-28 14:58:25 -08:00
2007-02-11 11:18:05 -08:00