diff options
| author | Ingo Molnar <mingo@elte.hu> | 2009-09-04 03:28:52 -0400 |
|---|---|---|
| committer | Ingo Molnar <mingo@elte.hu> | 2009-09-04 03:29:05 -0400 |
| commit | 29e2035bddecce3eb584a8304528b50da8370a24 (patch) | |
| tree | 13155df7d90a8e287b83a1cd6c0d02c3018212ab /drivers/char | |
| parent | 868489660dabc0c28087cca3dbc1adbbc398c6fe (diff) | |
| parent | 37d0892c5a94e208cf863e3b7bac014edee4346d (diff) | |
Merge branch 'linus' into core/rcu
Merge reason: Avoid fuzz in init/main.c and update from rc6 to rc8.
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Diffstat (limited to 'drivers/char')
| -rw-r--r-- | drivers/char/tty_ldisc.c | 10 |
1 files changed, 7 insertions, 3 deletions
diff --git a/drivers/char/tty_ldisc.c b/drivers/char/tty_ldisc.c index 1733d3439ad2..e48af9f79219 100644 --- a/drivers/char/tty_ldisc.c +++ b/drivers/char/tty_ldisc.c | |||
| @@ -508,8 +508,9 @@ static void tty_ldisc_restore(struct tty_struct *tty, struct tty_ldisc *old) | |||
| 508 | * be obtained while the delayed work queue halt ensures that no more | 508 | * be obtained while the delayed work queue halt ensures that no more |
| 509 | * data is fed to the ldisc. | 509 | * data is fed to the ldisc. |
| 510 | * | 510 | * |
| 511 | * In order to wait for any existing references to complete see | 511 | * You need to do a 'flush_scheduled_work()' (outside the ldisc_mutex) |
| 512 | * tty_ldisc_wait_idle. | 512 | * in order to make sure any currently executing ldisc work is also |
| 513 | * flushed. | ||
| 513 | */ | 514 | */ |
| 514 | 515 | ||
| 515 | static int tty_ldisc_halt(struct tty_struct *tty) | 516 | static int tty_ldisc_halt(struct tty_struct *tty) |
| @@ -753,11 +754,14 @@ void tty_ldisc_hangup(struct tty_struct *tty) | |||
| 753 | * N_TTY. | 754 | * N_TTY. |
| 754 | */ | 755 | */ |
| 755 | if (tty->driver->flags & TTY_DRIVER_RESET_TERMIOS) { | 756 | if (tty->driver->flags & TTY_DRIVER_RESET_TERMIOS) { |
| 757 | /* Make sure the old ldisc is quiescent */ | ||
| 758 | tty_ldisc_halt(tty); | ||
| 759 | flush_scheduled_work(); | ||
| 760 | |||
| 756 | /* Avoid racing set_ldisc or tty_ldisc_release */ | 761 | /* Avoid racing set_ldisc or tty_ldisc_release */ |
| 757 | mutex_lock(&tty->ldisc_mutex); | 762 | mutex_lock(&tty->ldisc_mutex); |
| 758 | if (tty->ldisc) { /* Not yet closed */ | 763 | if (tty->ldisc) { /* Not yet closed */ |
| 759 | /* Switch back to N_TTY */ | 764 | /* Switch back to N_TTY */ |
| 760 | tty_ldisc_halt(tty); | ||
| 761 | tty_ldisc_reinit(tty); | 765 | tty_ldisc_reinit(tty); |
| 762 | /* At this point we have a closed ldisc and we want to | 766 | /* At this point we have a closed ldisc and we want to |
| 763 | reopen it. We could defer this to the next open but | 767 | reopen it. We could defer this to the next open but |
