1
linux/drivers/char
Dave Young f278a2f7bb tty: Fix regressions caused by commit b50989dc
The following commit made console open fails while booting:

	commit b50989dc44
	Author: Alan Cox <alan@linux.intel.com>
	Date:   Sat Sep 19 13:13:22 2009 -0700

	tty: make the kref destructor occur asynchronously

Due to tty release routines run in a workqueue now, error like the
following will be reported while booting:

INIT open /dev/console Input/output error

It also causes hibernation regression to appear as reported at
http://bugzilla.kernel.org/show_bug.cgi?id=14229

The reason is that now there's latency issue with closing, but when
we open a "closing not finished" tty, -EIO will be returned.

Fix it as per the following Alan's suggestion:

  Fun but it's actually not a bug and the fix is wrong in itself as
  the port may be closing but not yet being destructed, in which case
  it seems to do the wrong thing.  Opening a tty that is closing (and
  could be closing for long periods) is supposed to return -EIO.

  I suspect a better way to deal with this and keep the old console
  timing is to split tty->shutdown into two functions.

  tty->shutdown() - called synchronously just before we dump the tty
  onto the waitqueue for destruction

  tty->cleanup() - called when the destructor runs.

  We would then do the shutdown part which can occur in IRQ context
  fine, before queueing the rest of the release (from tty->magic = 0
  ...  the end) to occur asynchronously

  The USB update in -next would then need a call like

       if (tty->cleanup)
               tty->cleanup(tty);

  at the top of the async function and the USB shutdown to be split
  between shutdown and cleanup as the USB resource cleanup and final
  tidy cannot occur synchronously as it needs to sleep.

  In other words the logic becomes

       final kref put
               make object unfindable

       async
               clean it up

Signed-off-by: Dave Young <hidave.darkstar@gmail.com>
[ rjw: Rebased on top of 2.6.31-git, reworked the changelog. ]
Signed-off-by: "Rafael J. Wysocki" <rjw@sisk.pl>
[ Changed serial naming to match new rules, dropped tty_shutdown as per
  comments from Alan Stern  - Linus ]
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
2009-09-27 13:35:16 -07:00
..
agp const: mark struct vm_struct_operations 2009-09-27 11:39:25 -07:00
hw_random virtio: add virtio IDs file 2009-09-23 22:26:32 +09:30
ip2 tty: rewrite the ldisc locking 2009-06-11 08:51:01 -07:00
ipmi trivial: add __init macro/ fix of __exit macro location in ipmi_poweroff.c 2009-09-21 15:14:58 +02:00
mwave mwave: fix read buffer overflow 2009-09-24 07:21:03 -07:00
pcmcia pcmcia: fix read buffer overflow 2009-09-22 07:17:42 -07:00
rio drivers/char/rio/rioctrl.c: off by one error in rioctrl.c 2009-09-24 07:21:03 -07:00
tpm Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jmorris/security-testing-2.6 2009-09-23 15:18:57 -07:00
xilinx_hwicap
.gitignore
amiserial.c headers: smp_lock.h redux 2009-07-12 12:22:34 -07:00
apm-emulation.c
applicom.c applicom: Auto-load applicom module when device opened. 2009-04-06 14:36:30 -07:00
applicom.h
bfin_jtag_comm.c bfin_jtag_comm: clean up printk usage 2009-06-22 11:32:23 -07:00
bfin-otp.c bfin-otp: add writing support 2009-09-24 07:21:03 -07:00
briq_panel.c
bsr.c powerpc/BSR: Fix BSR to allow mmap of small BSR on 64k kernel 2009-06-26 14:37:26 +10:00
cd1865.h
ChangeLog
consolemap.c
cp437.uni
cs5535_gpio.c
cyclades.c serial: move delta_msr_wait into the tty_port 2009-09-19 13:13:31 -07:00
defkeymap.c_shipped
defkeymap.map
digi1.h
digiFep1.h
digiPCI.h
ds1302.c
ds1620.c
dsp56k.c
dtlk.c dtlk: off by one in {read,write}_tts() 2009-06-19 16:46:06 -07:00
efirtc.c
epca.c trivial: remove unnecessary semicolons 2009-09-21 15:14:58 +02:00
epca.h
epcaconfig.h
esp.c serial: move delta_msr_wait into the tty_port 2009-09-19 13:13:31 -07:00
generic_nvram.c powerpc/nvram: Enable use Generic NVRAM driver for different size chips 2009-09-11 16:02:11 +10:00
generic_serial.c
genrtc.c
hangcheck-timer.c
hpet.c hpet: hpet driver periodic timer setup bug fixes 2009-09-24 07:21:03 -07:00
hvc_beat.c
hvc_console.c hvc_console: Provide (un)locked version for hvc_resize() 2009-09-24 15:12:47 +10:00
hvc_console.h hvc_console: Provide (un)locked version for hvc_resize() 2009-09-24 15:12:47 +10:00
hvc_irq.c
hvc_iseries.c drivers/hvc: Add missing __devexit_p() 2009-06-16 14:15:44 +10:00
hvc_iucv.c hvc_console: Provide (un)locked version for hvc_resize() 2009-09-24 15:12:47 +10:00
hvc_rtas.c
hvc_udbg.c
hvc_vio.c hvc_console: Add __init and __exit to hvc_vio 2009-08-28 14:24:11 +10:00
hvc_xen.c
hvcs.c Merge commit 'origin/master' into next 2009-06-18 11:16:55 +10:00
hvsi.c powerpc/hvsi: Avoid calculating possibly-invalid address 2009-08-20 10:29:28 +10:00
i8k.c
isicom.c isicom: split the open method for the isicom device 2009-09-19 13:13:27 -07:00
istallion.c headers: smp_lock.h redux 2009-07-12 12:22:34 -07:00
Kconfig drivers/char/uv_mmtimer.c: add memory mapped RTC driver for UV 2009-09-24 07:21:03 -07:00
keyboard.c Input: keyboard - remove warning about raw mode not supported 2009-04-20 21:21:24 -07:00
lp.c
Makefile drivers/char/uv_mmtimer.c: add memory mapped RTC driver for UV 2009-09-24 07:21:03 -07:00
mbcs.c [IA64] mbcs: fix printk format warnings 2009-09-15 08:42:00 -07:00
mbcs.h
mem.c const: mark struct vm_struct_operations 2009-09-27 11:39:25 -07:00
misc.c seq_file: constify seq_operations 2009-09-23 07:39:29 -07:00
mmtimer.c
moxa.c headers: smp_lock.h redux 2009-07-12 12:22:34 -07:00
moxa.h
mspec.c const: mark struct vm_struct_operations 2009-09-27 11:39:25 -07:00
mxser.c tty: Char: mxser, use THRE for ASPP_OQUEUE ioctl 2009-09-19 13:13:38 -07:00
mxser.h
n_hdlc.c headers: smp_lock.h redux 2009-07-12 12:22:34 -07:00
n_r3964.c headers: smp_lock.h redux 2009-07-12 12:22:34 -07:00
n_tty.c n_tty: move echoctl check and clean up logic 2009-09-19 13:13:34 -07:00
nozomi.c tty: fix chars_in_buffers 2009-07-20 16:38:43 -07:00
nsc_gpio.c
nvram.c
nwbutton.c
nwbutton.h
nwflash.c
pc8736x_gpio.c
ppdev.c ppdev: reduce kernel log spam 2009-06-18 13:03:54 -07:00
ps3flash.c ps3flash: Always read chunks of 256 KiB, and cache them 2009-06-15 16:47:27 +10:00
pty.c pty_write: don't do a tty_wakeup() when the buffers are full 2009-09-18 07:05:58 -07:00
random.c sysctl: remove "struct file *" argument of ->proc_handler 2009-09-24 07:21:04 -07:00
raw.c Driver-Core: extend devnode callbacks to provide permissions 2009-09-19 12:50:38 -07:00
riscom8_reg.h
riscom8.c tty: riscom8, fix tty refcnt 2009-09-19 13:13:37 -07:00
riscom8.h
rocket_int.h
rocket.c headers: smp_lock.h redux 2009-07-12 12:22:34 -07:00
rocket.h
rtc.c
scc.h
scx200_gpio.c
selection.c tty: rewrite the ldisc locking 2009-06-11 08:51:01 -07:00
ser_a2232.c
ser_a2232.h
ser_a2232fw.ax
ser_a2232fw.h
serial167.c cleanup console_print() 2009-09-14 17:41:42 -07:00
snsc_event.c
snsc.c
snsc.h
sonypi.c
specialix_io8.h
specialix.c specialix.c: convert nested spin_lock_irqsave to spin_lock 2009-07-20 16:38:43 -07:00
stallion.c tty: Add carrier processing on close to the tty_port core 2009-06-11 08:50:56 -07:00
sx.c headers: smp_lock.h redux 2009-07-12 12:22:34 -07:00
sx.h
sxboards.h
sxwindow.h
synclink_gt.c hdlc: convert to netdev_tx_t 2009-09-01 01:13:31 -07:00
synclink.c hdlc: convert to netdev_tx_t 2009-09-01 01:13:31 -07:00
synclinkmp.c hdlc: convert to netdev_tx_t 2009-09-01 01:13:31 -07:00
sysrq.c perf: Do the big rename: Performance Counters -> Performance Events 2009-09-21 14:28:04 +02:00
tb0219.c Update Yoichi Yuasa's e-mail address 2009-07-03 15:45:29 +01:00
tlclk.c
toshiba.c
tty_audit.c tty: remove buffer special casing 2009-06-11 08:51:02 -07:00
tty_buffer.c pty: avoid forcing 'low_latency' tty flag 2009-07-29 12:15:56 -07:00
tty_io.c tty: Fix regressions caused by commit b50989dc 2009-09-27 13:35:16 -07:00
tty_ioctl.c tty: vt: use printk_once 2009-09-19 13:13:35 -07:00
tty_ldisc.c tty-ldisc: get rid of tty_ldisc_try_get() helper function 2009-09-19 13:13:10 -07:00
tty_port.c TTY: fix typos 2009-09-19 13:13:36 -07:00
uv_mmtimer.c drivers/char/uv_mmtimer.c: add memory mapped RTC driver for UV 2009-09-24 07:21:03 -07:00
vc_screen.c vc: create vcs(a) devices for consoles 2009-07-20 16:38:43 -07:00
viotape.c tape: beyond ARRAY_SIZE of viocd_diskinfo 2009-06-02 10:32:34 +10:00
virtio_console.c virtio: add virtio IDs file 2009-09-23 22:26:32 +09:30
vme_scc.c
vt_ioctl.c tty: Power: fix suspend vt regression 2009-09-19 13:13:35 -07:00
vt.c tty: vt: use printk_once 2009-09-19 13:13:35 -07:00