• Dave Young's avatar
    tty: Fix regressions caused by commit b50989dc · f278a2f7
    Dave Young authored
    The following commit made console open fails while booting:
    
    	commit b50989dc
    	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: default avatarDave Young <hidave.darkstar@gmail.com>
    [ rjw: Rebased on top of 2.6.31-git, reworked the changelog. ]
    Signed-off-by: default avatar"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: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    f278a2f7
tty_io.c 77.5 KB