2010-08-06 23:40:30 +04:00
# include <linux/tty.h>
# include <linux/module.h>
# include <linux/kallsyms.h>
# include <linux/semaphore.h>
# include <linux/sched.h>
2014-11-05 20:13:01 +03:00
/*
* Nested tty locks are necessary for releasing pty pairs .
* The stable lock order is master pty first , then slave pty .
*/
2012-08-08 19:30:13 +04:00
/* Legacy tty mutex glue */
enum {
TTY_MUTEX_NORMAL ,
TTY_MUTEX_NESTED ,
} ;
2012-05-31 13:35:18 +04:00
2010-08-06 23:40:30 +04:00
/*
* Getting the big tty mutex .
*/
2012-08-08 19:30:13 +04:00
static void __lockfunc tty_lock_nested ( struct tty_struct * tty ,
unsigned int subclass )
2010-08-06 23:40:30 +04:00
{
2012-08-08 19:30:13 +04:00
if ( tty - > magic ! = TTY_MAGIC ) {
2012-10-17 19:15:13 +04:00
pr_err ( " L Bad %p \n " , tty ) ;
2012-08-08 19:30:13 +04:00
WARN_ON ( 1 ) ;
return ;
}
tty_kref_get ( tty ) ;
mutex_lock_nested ( & tty - > legacy_mutex , subclass ) ;
}
void __lockfunc tty_lock ( struct tty_struct * tty )
{
return tty_lock_nested ( tty , TTY_MUTEX_NORMAL ) ;
2010-08-06 23:40:30 +04:00
}
EXPORT_SYMBOL ( tty_lock ) ;
2012-08-08 19:30:13 +04:00
void __lockfunc tty_unlock ( struct tty_struct * tty )
2010-08-06 23:40:30 +04:00
{
2012-08-08 19:30:13 +04:00
if ( tty - > magic ! = TTY_MAGIC ) {
2012-10-17 19:15:13 +04:00
pr_err ( " U Bad %p \n " , tty ) ;
2012-08-08 19:30:13 +04:00
WARN_ON ( 1 ) ;
return ;
}
mutex_unlock ( & tty - > legacy_mutex ) ;
tty_kref_put ( tty ) ;
2010-08-06 23:40:30 +04:00
}
EXPORT_SYMBOL ( tty_unlock ) ;
2012-08-08 19:30:13 +04:00
2014-11-05 20:13:01 +03:00
void __lockfunc tty_lock_slave ( struct tty_struct * tty )
2012-08-08 19:30:13 +04:00
{
2014-11-05 20:13:01 +03:00
if ( tty & & tty ! = tty - > link ) {
WARN_ON ( ! mutex_is_locked ( & tty - > link - > legacy_mutex ) | |
! tty - > driver - > type = = TTY_DRIVER_TYPE_PTY | |
! tty - > driver - > type = = PTY_TYPE_SLAVE ) ;
2012-08-08 19:30:13 +04:00
tty_lock_nested ( tty , TTY_MUTEX_NESTED ) ;
}
}
2014-11-05 20:13:01 +03:00
void __lockfunc tty_unlock_slave ( struct tty_struct * tty )
2012-08-08 19:30:13 +04:00
{
2014-11-05 20:13:01 +03:00
if ( tty & & tty ! = tty - > link )
tty_unlock ( tty ) ;
2012-08-08 19:30:13 +04:00
}