You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
73 lines
1.4 KiB
73 lines
1.4 KiB
#include <linux/tty.h> |
|
#include <linux/module.h> |
|
#include <linux/kallsyms.h> |
|
#include <linux/semaphore.h> |
|
#include <linux/sched.h> |
|
|
|
/* Legacy tty mutex glue */ |
|
|
|
enum { |
|
TTY_MUTEX_NORMAL, |
|
TTY_MUTEX_NESTED, |
|
}; |
|
|
|
/* |
|
* Getting the big tty mutex. |
|
*/ |
|
|
|
static void __lockfunc tty_lock_nested(struct tty_struct *tty, |
|
unsigned int subclass) |
|
{ |
|
if (tty->magic != TTY_MAGIC) { |
|
pr_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); |
|
} |
|
EXPORT_SYMBOL(tty_lock); |
|
|
|
void __lockfunc tty_unlock(struct tty_struct *tty) |
|
{ |
|
if (tty->magic != TTY_MAGIC) { |
|
pr_err("U Bad %p\n", tty); |
|
WARN_ON(1); |
|
return; |
|
} |
|
mutex_unlock(&tty->legacy_mutex); |
|
tty_kref_put(tty); |
|
} |
|
EXPORT_SYMBOL(tty_unlock); |
|
|
|
/* |
|
* 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);
|
|
|