From: Dave Young <hidave.darkstar@gmail.com>
To: Andrew Morton <akpm@linux-foundation.org>
Cc: linux-kernel@vger.kernel.org, Alan Cox <alan@lxorguk.ukuu.org.uk>,
gregkh@suse.de
Subject: Re: mmotm 2009-08-06-00-30 uploaded
Date: Wed, 12 Aug 2009 07:48:38 +0800 [thread overview]
Message-ID: <20090811234838.GA2008@darkstar> (raw)
In-Reply-To: <20090811140824.GA2067@darkstar>
On Tue, Aug 11, 2009 at 10:08:24PM +0800, Dave Young wrote:
> On Sat, Aug 08, 2009 at 06:13:53PM +0800, Dave Young wrote:
> > On Sat, Aug 8, 2009 at 12:49 AM, Andrew Morton<akpm@linux-foundation.org> wrote:
> > > On Fri, 7 Aug 2009 21:47:00 +0800 Dave Young <hidave.darkstar@gmail.com> wrote:
> > >
> > >> Hi, andrew
> > >>
> > >> Booting with this release, init (maybe getty?) reports something like:
> > >>
> > >> INIT: open /dev/console failed with input/output error
> > >>
> > >> 2.6.31-rc5 is fine.
> > >>
> > >> Any hints to find the root problem?
> > >
> > > Not really, sorry. Might be tty changes in linux-next?
> >
> > I bisected linux-next, find following patch as a result
> >
> > commit 65b8c7d9be5862ff8ac839607b444b6f6b11d2fb
> > Author: Alan Cox <alan@linux.intel.com>
> > Date: Thu Aug 6 09:58:02 2009 +1000
> >
> > cyclades: use the full port_close function
> >
> > But, I did not select cyclades in my .config, nor do i have the hardware. Weird.
>
> The above result is wrong, it's a mistake.
>
> After a whole day's testing and debugging with linux-2.6 git tree and tty patch series, I found the patch causing this issue.
> --
> From: Alan Cox <alan@linux.intel.com>
> Subject: tty: make the kref destructor occur asynchronously
> --
>
> If we make the tty release in a work queue, then tty_reopen might fail with -EIO. I read the sysvinit source code, it will retry 5 times, if still failed, it will warning, then no output before login.
>
> My distribution is slackware 12.2
>
> I tested with following debug patch.
>
> --- linux-2.6.orig/drivers/char/tty_io.c 2009-08-11 21:29:03.000000000 +0800
> +++ linux-2.6/drivers/char/tty_io.c 2009-08-11 21:40:01.000000000 +0800
> @@ -1246,8 +1246,10 @@ static int tty_reopen(struct tty_struct
> {
> struct tty_driver *driver = tty->driver;
>
> - if (test_bit(TTY_CLOSING, &tty->flags))
> + if (test_bit(TTY_CLOSING, &tty->flags)) {
> + printk(KERN_INFO "tty_io.c: closing\n");
> return -EIO;
> + }
>
> if (driver->type == TTY_DRIVER_TYPE_PTY &&
> driver->subtype == PTY_TYPE_MASTER) {
> @@ -1255,8 +1257,10 @@ static int tty_reopen(struct tty_struct
> * special case for PTY masters: only one open permitted,
> * and the slave side open count is incremented as well.
> */
> - if (tty->count)
> + if (tty->count) {
> + printk(KERN_INFO "tty_io.c: open count %d\n", tty->count);
> return -EIO;
> + }
>
> tty->link->count++;
> }
> @@ -1705,6 +1709,7 @@ static int __tty_open(struct inode *inod
> int index;
> dev_t device = inode->i_rdev;
> unsigned saved_flags = filp->f_flags;
> + static int t;
>
> nonseekable_open(inode, filp);
>
> @@ -1778,8 +1783,15 @@ got_driver:
>
> mutex_unlock(&tty_mutex);
> tty_driver_kref_put(driver);
> - if (IS_ERR(tty))
> + if (IS_ERR(tty)) {
> + int r = PTR_ERR(tty);
> + if (t == 5) {
> + printk(KERN_INFO "%s: %d, %d, retval: %d\n", __FILE__, __LINE__, r, retval);
> + t =0;
> + } else
> + t++;
> return PTR_ERR(tty);
> + }
>
> filp->private_data = tty;
> file_move(filp, &tty->tty_files);
>
>
Here is a fix for that issue, please help to review.
--
Due to tty release routines runs in workqueue now,
error like following will be reported while booting:
INIT open /dev/console input/output error
Opening a tty while closing not finished is what cause such problem.
Fix it by flush hangup_work in such case and then call tty_init_dev.
Signed-off-by: Dave Young <hidave.darkstar@gmail.com>
--
drivers/char/tty_io.c | 11 ++++++++---
1 file changed, 8 insertions(+), 3 deletions(-)
--- linux-2.6.orig/drivers/char/tty_io.c 2009-08-12 07:12:31.000000000 +0800
+++ linux-2.6/drivers/char/tty_io.c 2009-08-12 07:31:30.000000000 +0800
@@ -1770,9 +1770,14 @@ got_driver:
}
if (tty) {
- retval = tty_reopen(tty);
- if (retval)
- tty = ERR_PTR(retval);
+ if (test_bit(TTY_CLOSING, &tty->flags)) {
+ flush_work(&tty->hangup_work);
+ tty = tty_init_dev(driver, index, 0);
+ } else {
+ retval = tty_reopen(tty);
+ if (retval)
+ tty = ERR_PTR(retval);
+ }
} else
tty = tty_init_dev(driver, index, 0);
next prev parent reply other threads:[~2009-08-11 23:48 UTC|newest]
Thread overview: 18+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-08-06 7:33 mmotm 2009-08-06-00-30 uploaded akpm
2009-08-06 8:23 ` KAMEZAWA Hiroyuki
2009-08-06 8:31 ` Andrew Morton
2009-08-07 1:10 ` Dave Young
2009-08-07 2:02 ` mmotm 2009-08-06-00-30 uploaded (mtd) Randy Dunlap
2009-08-07 2:25 ` Andrew Morton
2009-08-07 3:34 ` Paul Mundt
2009-08-07 4:00 ` Randy Dunlap
2009-08-10 7:01 ` Artem Bityutskiy
2009-08-07 13:47 ` mmotm 2009-08-06-00-30 uploaded Dave Young
2009-08-07 13:49 ` Dave Young
2009-08-07 16:49 ` Andrew Morton
2009-08-08 1:59 ` Dave Young
2009-08-08 10:13 ` Dave Young
2009-08-11 14:08 ` Dave Young
2009-08-11 18:30 ` Greg KH
2009-08-11 23:48 ` Dave Young [this message]
[not found] ` <c1f41c620908130802x77886b15p766af4be070191cd@mail.gmail.com>
2009-08-14 2:55 ` Dave Young
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20090811234838.GA2008@darkstar \
--to=hidave.darkstar@gmail.com \
--cc=akpm@linux-foundation.org \
--cc=alan@lxorguk.ukuu.org.uk \
--cc=gregkh@suse.de \
--cc=linux-kernel@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox