tty: push the BKL down into the handlers a bit
Start trying to untangle the remaining BKL mess Updated to fix missing unlock_kernel noted by Dan Carpenter Signed-off-by: Alan "I must be out of my tree" Cox <alan@linux.intel.com> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
e8c62103fd
commit
eeb89d918c
@ -34,6 +34,8 @@
|
||||
#include <linux/vt_kern.h>
|
||||
#include <linux/selection.h>
|
||||
|
||||
#include <linux/smp_lock.h> /* For the moment */
|
||||
|
||||
#include <linux/kmod.h>
|
||||
#include <linux/nsproxy.h>
|
||||
|
||||
@ -545,6 +547,7 @@ int tty_set_ldisc(struct tty_struct *tty, int ldisc)
|
||||
if (IS_ERR(new_ldisc))
|
||||
return PTR_ERR(new_ldisc);
|
||||
|
||||
lock_kernel();
|
||||
/*
|
||||
* We need to look at the tty locking here for pty/tty pairs
|
||||
* when both sides try to change in parallel.
|
||||
@ -558,6 +561,7 @@ int tty_set_ldisc(struct tty_struct *tty, int ldisc)
|
||||
*/
|
||||
|
||||
if (tty->ldisc->ops->num == ldisc) {
|
||||
unlock_kernel();
|
||||
tty_ldisc_put(new_ldisc);
|
||||
return 0;
|
||||
}
|
||||
@ -569,6 +573,7 @@ int tty_set_ldisc(struct tty_struct *tty, int ldisc)
|
||||
|
||||
tty_wait_until_sent(tty, 0);
|
||||
|
||||
unlock_kernel();
|
||||
mutex_lock(&tty->ldisc_mutex);
|
||||
|
||||
/*
|
||||
@ -582,6 +587,9 @@ int tty_set_ldisc(struct tty_struct *tty, int ldisc)
|
||||
test_bit(TTY_LDISC_CHANGING, &tty->flags) == 0);
|
||||
mutex_lock(&tty->ldisc_mutex);
|
||||
}
|
||||
|
||||
lock_kernel();
|
||||
|
||||
set_bit(TTY_LDISC_CHANGING, &tty->flags);
|
||||
|
||||
/*
|
||||
@ -592,6 +600,8 @@ int tty_set_ldisc(struct tty_struct *tty, int ldisc)
|
||||
tty->receive_room = 0;
|
||||
|
||||
o_ldisc = tty->ldisc;
|
||||
|
||||
unlock_kernel();
|
||||
/*
|
||||
* Make sure we don't change while someone holds a
|
||||
* reference to the line discipline. The TTY_LDISC bit
|
||||
@ -617,12 +627,14 @@ int tty_set_ldisc(struct tty_struct *tty, int ldisc)
|
||||
flush_scheduled_work();
|
||||
|
||||
mutex_lock(&tty->ldisc_mutex);
|
||||
lock_kernel();
|
||||
if (test_bit(TTY_HUPPED, &tty->flags)) {
|
||||
/* We were raced by the hangup method. It will have stomped
|
||||
the ldisc data and closed the ldisc down */
|
||||
clear_bit(TTY_LDISC_CHANGING, &tty->flags);
|
||||
mutex_unlock(&tty->ldisc_mutex);
|
||||
tty_ldisc_put(new_ldisc);
|
||||
unlock_kernel();
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
@ -664,6 +676,7 @@ int tty_set_ldisc(struct tty_struct *tty, int ldisc)
|
||||
if (o_work)
|
||||
schedule_delayed_work(&o_tty->buf.work, 1);
|
||||
mutex_unlock(&tty->ldisc_mutex);
|
||||
unlock_kernel();
|
||||
return retval;
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user