tty: Push the lock down further into the ldisc code
authorAlan Cox <alan@linux.intel.com>
Mon, 30 Nov 2009 13:18:35 +0000 (13:18 +0000)
committerGreg Kroah-Hartman <gregkh@suse.de>
Fri, 11 Dec 2009 23:18:08 +0000 (15:18 -0800)
Signed-off-by: Alan Cox <alan@linux.intel.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
drivers/char/tty_io.c
drivers/char/tty_ldisc.c

index 1e24130..c408c81 100644 (file)
@@ -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
         * to decrement the use counts, as release_tty doesn't care.
         */
-       lock_kernel();
        retval = tty_ldisc_setup(tty, tty->link);
-       unlock_kernel();
        if (retval)
                goto release_mem_out;
        return tty;
index d914e77..3f653f7 100644 (file)
@@ -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);
 
        /*