b24413180f560 drivers/tty/tty_mutex.c (Greg Kroah-Hartman 2017-11-01 15:07:57 +0100 1) // SPDX-License-Identifier: GPL-2.0
b07471fa51358 drivers/char/tty_mutex.c (Arnd Bergmann 2010-08-06 21:40:30 +0200 2) #include <linux/tty.h>
b07471fa51358 drivers/char/tty_mutex.c (Arnd Bergmann 2010-08-06 21:40:30 +0200 3) #include <linux/module.h>
b07471fa51358 drivers/char/tty_mutex.c (Arnd Bergmann 2010-08-06 21:40:30 +0200 4) #include <linux/kallsyms.h>
b07471fa51358 drivers/char/tty_mutex.c (Arnd Bergmann 2010-08-06 21:40:30 +0200 5) #include <linux/semaphore.h>
b07471fa51358 drivers/char/tty_mutex.c (Arnd Bergmann 2010-08-06 21:40:30 +0200 6) #include <linux/sched.h>
6c80c0b94b941 drivers/tty/tty_mutex.c (Greg Kroah-Hartman 2021-04-08 14:51:30 +0200 7) #include "tty.h"
b07471fa51358 drivers/char/tty_mutex.c (Arnd Bergmann 2010-08-06 21:40:30 +0200 8)
89c8d91e31f26 drivers/tty/tty_mutex.c (Alan Cox 2012-08-08 16:30:13 +0100 9) /* Legacy tty mutex glue */
89c8d91e31f26 drivers/tty/tty_mutex.c (Alan Cox 2012-08-08 16:30:13 +0100 10)
b07471fa51358 drivers/char/tty_mutex.c (Arnd Bergmann 2010-08-06 21:40:30 +0200 11) /*
b07471fa51358 drivers/char/tty_mutex.c (Arnd Bergmann 2010-08-06 21:40:30 +0200 12) * Getting the big tty mutex.
b07471fa51358 drivers/char/tty_mutex.c (Arnd Bergmann 2010-08-06 21:40:30 +0200 13) */
89c8d91e31f26 drivers/tty/tty_mutex.c (Alan Cox 2012-08-08 16:30:13 +0100 14)
c2bb524b2e1a6 drivers/tty/tty_mutex.c (Peter Hurley 2016-01-09 21:13:51 -0800 15) void tty_lock(struct tty_struct *tty)
b07471fa51358 drivers/char/tty_mutex.c (Arnd Bergmann 2010-08-06 21:40:30 +0200 16) {
6d029c68de121 drivers/tty/tty_mutex.c (Peter Hurley 2015-11-08 13:01:20 -0500 17) if (WARN(tty->magic != TTY_MAGIC, "L Bad %p\n", tty))
89c8d91e31f26 drivers/tty/tty_mutex.c (Alan Cox 2012-08-08 16:30:13 +0100 18) return;
89c8d91e31f26 drivers/tty/tty_mutex.c (Alan Cox 2012-08-08 16:30:13 +0100 19) tty_kref_get(tty);
2febdb632bb96 drivers/tty/tty_mutex.c (Peter Hurley 2014-11-05 12:13:02 -0500 20) mutex_lock(&tty->legacy_mutex);
b07471fa51358 drivers/char/tty_mutex.c (Arnd Bergmann 2010-08-06 21:40:30 +0200 21) }
b07471fa51358 drivers/char/tty_mutex.c (Arnd Bergmann 2010-08-06 21:40:30 +0200 22) EXPORT_SYMBOL(tty_lock);
b07471fa51358 drivers/char/tty_mutex.c (Arnd Bergmann 2010-08-06 21:40:30 +0200 23)
0bfd464d3fdd5 drivers/tty/tty_mutex.c (Peter Hurley 2016-01-09 21:13:44 -0800 24) int tty_lock_interruptible(struct tty_struct *tty)
0bfd464d3fdd5 drivers/tty/tty_mutex.c (Peter Hurley 2016-01-09 21:13:44 -0800 25) {
e9036d0662360 drivers/tty/tty_mutex.c (Peter Hurley 2016-02-05 10:49:36 -0800 26) int ret;
e9036d0662360 drivers/tty/tty_mutex.c (Peter Hurley 2016-02-05 10:49:36 -0800 27)
0bfd464d3fdd5 drivers/tty/tty_mutex.c (Peter Hurley 2016-01-09 21:13:44 -0800 28) if (WARN(tty->magic != TTY_MAGIC, "L Bad %p\n", tty))
0bfd464d3fdd5 drivers/tty/tty_mutex.c (Peter Hurley 2016-01-09 21:13:44 -0800 29) return -EIO;
0bfd464d3fdd5 drivers/tty/tty_mutex.c (Peter Hurley 2016-01-09 21:13:44 -0800 30) tty_kref_get(tty);
e9036d0662360 drivers/tty/tty_mutex.c (Peter Hurley 2016-02-05 10:49:36 -0800 31) ret = mutex_lock_interruptible(&tty->legacy_mutex);
e9036d0662360 drivers/tty/tty_mutex.c (Peter Hurley 2016-02-05 10:49:36 -0800 32) if (ret)
e9036d0662360 drivers/tty/tty_mutex.c (Peter Hurley 2016-02-05 10:49:36 -0800 33) tty_kref_put(tty);
e9036d0662360 drivers/tty/tty_mutex.c (Peter Hurley 2016-02-05 10:49:36 -0800 34) return ret;
0bfd464d3fdd5 drivers/tty/tty_mutex.c (Peter Hurley 2016-01-09 21:13:44 -0800 35) }
0bfd464d3fdd5 drivers/tty/tty_mutex.c (Peter Hurley 2016-01-09 21:13:44 -0800 36)
c2bb524b2e1a6 drivers/tty/tty_mutex.c (Peter Hurley 2016-01-09 21:13:51 -0800 37) void tty_unlock(struct tty_struct *tty)
b07471fa51358 drivers/char/tty_mutex.c (Arnd Bergmann 2010-08-06 21:40:30 +0200 38) {
6d029c68de121 drivers/tty/tty_mutex.c (Peter Hurley 2015-11-08 13:01:20 -0500 39) if (WARN(tty->magic != TTY_MAGIC, "U Bad %p\n", tty))
89c8d91e31f26 drivers/tty/tty_mutex.c (Alan Cox 2012-08-08 16:30:13 +0100 40) return;
89c8d91e31f26 drivers/tty/tty_mutex.c (Alan Cox 2012-08-08 16:30:13 +0100 41) mutex_unlock(&tty->legacy_mutex);
89c8d91e31f26 drivers/tty/tty_mutex.c (Alan Cox 2012-08-08 16:30:13 +0100 42) tty_kref_put(tty);
b07471fa51358 drivers/char/tty_mutex.c (Arnd Bergmann 2010-08-06 21:40:30 +0200 43) }
b07471fa51358 drivers/char/tty_mutex.c (Arnd Bergmann 2010-08-06 21:40:30 +0200 44) EXPORT_SYMBOL(tty_unlock);
89c8d91e31f26 drivers/tty/tty_mutex.c (Alan Cox 2012-08-08 16:30:13 +0100 45)
c2bb524b2e1a6 drivers/tty/tty_mutex.c (Peter Hurley 2016-01-09 21:13:51 -0800 46) void tty_lock_slave(struct tty_struct *tty)
89c8d91e31f26 drivers/tty/tty_mutex.c (Alan Cox 2012-08-08 16:30:13 +0100 47) {
eef15e2a54fad drivers/tty/tty_mutex.c (Peter Hurley 2014-12-30 07:11:11 -0500 48) if (tty && tty != tty->link)
2febdb632bb96 drivers/tty/tty_mutex.c (Peter Hurley 2014-11-05 12:13:02 -0500 49) tty_lock(tty);
89c8d91e31f26 drivers/tty/tty_mutex.c (Alan Cox 2012-08-08 16:30:13 +0100 50) }
89c8d91e31f26 drivers/tty/tty_mutex.c (Alan Cox 2012-08-08 16:30:13 +0100 51)
c2bb524b2e1a6 drivers/tty/tty_mutex.c (Peter Hurley 2016-01-09 21:13:51 -0800 52) void tty_unlock_slave(struct tty_struct *tty)
89c8d91e31f26 drivers/tty/tty_mutex.c (Alan Cox 2012-08-08 16:30:13 +0100 53) {
2aff5e2bc62db drivers/tty/tty_mutex.c (Peter Hurley 2014-11-05 12:13:01 -0500 54) if (tty && tty != tty->link)
2aff5e2bc62db drivers/tty/tty_mutex.c (Peter Hurley 2014-11-05 12:13:01 -0500 55) tty_unlock(tty);
89c8d91e31f26 drivers/tty/tty_mutex.c (Alan Cox 2012-08-08 16:30:13 +0100 56) }
2febdb632bb96 drivers/tty/tty_mutex.c (Peter Hurley 2014-11-05 12:13:02 -0500 57)
2febdb632bb96 drivers/tty/tty_mutex.c (Peter Hurley 2014-11-05 12:13:02 -0500 58) void tty_set_lock_subclass(struct tty_struct *tty)
2febdb632bb96 drivers/tty/tty_mutex.c (Peter Hurley 2014-11-05 12:13:02 -0500 59) {
3abf87cd3e700 drivers/tty/tty_mutex.c (Peter Hurley 2015-01-17 15:42:04 -0500 60) lockdep_set_subclass(&tty->legacy_mutex, TTY_LOCK_SLAVE);
2febdb632bb96 drivers/tty/tty_mutex.c (Peter Hurley 2014-11-05 12:13:02 -0500 61) }