mirror of
https://github.com/adulau/aha.git
synced 2024-12-27 19:26:25 +00:00
tty: Push the lock down further into the ldisc code
Signed-off-by: Alan Cox <alan@linux.intel.com> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
This commit is contained in:
parent
eeb89d918c
commit
f18f9498e9
2 changed files with 9 additions and 5 deletions
|
@ -1347,9 +1347,7 @@ struct tty_struct *tty_init_dev(struct tty_driver *driver, int idx,
|
||||||
* If we fail here just call release_tty to clean up. No need
|
* If we fail here just call release_tty to clean up. No need
|
||||||
* to decrement the use counts, as release_tty doesn't care.
|
* to decrement the use counts, as release_tty doesn't care.
|
||||||
*/
|
*/
|
||||||
lock_kernel();
|
|
||||||
retval = tty_ldisc_setup(tty, tty->link);
|
retval = tty_ldisc_setup(tty, tty->link);
|
||||||
unlock_kernel();
|
|
||||||
if (retval)
|
if (retval)
|
||||||
goto release_mem_out;
|
goto release_mem_out;
|
||||||
return tty;
|
return tty;
|
||||||
|
|
|
@ -445,8 +445,14 @@ static void tty_set_termios_ldisc(struct tty_struct *tty, int num)
|
||||||
static int tty_ldisc_open(struct tty_struct *tty, struct tty_ldisc *ld)
|
static int tty_ldisc_open(struct tty_struct *tty, struct tty_ldisc *ld)
|
||||||
{
|
{
|
||||||
WARN_ON(test_and_set_bit(TTY_LDISC_OPEN, &tty->flags));
|
WARN_ON(test_and_set_bit(TTY_LDISC_OPEN, &tty->flags));
|
||||||
if (ld->ops->open)
|
if (ld->ops->open) {
|
||||||
return ld->ops->open(tty);
|
int ret;
|
||||||
|
/* BKL here locks verus a hangup event */
|
||||||
|
lock_kernel();
|
||||||
|
ret = ld->ops->open(tty);
|
||||||
|
unlock_kernel();
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -566,6 +572,7 @@ int tty_set_ldisc(struct tty_struct *tty, int ldisc)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
unlock_kernel();
|
||||||
/*
|
/*
|
||||||
* Problem: What do we do if this blocks ?
|
* Problem: What do we do if this blocks ?
|
||||||
* We could deadlock here
|
* We could deadlock here
|
||||||
|
@ -573,7 +580,6 @@ int tty_set_ldisc(struct tty_struct *tty, int ldisc)
|
||||||
|
|
||||||
tty_wait_until_sent(tty, 0);
|
tty_wait_until_sent(tty, 0);
|
||||||
|
|
||||||
unlock_kernel();
|
|
||||||
mutex_lock(&tty->ldisc_mutex);
|
mutex_lock(&tty->ldisc_mutex);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
Loading…
Reference in a new issue