Commit eeb89d91 authored by Alan Cox's avatar Alan Cox Committed by Greg Kroah-Hartman

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: default avatarAlan "I must be out of my tree" Cox <alan@linux.intel.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
parent e8c62103
...@@ -659,7 +659,7 @@ static int __ptmx_open(struct inode *inode, struct file *filp) ...@@ -659,7 +659,7 @@ static int __ptmx_open(struct inode *inode, struct file *filp)
if (!retval) if (!retval)
return 0; return 0;
out1: out1:
tty_release_dev(filp); tty_release(inode, filp);
return retval; return retval;
out: out:
devpts_kill_index(inode, index); devpts_kill_index(inode, index);
......
This diff is collapsed.
...@@ -34,6 +34,8 @@ ...@@ -34,6 +34,8 @@
#include <linux/vt_kern.h> #include <linux/vt_kern.h>
#include <linux/selection.h> #include <linux/selection.h>
#include <linux/smp_lock.h> /* For the moment */
#include <linux/kmod.h> #include <linux/kmod.h>
#include <linux/nsproxy.h> #include <linux/nsproxy.h>
...@@ -545,6 +547,7 @@ int tty_set_ldisc(struct tty_struct *tty, int ldisc) ...@@ -545,6 +547,7 @@ int tty_set_ldisc(struct tty_struct *tty, int ldisc)
if (IS_ERR(new_ldisc)) if (IS_ERR(new_ldisc))
return PTR_ERR(new_ldisc); return PTR_ERR(new_ldisc);
lock_kernel();
/* /*
* We need to look at the tty locking here for pty/tty pairs * We need to look at the tty locking here for pty/tty pairs
* when both sides try to change in parallel. * when both sides try to change in parallel.
...@@ -558,6 +561,7 @@ int tty_set_ldisc(struct tty_struct *tty, int ldisc) ...@@ -558,6 +561,7 @@ int tty_set_ldisc(struct tty_struct *tty, int ldisc)
*/ */
if (tty->ldisc->ops->num == ldisc) { if (tty->ldisc->ops->num == ldisc) {
unlock_kernel();
tty_ldisc_put(new_ldisc); tty_ldisc_put(new_ldisc);
return 0; return 0;
} }
...@@ -569,6 +573,7 @@ int tty_set_ldisc(struct tty_struct *tty, int ldisc) ...@@ -569,6 +573,7 @@ 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);
/* /*
...@@ -582,6 +587,9 @@ int tty_set_ldisc(struct tty_struct *tty, int ldisc) ...@@ -582,6 +587,9 @@ int tty_set_ldisc(struct tty_struct *tty, int ldisc)
test_bit(TTY_LDISC_CHANGING, &tty->flags) == 0); test_bit(TTY_LDISC_CHANGING, &tty->flags) == 0);
mutex_lock(&tty->ldisc_mutex); mutex_lock(&tty->ldisc_mutex);
} }
lock_kernel();
set_bit(TTY_LDISC_CHANGING, &tty->flags); set_bit(TTY_LDISC_CHANGING, &tty->flags);
/* /*
...@@ -592,6 +600,8 @@ int tty_set_ldisc(struct tty_struct *tty, int ldisc) ...@@ -592,6 +600,8 @@ int tty_set_ldisc(struct tty_struct *tty, int ldisc)
tty->receive_room = 0; tty->receive_room = 0;
o_ldisc = tty->ldisc; o_ldisc = tty->ldisc;
unlock_kernel();
/* /*
* Make sure we don't change while someone holds a * Make sure we don't change while someone holds a
* reference to the line discipline. The TTY_LDISC bit * reference to the line discipline. The TTY_LDISC bit
...@@ -617,12 +627,14 @@ int tty_set_ldisc(struct tty_struct *tty, int ldisc) ...@@ -617,12 +627,14 @@ int tty_set_ldisc(struct tty_struct *tty, int ldisc)
flush_scheduled_work(); flush_scheduled_work();
mutex_lock(&tty->ldisc_mutex); mutex_lock(&tty->ldisc_mutex);
lock_kernel();
if (test_bit(TTY_HUPPED, &tty->flags)) { if (test_bit(TTY_HUPPED, &tty->flags)) {
/* We were raced by the hangup method. It will have stomped /* We were raced by the hangup method. It will have stomped
the ldisc data and closed the ldisc down */ the ldisc data and closed the ldisc down */
clear_bit(TTY_LDISC_CHANGING, &tty->flags); clear_bit(TTY_LDISC_CHANGING, &tty->flags);
mutex_unlock(&tty->ldisc_mutex); mutex_unlock(&tty->ldisc_mutex);
tty_ldisc_put(new_ldisc); tty_ldisc_put(new_ldisc);
unlock_kernel();
return -EIO; return -EIO;
} }
...@@ -664,6 +676,7 @@ int tty_set_ldisc(struct tty_struct *tty, int ldisc) ...@@ -664,6 +676,7 @@ int tty_set_ldisc(struct tty_struct *tty, int ldisc)
if (o_work) if (o_work)
schedule_delayed_work(&o_tty->buf.work, 1); schedule_delayed_work(&o_tty->buf.work, 1);
mutex_unlock(&tty->ldisc_mutex); mutex_unlock(&tty->ldisc_mutex);
unlock_kernel();
return retval; return retval;
} }
......
...@@ -449,7 +449,7 @@ extern void initialize_tty_struct(struct tty_struct *tty, ...@@ -449,7 +449,7 @@ extern void initialize_tty_struct(struct tty_struct *tty,
struct tty_driver *driver, int idx); struct tty_driver *driver, int idx);
extern struct tty_struct *tty_init_dev(struct tty_driver *driver, int idx, extern struct tty_struct *tty_init_dev(struct tty_driver *driver, int idx,
int first_ok); int first_ok);
extern void tty_release_dev(struct file *filp); extern int tty_release(struct inode *inode, struct file *filp);
extern int tty_init_termios(struct tty_struct *tty); extern int tty_init_termios(struct tty_struct *tty);
extern struct tty_struct *tty_pair_get_tty(struct tty_struct *tty); extern struct tty_struct *tty_pair_get_tty(struct tty_struct *tty);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment