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>
2012-06-29 17:48:36 +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-06-29 17:48:36 +04:00
static void __lockfunc tty_lock_nested ( struct tty_struct * tty ,
unsigned int subclass )
2010-08-06 23:40:30 +04:00
{
2012-06-29 17:48:36 +04:00
if ( tty - > magic ! = TTY_MAGIC ) {
printk ( KERN_ERR " L Bad %p \n " , tty ) ;
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-06-29 17:48:36 +04:00
void __lockfunc tty_unlock ( struct tty_struct * tty )
2010-08-06 23:40:30 +04:00
{
2012-06-29 17:48:36 +04:00
if ( tty - > magic ! = TTY_MAGIC ) {
printk ( KERN_ERR " U Bad %p \n " , tty ) ;
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-06-29 17:48:36 +04:00
/*
* Getting the big tty mutex for a pair of ttys with lock ordering
* On a non pty / tty pair tty2 can be NULL which is just fine .
*/
void __lockfunc tty_lock_pair ( struct tty_struct * tty ,
struct tty_struct * tty2 )
{
if ( tty < tty2 ) {
tty_lock ( tty ) ;
tty_lock_nested ( tty2 , TTY_MUTEX_NESTED ) ;
} else {
if ( tty2 & & tty2 ! = tty )
tty_lock ( tty2 ) ;
tty_lock_nested ( tty , TTY_MUTEX_NESTED ) ;
}
}
EXPORT_SYMBOL ( tty_lock_pair ) ;
void __lockfunc tty_unlock_pair ( struct tty_struct * tty ,
struct tty_struct * tty2 )
{
tty_unlock ( tty ) ;
if ( tty2 & & tty2 ! = tty )
tty_unlock ( tty2 ) ;
}
EXPORT_SYMBOL ( tty_unlock_pair ) ;