-
James Toy authored
The following commit make console open fails while booting: commit d966976924119acd35a431adbb95292082f73f8c Author: Alan Cox <alan@linux.intel.com> Date: Tue Aug 11 10:23:05 2009 +1000 tty: make the kref destructor occur asynchronously Due to tty release routines runs in workqueue now, error like following will be reported while booting: INIT open /dev/console Input/output error 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 alan's following suggestion: Fun but its 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> Cc: Greg KH <greg@kroah.com> Cc: Alan Cox <alan@lxorguk.ukuu.org.uk> Cc: "Rafael J. Wysocki" <rjw@sisk.pl> Cc: Emmanuel Benisty <benisty.e@gmail.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
8e580e58