|
@@ -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)
|
|
|
{
|
|
|
WARN_ON(test_and_set_bit(TTY_LDISC_OPEN, &tty->flags));
|
|
|
- if (ld->ops->open)
|
|
|
- return ld->ops->open(tty);
|
|
|
+ if (ld->ops->open) {
|
|
|
+ int ret;
|
|
|
+ /* BKL here locks verus a hangup event */
|
|
|
+ lock_kernel();
|
|
|
+ ret = ld->ops->open(tty);
|
|
|
+ unlock_kernel();
|
|
|
+ return ret;
|
|
|
+ }
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
@@ -566,6 +572,7 @@ int tty_set_ldisc(struct tty_struct *tty, int ldisc)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+ unlock_kernel();
|
|
|
/*
|
|
|
* Problem: What do we do if this blocks ?
|
|
|
* We could deadlock here
|
|
@@ -573,7 +580,6 @@ int tty_set_ldisc(struct tty_struct *tty, int ldisc)
|
|
|
|
|
|
tty_wait_until_sent(tty, 0);
|
|
|
|
|
|
- unlock_kernel();
|
|
|
mutex_lock(&tty->ldisc_mutex);
|
|
|
|
|
|
/*
|