73 lines · 1.4 KB · C
RawDownload
#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);