tty: never hold BTM while getting tty_mutex
tty_mutex is never taken with the BTM held, except for two corner cases that are worked around here. We give up the BTM before calling tty_release() in the error path of tty_open(). Similarly, we reorder the locking in ptmx_open() to get tty_mutex before the BTM. Signed-off-by: Arnd Bergmann <arnd@arndb.de> Cc: Alan Cox <alan@lxorguk.ukuu.org.uk> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
ec79d6056d
commit
64ba3dc314
@@ -1866,19 +1866,19 @@ got_driver:
|
||||
printk(KERN_DEBUG "error %d in opening %s...", retval,
|
||||
tty->name);
|
||||
#endif
|
||||
tty_unlock(); /* need to call tty_release without BTM */
|
||||
tty_release(inode, filp);
|
||||
if (retval != -ERESTARTSYS) {
|
||||
tty_unlock();
|
||||
if (retval != -ERESTARTSYS)
|
||||
return retval;
|
||||
}
|
||||
if (signal_pending(current)) {
|
||||
tty_unlock();
|
||||
|
||||
if (signal_pending(current))
|
||||
return retval;
|
||||
}
|
||||
|
||||
schedule();
|
||||
/*
|
||||
* Need to reset f_op in case a hangup happened.
|
||||
*/
|
||||
tty_lock();
|
||||
if (filp->f_op == &hung_up_tty_fops)
|
||||
filp->f_op = &tty_fops;
|
||||
tty_unlock();
|
||||
|
Reference in New Issue
Block a user