Orange Pi5 kernel

Deprecated Linux kernel 5.10.110 for OrangePi 5/5B/5+ boards

3 Commits   0 Branches   0 Tags
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    1) // SPDX-License-Identifier: GPL-2.0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    3)  *  Copyright (C) 1991, 1992  Linus Torvalds
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    4)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    5) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    6) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    7)  * 'tty_io.c' gives an orthogonal feeling to tty's, be they consoles
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    8)  * or rs-channels. It also implements echoing, cooked mode etc.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    9)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   10)  * Kill-line thanks to John T Kohl, who also corrected VMIN = VTIME = 0.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   11)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   12)  * Modified by Theodore Ts'o, 9/14/92, to dynamically allocate the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   13)  * tty_struct and tty_queue structures.  Previously there was an array
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   14)  * of 256 tty_struct's which was statically allocated, and the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   15)  * tty_queue structures were allocated at boot time.  Both are now
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   16)  * dynamically allocated only when the tty is open.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   17)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   18)  * Also restructured routines so that there is more of a separation
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   19)  * between the high-level tty routines (tty_io.c and tty_ioctl.c) and
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   20)  * the low-level tty routines (serial.c, pty.c, console.c).  This
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   21)  * makes for cleaner and more compact code.  -TYT, 9/17/92
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   22)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   23)  * Modified by Fred N. van Kempen, 01/29/93, to add line disciplines
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   24)  * which can be dynamically activated and de-activated by the line
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   25)  * discipline handling modules (like SLIP).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   26)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   27)  * NOTE: pay no attention to the line discipline code (yet); its
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   28)  * interface is still subject to change in this version...
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   29)  * -- TYT, 1/31/92
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   30)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   31)  * Added functionality to the OPOST tty handling.  No delays, but all
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   32)  * other bits should be there.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   33)  *	-- Nick Holloway <alfie@dcs.warwick.ac.uk>, 27th May 1993.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   34)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   35)  * Rewrote canonical mode and added more termios flags.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   36)  * 	-- julian@uhunix.uhcc.hawaii.edu (J. Cowley), 13Jan94
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   37)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   38)  * Reorganized FASYNC support so mouse code can share it.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   39)  *	-- ctm@ardi.com, 9Sep95
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   40)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   41)  * New TIOCLINUX variants added.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   42)  *	-- mj@k332.feld.cvut.cz, 19-Nov-95
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   43)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   44)  * Restrict vt switching via ioctl()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   45)  *      -- grif@cs.ucr.edu, 5-Dec-95
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   46)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   47)  * Move console and virtual terminal code to more appropriate files,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   48)  * implement CONFIG_VT and generalize console device interface.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   49)  *	-- Marko Kohtala <Marko.Kohtala@hut.fi>, March 97
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   50)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   51)  * Rewrote tty_init_dev and tty_release_dev to eliminate races.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   52)  *	-- Bill Hawes <whawes@star.net>, June 97
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   53)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   54)  * Added devfs support.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   55)  *      -- C. Scott Ananian <cananian@alumni.princeton.edu>, 13-Jan-1998
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   56)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   57)  * Added support for a Unix98-style ptmx device.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   58)  *      -- C. Scott Ananian <cananian@alumni.princeton.edu>, 14-Jan-1998
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   59)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   60)  * Reduced memory usage for older ARM systems
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   61)  *      -- Russell King <rmk@arm.linux.org.uk>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   62)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   63)  * Move do_SAK() into process context.  Less stack use in devfs functions.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   64)  * alloc_tty_struct() always uses kmalloc()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   65)  *			 -- Andrew Morton <andrewm@uow.edu.eu> 17Mar01
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   66)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   67) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   68) #include <linux/types.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   69) #include <linux/major.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   70) #include <linux/errno.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   71) #include <linux/signal.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   72) #include <linux/fcntl.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   73) #include <linux/sched/signal.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   74) #include <linux/sched/task.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   75) #include <linux/interrupt.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   76) #include <linux/tty.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   77) #include <linux/tty_driver.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   78) #include <linux/tty_flip.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   79) #include <linux/devpts_fs.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   80) #include <linux/file.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   81) #include <linux/fdtable.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   82) #include <linux/console.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   83) #include <linux/timer.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   84) #include <linux/ctype.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   85) #include <linux/kd.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   86) #include <linux/mm.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   87) #include <linux/string.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   88) #include <linux/slab.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   89) #include <linux/poll.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   90) #include <linux/ppp-ioctl.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   91) #include <linux/proc_fs.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   92) #include <linux/init.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   93) #include <linux/module.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   94) #include <linux/device.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   95) #include <linux/wait.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   96) #include <linux/bitops.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   97) #include <linux/delay.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   98) #include <linux/seq_file.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   99) #include <linux/serial.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  100) #include <linux/ratelimit.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  101) #include <linux/compat.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  102) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  103) #include <linux/uaccess.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  104) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  105) #include <linux/kbd_kern.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  106) #include <linux/vt_kern.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  107) #include <linux/selection.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  108) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  109) #include <linux/kmod.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  110) #include <linux/nsproxy.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  111) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  112) #undef TTY_DEBUG_HANGUP
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  113) #ifdef TTY_DEBUG_HANGUP
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  114) # define tty_debug_hangup(tty, f, args...)	tty_debug(tty, f, ##args)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  115) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  116) # define tty_debug_hangup(tty, f, args...)	do { } while (0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  117) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  118) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  119) #define TTY_PARANOIA_CHECK 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  120) #define CHECK_TTY_COUNT 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  121) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  122) struct ktermios tty_std_termios = {	/* for the benefit of tty drivers  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  123) 	.c_iflag = ICRNL | IXON,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  124) 	.c_oflag = OPOST | ONLCR,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  125) 	.c_cflag = B38400 | CS8 | CREAD | HUPCL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  126) 	.c_lflag = ISIG | ICANON | ECHO | ECHOE | ECHOK |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  127) 		   ECHOCTL | ECHOKE | IEXTEN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  128) 	.c_cc = INIT_C_CC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  129) 	.c_ispeed = 38400,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  130) 	.c_ospeed = 38400,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  131) 	/* .c_line = N_TTY, */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  132) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  133) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  134) EXPORT_SYMBOL(tty_std_termios);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  135) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  136) /* This list gets poked at by procfs and various bits of boot up code. This
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  137)    could do with some rationalisation such as pulling the tty proc function
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  138)    into this file */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  139) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  140) LIST_HEAD(tty_drivers);			/* linked list of tty drivers */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  141) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  142) /* Mutex to protect creating and releasing a tty */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  143) DEFINE_MUTEX(tty_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  144) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  145) static ssize_t tty_read(struct kiocb *, struct iov_iter *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  146) static ssize_t tty_write(struct kiocb *, struct iov_iter *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  147) static __poll_t tty_poll(struct file *, poll_table *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  148) static int tty_open(struct inode *, struct file *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  149) #ifdef CONFIG_COMPAT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  150) static long tty_compat_ioctl(struct file *file, unsigned int cmd,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  151) 				unsigned long arg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  152) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  153) #define tty_compat_ioctl NULL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  154) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  155) static int __tty_fasync(int fd, struct file *filp, int on);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  156) static int tty_fasync(int fd, struct file *filp, int on);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  157) static void release_tty(struct tty_struct *tty, int idx);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  158) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  159) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  160)  *	free_tty_struct		-	free a disused tty
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  161)  *	@tty: tty struct to free
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  162)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  163)  *	Free the write buffers, tty queue and tty memory itself.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  164)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  165)  *	Locking: none. Must be called after tty is definitely unused
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  166)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  167) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  168) static void free_tty_struct(struct tty_struct *tty)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  169) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  170) 	tty_ldisc_deinit(tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  171) 	put_device(tty->dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  172) 	kfree(tty->write_buf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  173) 	tty->magic = 0xDEADDEAD;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  174) 	kfree(tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  175) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  176) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  177) static inline struct tty_struct *file_tty(struct file *file)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  178) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  179) 	return ((struct tty_file_private *)file->private_data)->tty;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  180) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  181) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  182) int tty_alloc_file(struct file *file)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  183) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  184) 	struct tty_file_private *priv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  185) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  186) 	priv = kmalloc(sizeof(*priv), GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  187) 	if (!priv)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  188) 		return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  189) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  190) 	file->private_data = priv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  191) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  192) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  193) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  194) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  195) /* Associate a new file with the tty structure */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  196) void tty_add_file(struct tty_struct *tty, struct file *file)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  197) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  198) 	struct tty_file_private *priv = file->private_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  199) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  200) 	priv->tty = tty;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  201) 	priv->file = file;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  202) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  203) 	spin_lock(&tty->files_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  204) 	list_add(&priv->list, &tty->tty_files);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  205) 	spin_unlock(&tty->files_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  206) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  207) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  208) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  209)  * tty_free_file - free file->private_data
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  210)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  211)  * This shall be used only for fail path handling when tty_add_file was not
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  212)  * called yet.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  213)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  214) void tty_free_file(struct file *file)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  215) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  216) 	struct tty_file_private *priv = file->private_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  217) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  218) 	file->private_data = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  219) 	kfree(priv);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  220) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  221) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  222) /* Delete file from its tty */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  223) static void tty_del_file(struct file *file)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  224) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  225) 	struct tty_file_private *priv = file->private_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  226) 	struct tty_struct *tty = priv->tty;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  227) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  228) 	spin_lock(&tty->files_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  229) 	list_del(&priv->list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  230) 	spin_unlock(&tty->files_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  231) 	tty_free_file(file);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  232) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  233) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  234) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  235)  *	tty_name	-	return tty naming
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  236)  *	@tty: tty structure
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  237)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  238)  *	Convert a tty structure into a name. The name reflects the kernel
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  239)  *	naming policy and if udev is in use may not reflect user space
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  240)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  241)  *	Locking: none
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  242)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  243) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  244) const char *tty_name(const struct tty_struct *tty)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  245) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  246) 	if (!tty) /* Hmm.  NULL pointer.  That's fun. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  247) 		return "NULL tty";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  248) 	return tty->name;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  249) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  250) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  251) EXPORT_SYMBOL(tty_name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  252) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  253) const char *tty_driver_name(const struct tty_struct *tty)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  254) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  255) 	if (!tty || !tty->driver)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  256) 		return "";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  257) 	return tty->driver->name;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  258) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  259) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  260) static int tty_paranoia_check(struct tty_struct *tty, struct inode *inode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  261) 			      const char *routine)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  262) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  263) #ifdef TTY_PARANOIA_CHECK
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  264) 	if (!tty) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  265) 		pr_warn("(%d:%d): %s: NULL tty\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  266) 			imajor(inode), iminor(inode), routine);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  267) 		return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  268) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  269) 	if (tty->magic != TTY_MAGIC) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  270) 		pr_warn("(%d:%d): %s: bad magic number\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  271) 			imajor(inode), iminor(inode), routine);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  272) 		return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  273) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  274) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  275) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  276) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  277) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  278) /* Caller must hold tty_lock */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  279) static int check_tty_count(struct tty_struct *tty, const char *routine)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  280) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  281) #ifdef CHECK_TTY_COUNT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  282) 	struct list_head *p;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  283) 	int count = 0, kopen_count = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  284) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  285) 	spin_lock(&tty->files_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  286) 	list_for_each(p, &tty->tty_files) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  287) 		count++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  288) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  289) 	spin_unlock(&tty->files_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  290) 	if (tty->driver->type == TTY_DRIVER_TYPE_PTY &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  291) 	    tty->driver->subtype == PTY_TYPE_SLAVE &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  292) 	    tty->link && tty->link->count)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  293) 		count++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  294) 	if (tty_port_kopened(tty->port))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  295) 		kopen_count++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  296) 	if (tty->count != (count + kopen_count)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  297) 		tty_warn(tty, "%s: tty->count(%d) != (#fd's(%d) + #kopen's(%d))\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  298) 			 routine, tty->count, count, kopen_count);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  299) 		return (count + kopen_count);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  300) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  301) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  302) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  303) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  304) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  305) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  306)  *	get_tty_driver		-	find device of a tty
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  307)  *	@device: device identifier
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  308)  *	@index: returns the index of the tty
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  309)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  310)  *	This routine returns a tty driver structure, given a device number
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  311)  *	and also passes back the index number.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  312)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  313)  *	Locking: caller must hold tty_mutex
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  314)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  315) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  316) static struct tty_driver *get_tty_driver(dev_t device, int *index)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  317) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  318) 	struct tty_driver *p;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  319) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  320) 	list_for_each_entry(p, &tty_drivers, tty_drivers) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  321) 		dev_t base = MKDEV(p->major, p->minor_start);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  322) 		if (device < base || device >= base + p->num)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  323) 			continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  324) 		*index = device - base;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  325) 		return tty_driver_kref_get(p);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  326) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  327) 	return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  328) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  329) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  330) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  331)  *	tty_dev_name_to_number	-	return dev_t for device name
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  332)  *	@name: user space name of device under /dev
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  333)  *	@number: pointer to dev_t that this function will populate
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  334)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  335)  *	This function converts device names like ttyS0 or ttyUSB1 into dev_t
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  336)  *	like (4, 64) or (188, 1). If no corresponding driver is registered then
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  337)  *	the function returns -ENODEV.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  338)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  339)  *	Locking: this acquires tty_mutex to protect the tty_drivers list from
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  340)  *		being modified while we are traversing it, and makes sure to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  341)  *		release it before exiting.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  342)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  343) int tty_dev_name_to_number(const char *name, dev_t *number)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  344) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  345) 	struct tty_driver *p;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  346) 	int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  347) 	int index, prefix_length = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  348) 	const char *str;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  349) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  350) 	for (str = name; *str && !isdigit(*str); str++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  351) 		;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  352) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  353) 	if (!*str)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  354) 		return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  355) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  356) 	ret = kstrtoint(str, 10, &index);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  357) 	if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  358) 		return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  359) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  360) 	prefix_length = str - name;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  361) 	mutex_lock(&tty_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  362) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  363) 	list_for_each_entry(p, &tty_drivers, tty_drivers)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  364) 		if (prefix_length == strlen(p->name) && strncmp(name,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  365) 					p->name, prefix_length) == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  366) 			if (index < p->num) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  367) 				*number = MKDEV(p->major, p->minor_start + index);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  368) 				goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  369) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  370) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  371) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  372) 	/* if here then driver wasn't found */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  373) 	ret = -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  374) out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  375) 	mutex_unlock(&tty_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  376) 	return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  377) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  378) EXPORT_SYMBOL_GPL(tty_dev_name_to_number);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  379) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  380) #ifdef CONFIG_CONSOLE_POLL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  381) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  382) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  383)  *	tty_find_polling_driver	-	find device of a polled tty
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  384)  *	@name: name string to match
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  385)  *	@line: pointer to resulting tty line nr
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  386)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  387)  *	This routine returns a tty driver structure, given a name
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  388)  *	and the condition that the tty driver is capable of polled
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  389)  *	operation.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  390)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  391) struct tty_driver *tty_find_polling_driver(char *name, int *line)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  392) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  393) 	struct tty_driver *p, *res = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  394) 	int tty_line = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  395) 	int len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  396) 	char *str, *stp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  397) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  398) 	for (str = name; *str; str++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  399) 		if ((*str >= '0' && *str <= '9') || *str == ',')
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  400) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  401) 	if (!*str)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  402) 		return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  403) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  404) 	len = str - name;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  405) 	tty_line = simple_strtoul(str, &str, 10);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  406) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  407) 	mutex_lock(&tty_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  408) 	/* Search through the tty devices to look for a match */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  409) 	list_for_each_entry(p, &tty_drivers, tty_drivers) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  410) 		if (!len || strncmp(name, p->name, len) != 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  411) 			continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  412) 		stp = str;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  413) 		if (*stp == ',')
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  414) 			stp++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  415) 		if (*stp == '\0')
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  416) 			stp = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  417) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  418) 		if (tty_line >= 0 && tty_line < p->num && p->ops &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  419) 		    p->ops->poll_init && !p->ops->poll_init(p, tty_line, stp)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  420) 			res = tty_driver_kref_get(p);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  421) 			*line = tty_line;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  422) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  423) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  424) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  425) 	mutex_unlock(&tty_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  426) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  427) 	return res;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  428) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  429) EXPORT_SYMBOL_GPL(tty_find_polling_driver);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  430) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  431) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  432) static ssize_t hung_up_tty_read(struct kiocb *iocb, struct iov_iter *to)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  433) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  434) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  435) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  436) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  437) static ssize_t hung_up_tty_write(struct kiocb *iocb, struct iov_iter *from)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  438) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  439) 	return -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  440) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  441) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  442) /* No kernel lock held - none needed ;) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  443) static __poll_t hung_up_tty_poll(struct file *filp, poll_table *wait)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  444) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  445) 	return EPOLLIN | EPOLLOUT | EPOLLERR | EPOLLHUP | EPOLLRDNORM | EPOLLWRNORM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  446) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  447) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  448) static long hung_up_tty_ioctl(struct file *file, unsigned int cmd,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  449) 		unsigned long arg)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  450) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  451) 	return cmd == TIOCSPGRP ? -ENOTTY : -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  452) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  453) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  454) static long hung_up_tty_compat_ioctl(struct file *file,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  455) 				     unsigned int cmd, unsigned long arg)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  456) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  457) 	return cmd == TIOCSPGRP ? -ENOTTY : -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  458) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  459) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  460) static int hung_up_tty_fasync(int fd, struct file *file, int on)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  461) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  462) 	return -ENOTTY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  463) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  464) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  465) static void tty_show_fdinfo(struct seq_file *m, struct file *file)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  466) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  467) 	struct tty_struct *tty = file_tty(file);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  468) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  469) 	if (tty && tty->ops && tty->ops->show_fdinfo)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  470) 		tty->ops->show_fdinfo(tty, m);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  471) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  472) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  473) static const struct file_operations tty_fops = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  474) 	.llseek		= no_llseek,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  475) 	.read_iter	= tty_read,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  476) 	.write_iter	= tty_write,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  477) 	.splice_read	= generic_file_splice_read,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  478) 	.splice_write	= iter_file_splice_write,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  479) 	.poll		= tty_poll,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  480) 	.unlocked_ioctl	= tty_ioctl,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  481) 	.compat_ioctl	= tty_compat_ioctl,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  482) 	.open		= tty_open,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  483) 	.release	= tty_release,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  484) 	.fasync		= tty_fasync,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  485) 	.show_fdinfo	= tty_show_fdinfo,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  486) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  487) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  488) static const struct file_operations console_fops = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  489) 	.llseek		= no_llseek,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  490) 	.read_iter	= tty_read,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  491) 	.write_iter	= redirected_tty_write,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  492) 	.splice_read	= generic_file_splice_read,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  493) 	.splice_write	= iter_file_splice_write,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  494) 	.poll		= tty_poll,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  495) 	.unlocked_ioctl	= tty_ioctl,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  496) 	.compat_ioctl	= tty_compat_ioctl,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  497) 	.open		= tty_open,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  498) 	.release	= tty_release,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  499) 	.fasync		= tty_fasync,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  500) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  501) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  502) static const struct file_operations hung_up_tty_fops = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  503) 	.llseek		= no_llseek,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  504) 	.read_iter	= hung_up_tty_read,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  505) 	.write_iter	= hung_up_tty_write,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  506) 	.poll		= hung_up_tty_poll,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  507) 	.unlocked_ioctl	= hung_up_tty_ioctl,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  508) 	.compat_ioctl	= hung_up_tty_compat_ioctl,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  509) 	.release	= tty_release,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  510) 	.fasync		= hung_up_tty_fasync,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  511) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  512) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  513) static DEFINE_SPINLOCK(redirect_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  514) static struct file *redirect;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  515) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  516) extern void tty_sysctl_init(void);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  517) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  518) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  519)  *	tty_wakeup	-	request more data
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  520)  *	@tty: terminal
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  521)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  522)  *	Internal and external helper for wakeups of tty. This function
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  523)  *	informs the line discipline if present that the driver is ready
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  524)  *	to receive more output data.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  525)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  526) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  527) void tty_wakeup(struct tty_struct *tty)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  528) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  529) 	struct tty_ldisc *ld;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  530) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  531) 	if (test_bit(TTY_DO_WRITE_WAKEUP, &tty->flags)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  532) 		ld = tty_ldisc_ref(tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  533) 		if (ld) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  534) 			if (ld->ops->write_wakeup)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  535) 				ld->ops->write_wakeup(tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  536) 			tty_ldisc_deref(ld);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  537) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  538) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  539) 	wake_up_interruptible_poll(&tty->write_wait, EPOLLOUT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  540) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  541) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  542) EXPORT_SYMBOL_GPL(tty_wakeup);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  543) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  544) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  545)  *	__tty_hangup		-	actual handler for hangup events
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  546)  *	@tty: tty device
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  547)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  548)  *	This can be called by a "kworker" kernel thread.  That is process
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  549)  *	synchronous but doesn't hold any locks, so we need to make sure we
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  550)  *	have the appropriate locks for what we're doing.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  551)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  552)  *	The hangup event clears any pending redirections onto the hung up
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  553)  *	device. It ensures future writes will error and it does the needed
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  554)  *	line discipline hangup and signal delivery. The tty object itself
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  555)  *	remains intact.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  556)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  557)  *	Locking:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  558)  *		BTM
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  559)  *		  redirect lock for undoing redirection
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  560)  *		  file list lock for manipulating list of ttys
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  561)  *		  tty_ldiscs_lock from called functions
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  562)  *		  termios_rwsem resetting termios data
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  563)  *		  tasklist_lock to walk task list for hangup event
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  564)  *		    ->siglock to protect ->signal/->sighand
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  565)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  566) static void __tty_hangup(struct tty_struct *tty, int exit_session)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  567) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  568) 	struct file *cons_filp = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  569) 	struct file *filp, *f = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  570) 	struct tty_file_private *priv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  571) 	int    closecount = 0, n;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  572) 	int refs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  573) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  574) 	if (!tty)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  575) 		return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  576) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  577) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  578) 	spin_lock(&redirect_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  579) 	if (redirect && file_tty(redirect) == tty) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  580) 		f = redirect;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  581) 		redirect = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  582) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  583) 	spin_unlock(&redirect_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  584) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  585) 	tty_lock(tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  586) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  587) 	if (test_bit(TTY_HUPPED, &tty->flags)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  588) 		tty_unlock(tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  589) 		return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  590) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  591) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  592) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  593) 	 * Some console devices aren't actually hung up for technical and
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  594) 	 * historical reasons, which can lead to indefinite interruptible
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  595) 	 * sleep in n_tty_read().  The following explicitly tells
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  596) 	 * n_tty_read() to abort readers.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  597) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  598) 	set_bit(TTY_HUPPING, &tty->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  599) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  600) 	/* inuse_filps is protected by the single tty lock,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  601) 	   this really needs to change if we want to flush the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  602) 	   workqueue with the lock held */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  603) 	check_tty_count(tty, "tty_hangup");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  604) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  605) 	spin_lock(&tty->files_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  606) 	/* This breaks for file handles being sent over AF_UNIX sockets ? */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  607) 	list_for_each_entry(priv, &tty->tty_files, list) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  608) 		filp = priv->file;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  609) 		if (filp->f_op->write_iter == redirected_tty_write)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  610) 			cons_filp = filp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  611) 		if (filp->f_op->write_iter != tty_write)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  612) 			continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  613) 		closecount++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  614) 		__tty_fasync(-1, filp, 0);	/* can't block */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  615) 		filp->f_op = &hung_up_tty_fops;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  616) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  617) 	spin_unlock(&tty->files_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  618) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  619) 	refs = tty_signal_session_leader(tty, exit_session);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  620) 	/* Account for the p->signal references we killed */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  621) 	while (refs--)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  622) 		tty_kref_put(tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  623) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  624) 	tty_ldisc_hangup(tty, cons_filp != NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  625) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  626) 	spin_lock_irq(&tty->ctrl_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  627) 	clear_bit(TTY_THROTTLED, &tty->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  628) 	clear_bit(TTY_DO_WRITE_WAKEUP, &tty->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  629) 	put_pid(tty->session);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  630) 	put_pid(tty->pgrp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  631) 	tty->session = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  632) 	tty->pgrp = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  633) 	tty->ctrl_status = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  634) 	spin_unlock_irq(&tty->ctrl_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  635) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  636) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  637) 	 * If one of the devices matches a console pointer, we
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  638) 	 * cannot just call hangup() because that will cause
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  639) 	 * tty->count and state->count to go out of sync.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  640) 	 * So we just call close() the right number of times.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  641) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  642) 	if (cons_filp) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  643) 		if (tty->ops->close)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  644) 			for (n = 0; n < closecount; n++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  645) 				tty->ops->close(tty, cons_filp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  646) 	} else if (tty->ops->hangup)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  647) 		tty->ops->hangup(tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  648) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  649) 	 * We don't want to have driver/ldisc interactions beyond the ones
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  650) 	 * we did here. The driver layer expects no calls after ->hangup()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  651) 	 * from the ldisc side, which is now guaranteed.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  652) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  653) 	set_bit(TTY_HUPPED, &tty->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  654) 	clear_bit(TTY_HUPPING, &tty->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  655) 	tty_unlock(tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  656) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  657) 	if (f)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  658) 		fput(f);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  659) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  660) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  661) static void do_tty_hangup(struct work_struct *work)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  662) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  663) 	struct tty_struct *tty =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  664) 		container_of(work, struct tty_struct, hangup_work);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  665) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  666) 	__tty_hangup(tty, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  667) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  668) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  669) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  670)  *	tty_hangup		-	trigger a hangup event
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  671)  *	@tty: tty to hangup
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  672)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  673)  *	A carrier loss (virtual or otherwise) has occurred on this like
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  674)  *	schedule a hangup sequence to run after this event.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  675)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  676) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  677) void tty_hangup(struct tty_struct *tty)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  678) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  679) 	tty_debug_hangup(tty, "hangup\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  680) 	schedule_work(&tty->hangup_work);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  681) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  682) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  683) EXPORT_SYMBOL(tty_hangup);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  684) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  685) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  686)  *	tty_vhangup		-	process vhangup
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  687)  *	@tty: tty to hangup
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  688)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  689)  *	The user has asked via system call for the terminal to be hung up.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  690)  *	We do this synchronously so that when the syscall returns the process
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  691)  *	is complete. That guarantee is necessary for security reasons.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  692)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  693) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  694) void tty_vhangup(struct tty_struct *tty)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  695) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  696) 	tty_debug_hangup(tty, "vhangup\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  697) 	__tty_hangup(tty, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  698) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  699) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  700) EXPORT_SYMBOL(tty_vhangup);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  701) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  702) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  703) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  704)  *	tty_vhangup_self	-	process vhangup for own ctty
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  705)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  706)  *	Perform a vhangup on the current controlling tty
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  707)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  708) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  709) void tty_vhangup_self(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  710) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  711) 	struct tty_struct *tty;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  712) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  713) 	tty = get_current_tty();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  714) 	if (tty) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  715) 		tty_vhangup(tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  716) 		tty_kref_put(tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  717) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  718) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  719) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  720) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  721)  *	tty_vhangup_session		-	hangup session leader exit
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  722)  *	@tty: tty to hangup
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  723)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  724)  *	The session leader is exiting and hanging up its controlling terminal.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  725)  *	Every process in the foreground process group is signalled SIGHUP.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  726)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  727)  *	We do this synchronously so that when the syscall returns the process
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  728)  *	is complete. That guarantee is necessary for security reasons.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  729)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  730) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  731) void tty_vhangup_session(struct tty_struct *tty)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  732) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  733) 	tty_debug_hangup(tty, "session hangup\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  734) 	__tty_hangup(tty, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  735) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  736) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  737) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  738)  *	tty_hung_up_p		-	was tty hung up
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  739)  *	@filp: file pointer of tty
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  740)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  741)  *	Return true if the tty has been subject to a vhangup or a carrier
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  742)  *	loss
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  743)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  744) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  745) int tty_hung_up_p(struct file *filp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  746) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  747) 	return (filp && filp->f_op == &hung_up_tty_fops);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  748) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  749) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  750) EXPORT_SYMBOL(tty_hung_up_p);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  751) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  752) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  753)  *	stop_tty	-	propagate flow control
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  754)  *	@tty: tty to stop
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  755)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  756)  *	Perform flow control to the driver. May be called
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  757)  *	on an already stopped device and will not re-call the driver
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  758)  *	method.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  759)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  760)  *	This functionality is used by both the line disciplines for
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  761)  *	halting incoming flow and by the driver. It may therefore be
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  762)  *	called from any context, may be under the tty atomic_write_lock
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  763)  *	but not always.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  764)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  765)  *	Locking:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  766)  *		flow_lock
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  767)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  768) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  769) void __stop_tty(struct tty_struct *tty)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  770) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  771) 	if (tty->stopped)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  772) 		return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  773) 	tty->stopped = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  774) 	if (tty->ops->stop)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  775) 		tty->ops->stop(tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  776) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  777) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  778) void stop_tty(struct tty_struct *tty)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  779) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  780) 	unsigned long flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  781) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  782) 	spin_lock_irqsave(&tty->flow_lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  783) 	__stop_tty(tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  784) 	spin_unlock_irqrestore(&tty->flow_lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  785) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  786) EXPORT_SYMBOL(stop_tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  787) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  788) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  789)  *	start_tty	-	propagate flow control
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  790)  *	@tty: tty to start
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  791)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  792)  *	Start a tty that has been stopped if at all possible. If this
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  793)  *	tty was previous stopped and is now being started, the driver
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  794)  *	start method is invoked and the line discipline woken.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  795)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  796)  *	Locking:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  797)  *		flow_lock
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  798)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  799) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  800) void __start_tty(struct tty_struct *tty)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  801) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  802) 	if (!tty->stopped || tty->flow_stopped)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  803) 		return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  804) 	tty->stopped = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  805) 	if (tty->ops->start)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  806) 		tty->ops->start(tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  807) 	tty_wakeup(tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  808) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  809) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  810) void start_tty(struct tty_struct *tty)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  811) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  812) 	unsigned long flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  813) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  814) 	spin_lock_irqsave(&tty->flow_lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  815) 	__start_tty(tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  816) 	spin_unlock_irqrestore(&tty->flow_lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  817) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  818) EXPORT_SYMBOL(start_tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  819) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  820) static void tty_update_time(struct timespec64 *time)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  821) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  822) 	time64_t sec = ktime_get_real_seconds();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  823) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  824) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  825) 	 * We only care if the two values differ in anything other than the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  826) 	 * lower three bits (i.e every 8 seconds).  If so, then we can update
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  827) 	 * the time of the tty device, otherwise it could be construded as a
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  828) 	 * security leak to let userspace know the exact timing of the tty.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  829) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  830) 	if ((sec ^ time->tv_sec) & ~7)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  831) 		time->tv_sec = sec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  832) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  833) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  834) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  835)  * Iterate on the ldisc ->read() function until we've gotten all
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  836)  * the data the ldisc has for us.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  837)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  838)  * The "cookie" is something that the ldisc read function can fill
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  839)  * in to let us know that there is more data to be had.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  840)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  841)  * We promise to continue to call the ldisc until it stops returning
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  842)  * data or clears the cookie. The cookie may be something that the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  843)  * ldisc maintains state for and needs to free.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  844)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  845) static int iterate_tty_read(struct tty_ldisc *ld, struct tty_struct *tty,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  846) 		struct file *file, struct iov_iter *to)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  847) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  848) 	int retval = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  849) 	void *cookie = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  850) 	unsigned long offset = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  851) 	char kernel_buf[64];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  852) 	size_t count = iov_iter_count(to);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  853) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  854) 	do {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  855) 		int size, copied;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  856) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  857) 		size = count > sizeof(kernel_buf) ? sizeof(kernel_buf) : count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  858) 		size = ld->ops->read(tty, file, kernel_buf, size, &cookie, offset);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  859) 		if (!size)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  860) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  861) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  862) 		if (size < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  863) 			/* Did we have an earlier error (ie -EFAULT)? */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  864) 			if (retval)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  865) 				break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  866) 			retval = size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  867) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  868) 			/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  869) 			 * -EOVERFLOW means we didn't have enough space
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  870) 			 * for a whole packet, and we shouldn't return
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  871) 			 * a partial result.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  872) 			 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  873) 			if (retval == -EOVERFLOW)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  874) 				offset = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  875) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  876) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  877) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  878) 		copied = copy_to_iter(kernel_buf, size, to);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  879) 		offset += copied;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  880) 		count -= copied;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  881) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  882) 		/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  883) 		 * If the user copy failed, we still need to do another ->read()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  884) 		 * call if we had a cookie to let the ldisc clear up.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  885) 		 *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  886) 		 * But make sure size is zeroed.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  887) 		 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  888) 		if (unlikely(copied != size)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  889) 			count = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  890) 			retval = -EFAULT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  891) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  892) 	} while (cookie);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  893) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  894) 	/* We always clear tty buffer in case they contained passwords */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  895) 	memzero_explicit(kernel_buf, sizeof(kernel_buf));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  896) 	return offset ? offset : retval;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  897) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  898) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  899) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  900) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  901)  *	tty_read	-	read method for tty device files
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  902)  *	@file: pointer to tty file
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  903)  *	@buf: user buffer
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  904)  *	@count: size of user buffer
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  905)  *	@ppos: unused
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  906)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  907)  *	Perform the read system call function on this terminal device. Checks
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  908)  *	for hung up devices before calling the line discipline method.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  909)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  910)  *	Locking:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  911)  *		Locks the line discipline internally while needed. Multiple
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  912)  *	read calls may be outstanding in parallel.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  913)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  914) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  915) static ssize_t tty_read(struct kiocb *iocb, struct iov_iter *to)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  916) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  917) 	int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  918) 	struct file *file = iocb->ki_filp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  919) 	struct inode *inode = file_inode(file);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  920) 	struct tty_struct *tty = file_tty(file);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  921) 	struct tty_ldisc *ld;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  922) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  923) 	if (tty_paranoia_check(tty, inode, "tty_read"))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  924) 		return -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  925) 	if (!tty || tty_io_error(tty))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  926) 		return -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  927) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  928) 	/* We want to wait for the line discipline to sort out in this
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  929) 	   situation */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  930) 	ld = tty_ldisc_ref_wait(tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  931) 	if (!ld)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  932) 		return hung_up_tty_read(iocb, to);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  933) 	i = -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  934) 	if (ld->ops->read)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  935) 		i = iterate_tty_read(ld, tty, file, to);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  936) 	tty_ldisc_deref(ld);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  937) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  938) 	if (i > 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  939) 		tty_update_time(&inode->i_atime);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  940) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  941) 	return i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  942) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  943) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  944) static void tty_write_unlock(struct tty_struct *tty)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  945) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  946) 	mutex_unlock(&tty->atomic_write_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  947) 	wake_up_interruptible_poll(&tty->write_wait, EPOLLOUT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  948) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  949) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  950) static int tty_write_lock(struct tty_struct *tty, int ndelay)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  951) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  952) 	if (!mutex_trylock(&tty->atomic_write_lock)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  953) 		if (ndelay)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  954) 			return -EAGAIN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  955) 		if (mutex_lock_interruptible(&tty->atomic_write_lock))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  956) 			return -ERESTARTSYS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  957) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  958) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  959) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  960) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  961) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  962)  * Split writes up in sane blocksizes to avoid
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  963)  * denial-of-service type attacks
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  964)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  965) static inline ssize_t do_tty_write(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  966) 	ssize_t (*write)(struct tty_struct *, struct file *, const unsigned char *, size_t),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  967) 	struct tty_struct *tty,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  968) 	struct file *file,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  969) 	struct iov_iter *from)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  970) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  971) 	size_t count = iov_iter_count(from);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  972) 	ssize_t ret, written = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  973) 	unsigned int chunk;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  974) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  975) 	ret = tty_write_lock(tty, file->f_flags & O_NDELAY);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  976) 	if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  977) 		return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  978) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  979) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  980) 	 * We chunk up writes into a temporary buffer. This
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  981) 	 * simplifies low-level drivers immensely, since they
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  982) 	 * don't have locking issues and user mode accesses.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  983) 	 *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  984) 	 * But if TTY_NO_WRITE_SPLIT is set, we should use a
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  985) 	 * big chunk-size..
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  986) 	 *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  987) 	 * The default chunk-size is 2kB, because the NTTY
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  988) 	 * layer has problems with bigger chunks. It will
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  989) 	 * claim to be able to handle more characters than
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  990) 	 * it actually does.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  991) 	 *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  992) 	 * FIXME: This can probably go away now except that 64K chunks
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  993) 	 * are too likely to fail unless switched to vmalloc...
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  994) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  995) 	chunk = 2048;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  996) 	if (test_bit(TTY_NO_WRITE_SPLIT, &tty->flags))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  997) 		chunk = 65536;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  998) 	if (count < chunk)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  999) 		chunk = count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1000) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1001) 	/* write_buf/write_cnt is protected by the atomic_write_lock mutex */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1002) 	if (tty->write_cnt < chunk) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1003) 		unsigned char *buf_chunk;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1004) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1005) 		if (chunk < 1024)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1006) 			chunk = 1024;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1007) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1008) 		buf_chunk = kmalloc(chunk, GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1009) 		if (!buf_chunk) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1010) 			ret = -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1011) 			goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1012) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1013) 		kfree(tty->write_buf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1014) 		tty->write_cnt = chunk;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1015) 		tty->write_buf = buf_chunk;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1016) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1017) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1018) 	/* Do the write .. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1019) 	for (;;) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1020) 		size_t size = count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1021) 		if (size > chunk)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1022) 			size = chunk;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1023) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1024) 		ret = -EFAULT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1025) 		if (copy_from_iter(tty->write_buf, size, from) != size)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1026) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1027) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1028) 		ret = write(tty, file, tty->write_buf, size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1029) 		if (ret <= 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1030) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1031) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1032) 		written += ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1033) 		if (ret > size)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1034) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1035) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1036) 		/* FIXME! Have Al check this! */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1037) 		if (ret != size)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1038) 			iov_iter_revert(from, size-ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1039) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1040) 		count -= ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1041) 		if (!count)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1042) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1043) 		ret = -ERESTARTSYS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1044) 		if (signal_pending(current))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1045) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1046) 		cond_resched();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1047) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1048) 	if (written) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1049) 		tty_update_time(&file_inode(file)->i_mtime);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1050) 		ret = written;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1051) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1052) out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1053) 	tty_write_unlock(tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1054) 	return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1055) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1056) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1057) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1058)  * tty_write_message - write a message to a certain tty, not just the console.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1059)  * @tty: the destination tty_struct
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1060)  * @msg: the message to write
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1061)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1062)  * This is used for messages that need to be redirected to a specific tty.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1063)  * We don't put it into the syslog queue right now maybe in the future if
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1064)  * really needed.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1065)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1066)  * We must still hold the BTM and test the CLOSING flag for the moment.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1067)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1068) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1069) void tty_write_message(struct tty_struct *tty, char *msg)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1070) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1071) 	if (tty) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1072) 		mutex_lock(&tty->atomic_write_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1073) 		tty_lock(tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1074) 		if (tty->ops->write && tty->count > 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1075) 			tty->ops->write(tty, msg, strlen(msg));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1076) 		tty_unlock(tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1077) 		tty_write_unlock(tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1078) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1079) 	return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1080) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1081) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1082) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1083) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1084)  *	tty_write		-	write method for tty device file
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1085)  *	@file: tty file pointer
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1086)  *	@buf: user data to write
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1087)  *	@count: bytes to write
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1088)  *	@ppos: unused
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1089)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1090)  *	Write data to a tty device via the line discipline.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1091)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1092)  *	Locking:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1093)  *		Locks the line discipline as required
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1094)  *		Writes to the tty driver are serialized by the atomic_write_lock
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1095)  *	and are then processed in chunks to the device. The line discipline
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1096)  *	write method will not be invoked in parallel for each device.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1097)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1098) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1099) static ssize_t file_tty_write(struct file *file, struct kiocb *iocb, struct iov_iter *from)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1100) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1101) 	struct tty_struct *tty = file_tty(file);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1102)  	struct tty_ldisc *ld;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1103) 	ssize_t ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1104) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1105) 	if (tty_paranoia_check(tty, file_inode(file), "tty_write"))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1106) 		return -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1107) 	if (!tty || !tty->ops->write ||	tty_io_error(tty))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1108) 			return -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1109) 	/* Short term debug to catch buggy drivers */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1110) 	if (tty->ops->write_room == NULL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1111) 		tty_err(tty, "missing write_room method\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1112) 	ld = tty_ldisc_ref_wait(tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1113) 	if (!ld)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1114) 		return hung_up_tty_write(iocb, from);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1115) 	if (!ld->ops->write)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1116) 		ret = -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1117) 	else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1118) 		ret = do_tty_write(ld->ops->write, tty, file, from);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1119) 	tty_ldisc_deref(ld);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1120) 	return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1121) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1122) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1123) static ssize_t tty_write(struct kiocb *iocb, struct iov_iter *from)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1124) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1125) 	return file_tty_write(iocb->ki_filp, iocb, from);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1126) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1127) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1128) ssize_t redirected_tty_write(struct kiocb *iocb, struct iov_iter *iter)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1129) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1130) 	struct file *p = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1131) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1132) 	spin_lock(&redirect_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1133) 	if (redirect)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1134) 		p = get_file(redirect);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1135) 	spin_unlock(&redirect_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1136) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1137) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1138) 	 * We know the redirected tty is just another tty, we can can
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1139) 	 * call file_tty_write() directly with that file pointer.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1140) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1141) 	if (p) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1142) 		ssize_t res;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1143) 		res = file_tty_write(p, iocb, iter);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1144) 		fput(p);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1145) 		return res;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1146) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1147) 	return tty_write(iocb, iter);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1148) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1149) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1150) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1151)  *	tty_send_xchar	-	send priority character
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1152)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1153)  *	Send a high priority character to the tty even if stopped
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1154)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1155)  *	Locking: none for xchar method, write ordering for write method.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1156)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1157) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1158) int tty_send_xchar(struct tty_struct *tty, char ch)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1159) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1160) 	int	was_stopped = tty->stopped;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1161) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1162) 	if (tty->ops->send_xchar) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1163) 		down_read(&tty->termios_rwsem);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1164) 		tty->ops->send_xchar(tty, ch);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1165) 		up_read(&tty->termios_rwsem);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1166) 		return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1167) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1168) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1169) 	if (tty_write_lock(tty, 0) < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1170) 		return -ERESTARTSYS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1171) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1172) 	down_read(&tty->termios_rwsem);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1173) 	if (was_stopped)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1174) 		start_tty(tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1175) 	tty->ops->write(tty, &ch, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1176) 	if (was_stopped)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1177) 		stop_tty(tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1178) 	up_read(&tty->termios_rwsem);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1179) 	tty_write_unlock(tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1180) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1181) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1182) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1183) static char ptychar[] = "pqrstuvwxyzabcde";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1184) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1185) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1186)  *	pty_line_name	-	generate name for a pty
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1187)  *	@driver: the tty driver in use
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1188)  *	@index: the minor number
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1189)  *	@p: output buffer of at least 6 bytes
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1190)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1191)  *	Generate a name from a driver reference and write it to the output
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1192)  *	buffer.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1193)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1194)  *	Locking: None
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1195)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1196) static void pty_line_name(struct tty_driver *driver, int index, char *p)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1197) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1198) 	int i = index + driver->name_base;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1199) 	/* ->name is initialized to "ttyp", but "tty" is expected */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1200) 	sprintf(p, "%s%c%x",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1201) 		driver->subtype == PTY_TYPE_SLAVE ? "tty" : driver->name,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1202) 		ptychar[i >> 4 & 0xf], i & 0xf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1203) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1204) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1205) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1206)  *	tty_line_name	-	generate name for a tty
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1207)  *	@driver: the tty driver in use
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1208)  *	@index: the minor number
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1209)  *	@p: output buffer of at least 7 bytes
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1210)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1211)  *	Generate a name from a driver reference and write it to the output
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1212)  *	buffer.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1213)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1214)  *	Locking: None
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1215)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1216) static ssize_t tty_line_name(struct tty_driver *driver, int index, char *p)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1217) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1218) 	if (driver->flags & TTY_DRIVER_UNNUMBERED_NODE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1219) 		return sprintf(p, "%s", driver->name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1220) 	else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1221) 		return sprintf(p, "%s%d", driver->name,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1222) 			       index + driver->name_base);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1223) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1224) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1225) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1226)  *	tty_driver_lookup_tty() - find an existing tty, if any
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1227)  *	@driver: the driver for the tty
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1228)  *	@idx:	 the minor number
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1229)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1230)  *	Return the tty, if found. If not found, return NULL or ERR_PTR() if the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1231)  *	driver lookup() method returns an error.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1232)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1233)  *	Locking: tty_mutex must be held. If the tty is found, bump the tty kref.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1234)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1235) static struct tty_struct *tty_driver_lookup_tty(struct tty_driver *driver,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1236) 		struct file *file, int idx)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1237) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1238) 	struct tty_struct *tty;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1239) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1240) 	if (driver->ops->lookup)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1241) 		if (!file)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1242) 			tty = ERR_PTR(-EIO);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1243) 		else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1244) 			tty = driver->ops->lookup(driver, file, idx);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1245) 	else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1246) 		tty = driver->ttys[idx];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1247) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1248) 	if (!IS_ERR(tty))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1249) 		tty_kref_get(tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1250) 	return tty;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1251) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1252) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1253) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1254)  *	tty_init_termios	-  helper for termios setup
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1255)  *	@tty: the tty to set up
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1256)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1257)  *	Initialise the termios structure for this tty. This runs under
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1258)  *	the tty_mutex currently so we can be relaxed about ordering.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1259)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1260) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1261) void tty_init_termios(struct tty_struct *tty)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1262) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1263) 	struct ktermios *tp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1264) 	int idx = tty->index;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1265) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1266) 	if (tty->driver->flags & TTY_DRIVER_RESET_TERMIOS)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1267) 		tty->termios = tty->driver->init_termios;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1268) 	else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1269) 		/* Check for lazy saved data */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1270) 		tp = tty->driver->termios[idx];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1271) 		if (tp != NULL) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1272) 			tty->termios = *tp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1273) 			tty->termios.c_line  = tty->driver->init_termios.c_line;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1274) 		} else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1275) 			tty->termios = tty->driver->init_termios;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1276) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1277) 	/* Compatibility until drivers always set this */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1278) 	tty->termios.c_ispeed = tty_termios_input_baud_rate(&tty->termios);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1279) 	tty->termios.c_ospeed = tty_termios_baud_rate(&tty->termios);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1280) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1281) EXPORT_SYMBOL_GPL(tty_init_termios);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1282) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1283) int tty_standard_install(struct tty_driver *driver, struct tty_struct *tty)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1284) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1285) 	tty_init_termios(tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1286) 	tty_driver_kref_get(driver);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1287) 	tty->count++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1288) 	driver->ttys[tty->index] = tty;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1289) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1290) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1291) EXPORT_SYMBOL_GPL(tty_standard_install);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1292) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1293) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1294)  *	tty_driver_install_tty() - install a tty entry in the driver
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1295)  *	@driver: the driver for the tty
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1296)  *	@tty: the tty
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1297)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1298)  *	Install a tty object into the driver tables. The tty->index field
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1299)  *	will be set by the time this is called. This method is responsible
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1300)  *	for ensuring any need additional structures are allocated and
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1301)  *	configured.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1302)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1303)  *	Locking: tty_mutex for now
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1304)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1305) static int tty_driver_install_tty(struct tty_driver *driver,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1306) 						struct tty_struct *tty)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1307) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1308) 	return driver->ops->install ? driver->ops->install(driver, tty) :
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1309) 		tty_standard_install(driver, tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1310) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1311) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1312) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1313)  *	tty_driver_remove_tty() - remove a tty from the driver tables
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1314)  *	@driver: the driver for the tty
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1315)  *	@tty: tty to remove
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1316)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1317)  *	Remvoe a tty object from the driver tables. The tty->index field
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1318)  *	will be set by the time this is called.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1319)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1320)  *	Locking: tty_mutex for now
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1321)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1322) static void tty_driver_remove_tty(struct tty_driver *driver, struct tty_struct *tty)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1323) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1324) 	if (driver->ops->remove)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1325) 		driver->ops->remove(driver, tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1326) 	else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1327) 		driver->ttys[tty->index] = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1328) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1329) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1330) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1331)  *	tty_reopen()	- fast re-open of an open tty
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1332)  *	@tty: the tty to open
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1333)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1334)  *	Return 0 on success, -errno on error.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1335)  *	Re-opens on master ptys are not allowed and return -EIO.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1336)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1337)  *	Locking: Caller must hold tty_lock
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1338)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1339) static int tty_reopen(struct tty_struct *tty)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1340) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1341) 	struct tty_driver *driver = tty->driver;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1342) 	struct tty_ldisc *ld;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1343) 	int retval = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1344) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1345) 	if (driver->type == TTY_DRIVER_TYPE_PTY &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1346) 	    driver->subtype == PTY_TYPE_MASTER)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1347) 		return -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1348) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1349) 	if (!tty->count)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1350) 		return -EAGAIN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1351) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1352) 	if (test_bit(TTY_EXCLUSIVE, &tty->flags) && !capable(CAP_SYS_ADMIN))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1353) 		return -EBUSY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1354) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1355) 	ld = tty_ldisc_ref_wait(tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1356) 	if (ld) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1357) 		tty_ldisc_deref(ld);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1358) 	} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1359) 		retval = tty_ldisc_lock(tty, 5 * HZ);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1360) 		if (retval)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1361) 			return retval;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1362) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1363) 		if (!tty->ldisc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1364) 			retval = tty_ldisc_reinit(tty, tty->termios.c_line);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1365) 		tty_ldisc_unlock(tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1366) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1367) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1368) 	if (retval == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1369) 		tty->count++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1370) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1371) 	return retval;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1372) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1373) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1374) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1375)  *	tty_init_dev		-	initialise a tty device
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1376)  *	@driver: tty driver we are opening a device on
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1377)  *	@idx: device index
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1378)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1379)  *	Prepare a tty device. This may not be a "new" clean device but
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1380)  *	could also be an active device. The pty drivers require special
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1381)  *	handling because of this.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1382)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1383)  *	Locking:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1384)  *		The function is called under the tty_mutex, which
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1385)  *	protects us from the tty struct or driver itself going away.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1386)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1387)  *	On exit the tty device has the line discipline attached and
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1388)  *	a reference count of 1. If a pair was created for pty/tty use
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1389)  *	and the other was a pty master then it too has a reference count of 1.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1390)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1391)  * WSH 06/09/97: Rewritten to remove races and properly clean up after a
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1392)  * failed open.  The new code protects the open with a mutex, so it's
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1393)  * really quite straightforward.  The mutex locking can probably be
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1394)  * relaxed for the (most common) case of reopening a tty.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1395)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1396)  *	Return: returned tty structure
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1397)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1398) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1399) struct tty_struct *tty_init_dev(struct tty_driver *driver, int idx)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1400) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1401) 	struct tty_struct *tty;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1402) 	int retval;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1403) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1404) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1405) 	 * First time open is complex, especially for PTY devices.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1406) 	 * This code guarantees that either everything succeeds and the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1407) 	 * TTY is ready for operation, or else the table slots are vacated
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1408) 	 * and the allocated memory released.  (Except that the termios
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1409) 	 * may be retained.)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1410) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1411) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1412) 	if (!try_module_get(driver->owner))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1413) 		return ERR_PTR(-ENODEV);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1414) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1415) 	tty = alloc_tty_struct(driver, idx);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1416) 	if (!tty) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1417) 		retval = -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1418) 		goto err_module_put;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1419) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1420) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1421) 	tty_lock(tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1422) 	retval = tty_driver_install_tty(driver, tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1423) 	if (retval < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1424) 		goto err_free_tty;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1425) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1426) 	if (!tty->port)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1427) 		tty->port = driver->ports[idx];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1428) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1429) 	if (WARN_RATELIMIT(!tty->port,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1430) 			"%s: %s driver does not set tty->port. This would crash the kernel. Fix the driver!\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1431) 			__func__, tty->driver->name)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1432) 		retval = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1433) 		goto err_release_lock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1434) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1435) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1436) 	retval = tty_ldisc_lock(tty, 5 * HZ);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1437) 	if (retval)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1438) 		goto err_release_lock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1439) 	tty->port->itty = tty;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1440) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1441) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1442) 	 * Structures all installed ... call the ldisc open routines.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1443) 	 * If we fail here just call release_tty to clean up.  No need
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1444) 	 * to decrement the use counts, as release_tty doesn't care.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1445) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1446) 	retval = tty_ldisc_setup(tty, tty->link);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1447) 	if (retval)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1448) 		goto err_release_tty;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1449) 	tty_ldisc_unlock(tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1450) 	/* Return the tty locked so that it cannot vanish under the caller */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1451) 	return tty;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1452) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1453) err_free_tty:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1454) 	tty_unlock(tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1455) 	free_tty_struct(tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1456) err_module_put:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1457) 	module_put(driver->owner);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1458) 	return ERR_PTR(retval);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1459) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1460) 	/* call the tty release_tty routine to clean out this slot */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1461) err_release_tty:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1462) 	tty_ldisc_unlock(tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1463) 	tty_info_ratelimited(tty, "ldisc open failed (%d), clearing slot %d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1464) 			     retval, idx);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1465) err_release_lock:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1466) 	tty_unlock(tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1467) 	release_tty(tty, idx);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1468) 	return ERR_PTR(retval);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1469) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1470) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1471) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1472)  * tty_save_termios() - save tty termios data in driver table
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1473)  * @tty: tty whose termios data to save
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1474)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1475)  * Locking: Caller guarantees serialisation with tty_init_termios().
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1476)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1477) void tty_save_termios(struct tty_struct *tty)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1478) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1479) 	struct ktermios *tp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1480) 	int idx = tty->index;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1481) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1482) 	/* If the port is going to reset then it has no termios to save */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1483) 	if (tty->driver->flags & TTY_DRIVER_RESET_TERMIOS)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1484) 		return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1485) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1486) 	/* Stash the termios data */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1487) 	tp = tty->driver->termios[idx];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1488) 	if (tp == NULL) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1489) 		tp = kmalloc(sizeof(*tp), GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1490) 		if (tp == NULL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1491) 			return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1492) 		tty->driver->termios[idx] = tp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1493) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1494) 	*tp = tty->termios;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1495) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1496) EXPORT_SYMBOL_GPL(tty_save_termios);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1497) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1498) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1499)  *	tty_flush_works		-	flush all works of a tty/pty pair
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1500)  *	@tty: tty device to flush works for (or either end of a pty pair)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1501)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1502)  *	Sync flush all works belonging to @tty (and the 'other' tty).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1503)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1504) static void tty_flush_works(struct tty_struct *tty)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1505) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1506) 	flush_work(&tty->SAK_work);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1507) 	flush_work(&tty->hangup_work);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1508) 	if (tty->link) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1509) 		flush_work(&tty->link->SAK_work);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1510) 		flush_work(&tty->link->hangup_work);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1511) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1512) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1513) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1514) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1515)  *	release_one_tty		-	release tty structure memory
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1516)  *	@work: work of tty we are obliterating
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1517)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1518)  *	Releases memory associated with a tty structure, and clears out the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1519)  *	driver table slots. This function is called when a device is no longer
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1520)  *	in use. It also gets called when setup of a device fails.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1521)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1522)  *	Locking:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1523)  *		takes the file list lock internally when working on the list
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1524)  *	of ttys that the driver keeps.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1525)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1526)  *	This method gets called from a work queue so that the driver private
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1527)  *	cleanup ops can sleep (needed for USB at least)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1528)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1529) static void release_one_tty(struct work_struct *work)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1530) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1531) 	struct tty_struct *tty =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1532) 		container_of(work, struct tty_struct, hangup_work);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1533) 	struct tty_driver *driver = tty->driver;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1534) 	struct module *owner = driver->owner;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1535) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1536) 	if (tty->ops->cleanup)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1537) 		tty->ops->cleanup(tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1538) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1539) 	tty->magic = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1540) 	tty_driver_kref_put(driver);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1541) 	module_put(owner);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1542) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1543) 	spin_lock(&tty->files_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1544) 	list_del_init(&tty->tty_files);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1545) 	spin_unlock(&tty->files_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1546) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1547) 	put_pid(tty->pgrp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1548) 	put_pid(tty->session);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1549) 	free_tty_struct(tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1550) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1551) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1552) static void queue_release_one_tty(struct kref *kref)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1553) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1554) 	struct tty_struct *tty = container_of(kref, struct tty_struct, kref);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1555) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1556) 	/* The hangup queue is now free so we can reuse it rather than
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1557) 	   waste a chunk of memory for each port */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1558) 	INIT_WORK(&tty->hangup_work, release_one_tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1559) 	schedule_work(&tty->hangup_work);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1560) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1561) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1562) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1563)  *	tty_kref_put		-	release a tty kref
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1564)  *	@tty: tty device
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1565)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1566)  *	Release a reference to a tty device and if need be let the kref
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1567)  *	layer destruct the object for us
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1568)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1569) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1570) void tty_kref_put(struct tty_struct *tty)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1571) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1572) 	if (tty)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1573) 		kref_put(&tty->kref, queue_release_one_tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1574) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1575) EXPORT_SYMBOL(tty_kref_put);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1576) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1577) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1578)  *	release_tty		-	release tty structure memory
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1579)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1580)  *	Release both @tty and a possible linked partner (think pty pair),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1581)  *	and decrement the refcount of the backing module.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1582)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1583)  *	Locking:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1584)  *		tty_mutex
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1585)  *		takes the file list lock internally when working on the list
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1586)  *	of ttys that the driver keeps.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1587)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1588)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1589) static void release_tty(struct tty_struct *tty, int idx)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1590) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1591) 	/* This should always be true but check for the moment */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1592) 	WARN_ON(tty->index != idx);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1593) 	WARN_ON(!mutex_is_locked(&tty_mutex));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1594) 	if (tty->ops->shutdown)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1595) 		tty->ops->shutdown(tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1596) 	tty_save_termios(tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1597) 	tty_driver_remove_tty(tty->driver, tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1598) 	if (tty->port)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1599) 		tty->port->itty = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1600) 	if (tty->link)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1601) 		tty->link->port->itty = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1602) 	if (tty->port)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1603) 		tty_buffer_cancel_work(tty->port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1604) 	if (tty->link)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1605) 		tty_buffer_cancel_work(tty->link->port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1606) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1607) 	tty_kref_put(tty->link);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1608) 	tty_kref_put(tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1609) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1610) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1611) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1612)  *	tty_release_checks - check a tty before real release
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1613)  *	@tty: tty to check
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1614)  *	@idx: index of the tty
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1615)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1616)  *	Performs some paranoid checking before true release of the @tty.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1617)  *	This is a no-op unless TTY_PARANOIA_CHECK is defined.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1618)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1619) static int tty_release_checks(struct tty_struct *tty, int idx)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1620) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1621) #ifdef TTY_PARANOIA_CHECK
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1622) 	if (idx < 0 || idx >= tty->driver->num) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1623) 		tty_debug(tty, "bad idx %d\n", idx);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1624) 		return -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1625) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1626) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1627) 	/* not much to check for devpts */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1628) 	if (tty->driver->flags & TTY_DRIVER_DEVPTS_MEM)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1629) 		return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1630) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1631) 	if (tty != tty->driver->ttys[idx]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1632) 		tty_debug(tty, "bad driver table[%d] = %p\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1633) 			  idx, tty->driver->ttys[idx]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1634) 		return -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1635) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1636) 	if (tty->driver->other) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1637) 		struct tty_struct *o_tty = tty->link;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1638) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1639) 		if (o_tty != tty->driver->other->ttys[idx]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1640) 			tty_debug(tty, "bad other table[%d] = %p\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1641) 				  idx, tty->driver->other->ttys[idx]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1642) 			return -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1643) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1644) 		if (o_tty->link != tty) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1645) 			tty_debug(tty, "bad link = %p\n", o_tty->link);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1646) 			return -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1647) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1648) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1649) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1650) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1651) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1652) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1653) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1654)  *      tty_kclose      -       closes tty opened by tty_kopen
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1655)  *      @tty: tty device
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1656)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1657)  *      Performs the final steps to release and free a tty device. It is the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1658)  *      same as tty_release_struct except that it also resets TTY_PORT_KOPENED
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1659)  *      flag on tty->port.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1660)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1661) void tty_kclose(struct tty_struct *tty)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1662) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1663) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1664) 	 * Ask the line discipline code to release its structures
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1665) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1666) 	tty_ldisc_release(tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1667) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1668) 	/* Wait for pending work before tty destruction commmences */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1669) 	tty_flush_works(tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1670) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1671) 	tty_debug_hangup(tty, "freeing structure\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1672) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1673) 	 * The release_tty function takes care of the details of clearing
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1674) 	 * the slots and preserving the termios structure.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1675) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1676) 	mutex_lock(&tty_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1677) 	tty_port_set_kopened(tty->port, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1678) 	release_tty(tty, tty->index);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1679) 	mutex_unlock(&tty_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1680) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1681) EXPORT_SYMBOL_GPL(tty_kclose);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1682) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1683) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1684)  *	tty_release_struct	-	release a tty struct
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1685)  *	@tty: tty device
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1686)  *	@idx: index of the tty
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1687)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1688)  *	Performs the final steps to release and free a tty device. It is
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1689)  *	roughly the reverse of tty_init_dev.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1690)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1691) void tty_release_struct(struct tty_struct *tty, int idx)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1692) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1693) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1694) 	 * Ask the line discipline code to release its structures
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1695) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1696) 	tty_ldisc_release(tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1697) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1698) 	/* Wait for pending work before tty destruction commmences */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1699) 	tty_flush_works(tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1700) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1701) 	tty_debug_hangup(tty, "freeing structure\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1702) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1703) 	 * The release_tty function takes care of the details of clearing
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1704) 	 * the slots and preserving the termios structure.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1705) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1706) 	mutex_lock(&tty_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1707) 	release_tty(tty, idx);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1708) 	mutex_unlock(&tty_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1709) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1710) EXPORT_SYMBOL_GPL(tty_release_struct);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1711) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1712) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1713)  *	tty_release		-	vfs callback for close
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1714)  *	@inode: inode of tty
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1715)  *	@filp: file pointer for handle to tty
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1716)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1717)  *	Called the last time each file handle is closed that references
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1718)  *	this tty. There may however be several such references.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1719)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1720)  *	Locking:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1721)  *		Takes bkl. See tty_release_dev
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1722)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1723)  * Even releasing the tty structures is a tricky business.. We have
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1724)  * to be very careful that the structures are all released at the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1725)  * same time, as interrupts might otherwise get the wrong pointers.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1726)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1727)  * WSH 09/09/97: rewritten to avoid some nasty race conditions that could
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1728)  * lead to double frees or releasing memory still in use.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1729)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1730) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1731) int tty_release(struct inode *inode, struct file *filp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1732) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1733) 	struct tty_struct *tty = file_tty(filp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1734) 	struct tty_struct *o_tty = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1735) 	int	do_sleep, final;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1736) 	int	idx;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1737) 	long	timeout = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1738) 	int	once = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1739) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1740) 	if (tty_paranoia_check(tty, inode, __func__))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1741) 		return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1742) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1743) 	tty_lock(tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1744) 	check_tty_count(tty, __func__);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1745) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1746) 	__tty_fasync(-1, filp, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1747) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1748) 	idx = tty->index;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1749) 	if (tty->driver->type == TTY_DRIVER_TYPE_PTY &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1750) 	    tty->driver->subtype == PTY_TYPE_MASTER)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1751) 		o_tty = tty->link;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1752) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1753) 	if (tty_release_checks(tty, idx)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1754) 		tty_unlock(tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1755) 		return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1756) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1757) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1758) 	tty_debug_hangup(tty, "releasing (count=%d)\n", tty->count);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1759) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1760) 	if (tty->ops->close)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1761) 		tty->ops->close(tty, filp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1762) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1763) 	/* If tty is pty master, lock the slave pty (stable lock order) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1764) 	tty_lock_slave(o_tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1765) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1766) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1767) 	 * Sanity check: if tty->count is going to zero, there shouldn't be
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1768) 	 * any waiters on tty->read_wait or tty->write_wait.  We test the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1769) 	 * wait queues and kick everyone out _before_ actually starting to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1770) 	 * close.  This ensures that we won't block while releasing the tty
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1771) 	 * structure.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1772) 	 *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1773) 	 * The test for the o_tty closing is necessary, since the master and
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1774) 	 * slave sides may close in any order.  If the slave side closes out
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1775) 	 * first, its count will be one, since the master side holds an open.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1776) 	 * Thus this test wouldn't be triggered at the time the slave closed,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1777) 	 * so we do it now.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1778) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1779) 	while (1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1780) 		do_sleep = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1781) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1782) 		if (tty->count <= 1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1783) 			if (waitqueue_active(&tty->read_wait)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1784) 				wake_up_poll(&tty->read_wait, EPOLLIN);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1785) 				do_sleep++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1786) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1787) 			if (waitqueue_active(&tty->write_wait)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1788) 				wake_up_poll(&tty->write_wait, EPOLLOUT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1789) 				do_sleep++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1790) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1791) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1792) 		if (o_tty && o_tty->count <= 1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1793) 			if (waitqueue_active(&o_tty->read_wait)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1794) 				wake_up_poll(&o_tty->read_wait, EPOLLIN);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1795) 				do_sleep++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1796) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1797) 			if (waitqueue_active(&o_tty->write_wait)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1798) 				wake_up_poll(&o_tty->write_wait, EPOLLOUT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1799) 				do_sleep++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1800) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1801) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1802) 		if (!do_sleep)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1803) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1804) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1805) 		if (once) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1806) 			once = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1807) 			tty_warn(tty, "read/write wait queue active!\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1808) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1809) 		schedule_timeout_killable(timeout);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1810) 		if (timeout < 120 * HZ)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1811) 			timeout = 2 * timeout + 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1812) 		else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1813) 			timeout = MAX_SCHEDULE_TIMEOUT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1814) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1815) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1816) 	if (o_tty) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1817) 		if (--o_tty->count < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1818) 			tty_warn(tty, "bad slave count (%d)\n", o_tty->count);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1819) 			o_tty->count = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1820) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1821) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1822) 	if (--tty->count < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1823) 		tty_warn(tty, "bad tty->count (%d)\n", tty->count);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1824) 		tty->count = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1825) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1826) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1827) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1828) 	 * We've decremented tty->count, so we need to remove this file
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1829) 	 * descriptor off the tty->tty_files list; this serves two
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1830) 	 * purposes:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1831) 	 *  - check_tty_count sees the correct number of file descriptors
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1832) 	 *    associated with this tty.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1833) 	 *  - do_tty_hangup no longer sees this file descriptor as
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1834) 	 *    something that needs to be handled for hangups.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1835) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1836) 	tty_del_file(filp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1837) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1838) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1839) 	 * Perform some housekeeping before deciding whether to return.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1840) 	 *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1841) 	 * If _either_ side is closing, make sure there aren't any
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1842) 	 * processes that still think tty or o_tty is their controlling
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1843) 	 * tty.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1844) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1845) 	if (!tty->count) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1846) 		read_lock(&tasklist_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1847) 		session_clear_tty(tty->session);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1848) 		if (o_tty)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1849) 			session_clear_tty(o_tty->session);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1850) 		read_unlock(&tasklist_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1851) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1852) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1853) 	/* check whether both sides are closing ... */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1854) 	final = !tty->count && !(o_tty && o_tty->count);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1855) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1856) 	tty_unlock_slave(o_tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1857) 	tty_unlock(tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1858) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1859) 	/* At this point, the tty->count == 0 should ensure a dead tty
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1860) 	   cannot be re-opened by a racing opener */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1861) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1862) 	if (!final)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1863) 		return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1864) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1865) 	tty_debug_hangup(tty, "final close\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1866) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1867) 	tty_release_struct(tty, idx);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1868) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1869) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1870) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1871) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1872)  *	tty_open_current_tty - get locked tty of current task
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1873)  *	@device: device number
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1874)  *	@filp: file pointer to tty
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1875)  *	@return: locked tty of the current task iff @device is /dev/tty
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1876)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1877)  *	Performs a re-open of the current task's controlling tty.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1878)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1879)  *	We cannot return driver and index like for the other nodes because
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1880)  *	devpts will not work then. It expects inodes to be from devpts FS.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1881)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1882) static struct tty_struct *tty_open_current_tty(dev_t device, struct file *filp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1883) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1884) 	struct tty_struct *tty;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1885) 	int retval;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1886) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1887) 	if (device != MKDEV(TTYAUX_MAJOR, 0))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1888) 		return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1889) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1890) 	tty = get_current_tty();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1891) 	if (!tty)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1892) 		return ERR_PTR(-ENXIO);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1893) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1894) 	filp->f_flags |= O_NONBLOCK; /* Don't let /dev/tty block */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1895) 	/* noctty = 1; */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1896) 	tty_lock(tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1897) 	tty_kref_put(tty);	/* safe to drop the kref now */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1898) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1899) 	retval = tty_reopen(tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1900) 	if (retval < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1901) 		tty_unlock(tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1902) 		tty = ERR_PTR(retval);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1903) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1904) 	return tty;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1905) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1906) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1907) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1908)  *	tty_lookup_driver - lookup a tty driver for a given device file
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1909)  *	@device: device number
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1910)  *	@filp: file pointer to tty
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1911)  *	@index: index for the device in the @return driver
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1912)  *	@return: driver for this inode (with increased refcount)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1913)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1914)  * 	If @return is not erroneous, the caller is responsible to decrement the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1915)  * 	refcount by tty_driver_kref_put.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1916)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1917)  *	Locking: tty_mutex protects get_tty_driver
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1918)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1919) static struct tty_driver *tty_lookup_driver(dev_t device, struct file *filp,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1920) 		int *index)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1921) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1922) 	struct tty_driver *driver = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1923) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1924) 	switch (device) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1925) #ifdef CONFIG_VT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1926) 	case MKDEV(TTY_MAJOR, 0): {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1927) 		extern struct tty_driver *console_driver;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1928) 		driver = tty_driver_kref_get(console_driver);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1929) 		*index = fg_console;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1930) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1931) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1932) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1933) 	case MKDEV(TTYAUX_MAJOR, 1): {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1934) 		struct tty_driver *console_driver = console_device(index);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1935) 		if (console_driver) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1936) 			driver = tty_driver_kref_get(console_driver);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1937) 			if (driver && filp) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1938) 				/* Don't let /dev/console block */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1939) 				filp->f_flags |= O_NONBLOCK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1940) 				break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1941) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1942) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1943) 		if (driver)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1944) 			tty_driver_kref_put(driver);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1945) 		return ERR_PTR(-ENODEV);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1946) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1947) 	default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1948) 		driver = get_tty_driver(device, index);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1949) 		if (!driver)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1950) 			return ERR_PTR(-ENODEV);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1951) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1952) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1953) 	return driver;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1954) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1955) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1956) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1957)  *	tty_kopen	-	open a tty device for kernel
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1958)  *	@device: dev_t of device to open
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1959)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1960)  *	Opens tty exclusively for kernel. Performs the driver lookup,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1961)  *	makes sure it's not already opened and performs the first-time
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1962)  *	tty initialization.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1963)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1964)  *	Returns the locked initialized &tty_struct
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1965)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1966)  *	Claims the global tty_mutex to serialize:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1967)  *	  - concurrent first-time tty initialization
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1968)  *	  - concurrent tty driver removal w/ lookup
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1969)  *	  - concurrent tty removal from driver table
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1970)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1971) struct tty_struct *tty_kopen(dev_t device)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1972) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1973) 	struct tty_struct *tty;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1974) 	struct tty_driver *driver;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1975) 	int index = -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1976) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1977) 	mutex_lock(&tty_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1978) 	driver = tty_lookup_driver(device, NULL, &index);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1979) 	if (IS_ERR(driver)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1980) 		mutex_unlock(&tty_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1981) 		return ERR_CAST(driver);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1982) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1983) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1984) 	/* check whether we're reopening an existing tty */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1985) 	tty = tty_driver_lookup_tty(driver, NULL, index);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1986) 	if (IS_ERR(tty))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1987) 		goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1988) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1989) 	if (tty) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1990) 		/* drop kref from tty_driver_lookup_tty() */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1991) 		tty_kref_put(tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1992) 		tty = ERR_PTR(-EBUSY);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1993) 	} else { /* tty_init_dev returns tty with the tty_lock held */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1994) 		tty = tty_init_dev(driver, index);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1995) 		if (IS_ERR(tty))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1996) 			goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1997) 		tty_port_set_kopened(tty->port, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1998) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1999) out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2000) 	mutex_unlock(&tty_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2001) 	tty_driver_kref_put(driver);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2002) 	return tty;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2003) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2004) EXPORT_SYMBOL_GPL(tty_kopen);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2005) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2006) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2007)  *	tty_open_by_driver	-	open a tty device
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2008)  *	@device: dev_t of device to open
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2009)  *	@filp: file pointer to tty
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2010)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2011)  *	Performs the driver lookup, checks for a reopen, or otherwise
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2012)  *	performs the first-time tty initialization.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2013)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2014)  *	Returns the locked initialized or re-opened &tty_struct
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2015)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2016)  *	Claims the global tty_mutex to serialize:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2017)  *	  - concurrent first-time tty initialization
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2018)  *	  - concurrent tty driver removal w/ lookup
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2019)  *	  - concurrent tty removal from driver table
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2020)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2021) static struct tty_struct *tty_open_by_driver(dev_t device,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2022) 					     struct file *filp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2023) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2024) 	struct tty_struct *tty;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2025) 	struct tty_driver *driver = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2026) 	int index = -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2027) 	int retval;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2028) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2029) 	mutex_lock(&tty_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2030) 	driver = tty_lookup_driver(device, filp, &index);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2031) 	if (IS_ERR(driver)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2032) 		mutex_unlock(&tty_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2033) 		return ERR_CAST(driver);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2034) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2035) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2036) 	/* check whether we're reopening an existing tty */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2037) 	tty = tty_driver_lookup_tty(driver, filp, index);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2038) 	if (IS_ERR(tty)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2039) 		mutex_unlock(&tty_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2040) 		goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2041) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2042) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2043) 	if (tty) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2044) 		if (tty_port_kopened(tty->port)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2045) 			tty_kref_put(tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2046) 			mutex_unlock(&tty_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2047) 			tty = ERR_PTR(-EBUSY);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2048) 			goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2049) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2050) 		mutex_unlock(&tty_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2051) 		retval = tty_lock_interruptible(tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2052) 		tty_kref_put(tty);  /* drop kref from tty_driver_lookup_tty() */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2053) 		if (retval) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2054) 			if (retval == -EINTR)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2055) 				retval = -ERESTARTSYS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2056) 			tty = ERR_PTR(retval);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2057) 			goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2058) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2059) 		retval = tty_reopen(tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2060) 		if (retval < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2061) 			tty_unlock(tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2062) 			tty = ERR_PTR(retval);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2063) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2064) 	} else { /* Returns with the tty_lock held for now */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2065) 		tty = tty_init_dev(driver, index);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2066) 		mutex_unlock(&tty_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2067) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2068) out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2069) 	tty_driver_kref_put(driver);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2070) 	return tty;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2071) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2072) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2073) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2074)  *	tty_open		-	open a tty device
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2075)  *	@inode: inode of device file
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2076)  *	@filp: file pointer to tty
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2077)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2078)  *	tty_open and tty_release keep up the tty count that contains the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2079)  *	number of opens done on a tty. We cannot use the inode-count, as
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2080)  *	different inodes might point to the same tty.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2081)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2082)  *	Open-counting is needed for pty masters, as well as for keeping
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2083)  *	track of serial lines: DTR is dropped when the last close happens.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2084)  *	(This is not done solely through tty->count, now.  - Ted 1/27/92)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2085)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2086)  *	The termios state of a pty is reset on first open so that
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2087)  *	settings don't persist across reuse.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2088)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2089)  *	Locking: tty_mutex protects tty, tty_lookup_driver and tty_init_dev.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2090)  *		 tty->count should protect the rest.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2091)  *		 ->siglock protects ->signal/->sighand
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2092)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2093)  *	Note: the tty_unlock/lock cases without a ref are only safe due to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2094)  *	tty_mutex
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2095)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2096) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2097) static int tty_open(struct inode *inode, struct file *filp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2098) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2099) 	struct tty_struct *tty;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2100) 	int noctty, retval;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2101) 	dev_t device = inode->i_rdev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2102) 	unsigned saved_flags = filp->f_flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2103) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2104) 	nonseekable_open(inode, filp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2105) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2106) retry_open:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2107) 	retval = tty_alloc_file(filp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2108) 	if (retval)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2109) 		return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2110) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2111) 	tty = tty_open_current_tty(device, filp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2112) 	if (!tty)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2113) 		tty = tty_open_by_driver(device, filp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2114) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2115) 	if (IS_ERR(tty)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2116) 		tty_free_file(filp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2117) 		retval = PTR_ERR(tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2118) 		if (retval != -EAGAIN || signal_pending(current))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2119) 			return retval;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2120) 		schedule();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2121) 		goto retry_open;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2122) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2123) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2124) 	tty_add_file(tty, filp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2125) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2126) 	check_tty_count(tty, __func__);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2127) 	tty_debug_hangup(tty, "opening (count=%d)\n", tty->count);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2128) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2129) 	if (tty->ops->open)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2130) 		retval = tty->ops->open(tty, filp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2131) 	else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2132) 		retval = -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2133) 	filp->f_flags = saved_flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2134) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2135) 	if (retval) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2136) 		tty_debug_hangup(tty, "open error %d, releasing\n", retval);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2137) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2138) 		tty_unlock(tty); /* need to call tty_release without BTM */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2139) 		tty_release(inode, filp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2140) 		if (retval != -ERESTARTSYS)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2141) 			return retval;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2142) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2143) 		if (signal_pending(current))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2144) 			return retval;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2145) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2146) 		schedule();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2147) 		/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2148) 		 * Need to reset f_op in case a hangup happened.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2149) 		 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2150) 		if (tty_hung_up_p(filp))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2151) 			filp->f_op = &tty_fops;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2152) 		goto retry_open;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2153) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2154) 	clear_bit(TTY_HUPPED, &tty->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2155) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2156) 	noctty = (filp->f_flags & O_NOCTTY) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2157) 		 (IS_ENABLED(CONFIG_VT) && device == MKDEV(TTY_MAJOR, 0)) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2158) 		 device == MKDEV(TTYAUX_MAJOR, 1) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2159) 		 (tty->driver->type == TTY_DRIVER_TYPE_PTY &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2160) 		  tty->driver->subtype == PTY_TYPE_MASTER);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2161) 	if (!noctty)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2162) 		tty_open_proc_set_tty(filp, tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2163) 	tty_unlock(tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2164) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2165) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2166) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2167) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2168) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2169) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2170)  *	tty_poll	-	check tty status
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2171)  *	@filp: file being polled
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2172)  *	@wait: poll wait structures to update
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2173)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2174)  *	Call the line discipline polling method to obtain the poll
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2175)  *	status of the device.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2176)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2177)  *	Locking: locks called line discipline but ldisc poll method
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2178)  *	may be re-entered freely by other callers.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2179)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2180) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2181) static __poll_t tty_poll(struct file *filp, poll_table *wait)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2182) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2183) 	struct tty_struct *tty = file_tty(filp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2184) 	struct tty_ldisc *ld;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2185) 	__poll_t ret = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2186) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2187) 	if (tty_paranoia_check(tty, file_inode(filp), "tty_poll"))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2188) 		return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2189) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2190) 	ld = tty_ldisc_ref_wait(tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2191) 	if (!ld)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2192) 		return hung_up_tty_poll(filp, wait);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2193) 	if (ld->ops->poll)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2194) 		ret = ld->ops->poll(tty, filp, wait);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2195) 	tty_ldisc_deref(ld);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2196) 	return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2197) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2198) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2199) static int __tty_fasync(int fd, struct file *filp, int on)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2200) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2201) 	struct tty_struct *tty = file_tty(filp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2202) 	unsigned long flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2203) 	int retval = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2204) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2205) 	if (tty_paranoia_check(tty, file_inode(filp), "tty_fasync"))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2206) 		goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2207) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2208) 	retval = fasync_helper(fd, filp, on, &tty->fasync);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2209) 	if (retval <= 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2210) 		goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2211) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2212) 	if (on) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2213) 		enum pid_type type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2214) 		struct pid *pid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2215) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2216) 		spin_lock_irqsave(&tty->ctrl_lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2217) 		if (tty->pgrp) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2218) 			pid = tty->pgrp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2219) 			type = PIDTYPE_PGID;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2220) 		} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2221) 			pid = task_pid(current);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2222) 			type = PIDTYPE_TGID;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2223) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2224) 		get_pid(pid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2225) 		spin_unlock_irqrestore(&tty->ctrl_lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2226) 		__f_setown(filp, pid, type, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2227) 		put_pid(pid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2228) 		retval = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2229) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2230) out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2231) 	return retval;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2232) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2233) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2234) static int tty_fasync(int fd, struct file *filp, int on)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2235) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2236) 	struct tty_struct *tty = file_tty(filp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2237) 	int retval = -ENOTTY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2238) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2239) 	tty_lock(tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2240) 	if (!tty_hung_up_p(filp))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2241) 		retval = __tty_fasync(fd, filp, on);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2242) 	tty_unlock(tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2243) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2244) 	return retval;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2245) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2246) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2247) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2248)  *	tiocsti			-	fake input character
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2249)  *	@tty: tty to fake input into
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2250)  *	@p: pointer to character
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2251)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2252)  *	Fake input to a tty device. Does the necessary locking and
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2253)  *	input management.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2254)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2255)  *	FIXME: does not honour flow control ??
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2256)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2257)  *	Locking:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2258)  *		Called functions take tty_ldiscs_lock
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2259)  *		current->signal->tty check is safe without locks
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2260)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2261) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2262) static int tiocsti(struct tty_struct *tty, char __user *p)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2263) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2264) 	char ch, mbz = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2265) 	struct tty_ldisc *ld;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2266) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2267) 	if ((current->signal->tty != tty) && !capable(CAP_SYS_ADMIN))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2268) 		return -EPERM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2269) 	if (get_user(ch, p))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2270) 		return -EFAULT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2271) 	tty_audit_tiocsti(tty, ch);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2272) 	ld = tty_ldisc_ref_wait(tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2273) 	if (!ld)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2274) 		return -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2275) 	tty_buffer_lock_exclusive(tty->port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2276) 	if (ld->ops->receive_buf)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2277) 		ld->ops->receive_buf(tty, &ch, &mbz, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2278) 	tty_buffer_unlock_exclusive(tty->port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2279) 	tty_ldisc_deref(ld);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2280) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2281) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2282) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2283) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2284)  *	tiocgwinsz		-	implement window query ioctl
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2285)  *	@tty: tty
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2286)  *	@arg: user buffer for result
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2287)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2288)  *	Copies the kernel idea of the window size into the user buffer.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2289)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2290)  *	Locking: tty->winsize_mutex is taken to ensure the winsize data
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2291)  *		is consistent.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2292)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2293) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2294) static int tiocgwinsz(struct tty_struct *tty, struct winsize __user *arg)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2295) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2296) 	int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2297) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2298) 	mutex_lock(&tty->winsize_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2299) 	err = copy_to_user(arg, &tty->winsize, sizeof(*arg));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2300) 	mutex_unlock(&tty->winsize_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2301) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2302) 	return err ? -EFAULT: 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2303) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2304) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2305) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2306)  *	tty_do_resize		-	resize event
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2307)  *	@tty: tty being resized
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2308)  *	@ws: new dimensions
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2309)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2310)  *	Update the termios variables and send the necessary signals to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2311)  *	peform a terminal resize correctly
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2312)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2313) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2314) int tty_do_resize(struct tty_struct *tty, struct winsize *ws)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2315) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2316) 	struct pid *pgrp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2317) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2318) 	/* Lock the tty */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2319) 	mutex_lock(&tty->winsize_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2320) 	if (!memcmp(ws, &tty->winsize, sizeof(*ws)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2321) 		goto done;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2322) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2323) 	/* Signal the foreground process group */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2324) 	pgrp = tty_get_pgrp(tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2325) 	if (pgrp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2326) 		kill_pgrp(pgrp, SIGWINCH, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2327) 	put_pid(pgrp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2328) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2329) 	tty->winsize = *ws;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2330) done:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2331) 	mutex_unlock(&tty->winsize_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2332) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2333) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2334) EXPORT_SYMBOL(tty_do_resize);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2335) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2336) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2337)  *	tiocswinsz		-	implement window size set ioctl
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2338)  *	@tty: tty side of tty
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2339)  *	@arg: user buffer for result
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2340)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2341)  *	Copies the user idea of the window size to the kernel. Traditionally
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2342)  *	this is just advisory information but for the Linux console it
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2343)  *	actually has driver level meaning and triggers a VC resize.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2344)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2345)  *	Locking:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2346)  *		Driver dependent. The default do_resize method takes the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2347)  *	tty termios mutex and ctrl_lock. The console takes its own lock
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2348)  *	then calls into the default method.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2349)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2350) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2351) static int tiocswinsz(struct tty_struct *tty, struct winsize __user *arg)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2352) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2353) 	struct winsize tmp_ws;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2354) 	if (copy_from_user(&tmp_ws, arg, sizeof(*arg)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2355) 		return -EFAULT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2356) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2357) 	if (tty->ops->resize)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2358) 		return tty->ops->resize(tty, &tmp_ws);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2359) 	else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2360) 		return tty_do_resize(tty, &tmp_ws);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2361) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2362) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2363) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2364)  *	tioccons	-	allow admin to move logical console
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2365)  *	@file: the file to become console
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2366)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2367)  *	Allow the administrator to move the redirected console device
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2368)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2369)  *	Locking: uses redirect_lock to guard the redirect information
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2370)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2371) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2372) static int tioccons(struct file *file)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2373) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2374) 	if (!capable(CAP_SYS_ADMIN))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2375) 		return -EPERM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2376) 	if (file->f_op->write_iter == redirected_tty_write) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2377) 		struct file *f;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2378) 		spin_lock(&redirect_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2379) 		f = redirect;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2380) 		redirect = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2381) 		spin_unlock(&redirect_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2382) 		if (f)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2383) 			fput(f);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2384) 		return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2385) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2386) 	if (file->f_op->write_iter != tty_write)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2387) 		return -ENOTTY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2388) 	if (!(file->f_mode & FMODE_WRITE))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2389) 		return -EBADF;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2390) 	if (!(file->f_mode & FMODE_CAN_WRITE))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2391) 		return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2392) 	spin_lock(&redirect_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2393) 	if (redirect) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2394) 		spin_unlock(&redirect_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2395) 		return -EBUSY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2396) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2397) 	redirect = get_file(file);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2398) 	spin_unlock(&redirect_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2399) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2400) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2401) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2402) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2403)  *	tiocsetd	-	set line discipline
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2404)  *	@tty: tty device
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2405)  *	@p: pointer to user data
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2406)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2407)  *	Set the line discipline according to user request.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2408)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2409)  *	Locking: see tty_set_ldisc, this function is just a helper
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2410)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2411) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2412) static int tiocsetd(struct tty_struct *tty, int __user *p)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2413) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2414) 	int disc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2415) 	int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2416) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2417) 	if (get_user(disc, p))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2418) 		return -EFAULT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2419) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2420) 	ret = tty_set_ldisc(tty, disc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2421) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2422) 	return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2423) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2424) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2425) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2426)  *	tiocgetd	-	get line discipline
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2427)  *	@tty: tty device
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2428)  *	@p: pointer to user data
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2429)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2430)  *	Retrieves the line discipline id directly from the ldisc.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2431)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2432)  *	Locking: waits for ldisc reference (in case the line discipline
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2433)  *		is changing or the tty is being hungup)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2434)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2435) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2436) static int tiocgetd(struct tty_struct *tty, int __user *p)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2437) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2438) 	struct tty_ldisc *ld;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2439) 	int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2440) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2441) 	ld = tty_ldisc_ref_wait(tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2442) 	if (!ld)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2443) 		return -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2444) 	ret = put_user(ld->ops->num, p);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2445) 	tty_ldisc_deref(ld);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2446) 	return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2447) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2448) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2449) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2450)  *	send_break	-	performed time break
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2451)  *	@tty: device to break on
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2452)  *	@duration: timeout in mS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2453)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2454)  *	Perform a timed break on hardware that lacks its own driver level
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2455)  *	timed break functionality.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2456)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2457)  *	Locking:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2458)  *		atomic_write_lock serializes
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2459)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2460)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2461) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2462) static int send_break(struct tty_struct *tty, unsigned int duration)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2463) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2464) 	int retval;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2465) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2466) 	if (tty->ops->break_ctl == NULL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2467) 		return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2468) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2469) 	if (tty->driver->flags & TTY_DRIVER_HARDWARE_BREAK)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2470) 		retval = tty->ops->break_ctl(tty, duration);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2471) 	else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2472) 		/* Do the work ourselves */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2473) 		if (tty_write_lock(tty, 0) < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2474) 			return -EINTR;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2475) 		retval = tty->ops->break_ctl(tty, -1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2476) 		if (retval)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2477) 			goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2478) 		if (!signal_pending(current))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2479) 			msleep_interruptible(duration);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2480) 		retval = tty->ops->break_ctl(tty, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2481) out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2482) 		tty_write_unlock(tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2483) 		if (signal_pending(current))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2484) 			retval = -EINTR;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2485) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2486) 	return retval;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2487) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2488) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2489) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2490)  *	tty_tiocmget		-	get modem status
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2491)  *	@tty: tty device
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2492)  *	@p: pointer to result
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2493)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2494)  *	Obtain the modem status bits from the tty driver if the feature
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2495)  *	is supported. Return -ENOTTY if it is not available.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2496)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2497)  *	Locking: none (up to the driver)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2498)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2499) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2500) static int tty_tiocmget(struct tty_struct *tty, int __user *p)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2501) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2502) 	int retval = -ENOTTY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2503) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2504) 	if (tty->ops->tiocmget) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2505) 		retval = tty->ops->tiocmget(tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2506) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2507) 		if (retval >= 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2508) 			retval = put_user(retval, p);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2509) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2510) 	return retval;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2511) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2512) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2513) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2514)  *	tty_tiocmset		-	set modem status
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2515)  *	@tty: tty device
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2516)  *	@cmd: command - clear bits, set bits or set all
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2517)  *	@p: pointer to desired bits
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2518)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2519)  *	Set the modem status bits from the tty driver if the feature
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2520)  *	is supported. Return -ENOTTY if it is not available.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2521)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2522)  *	Locking: none (up to the driver)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2523)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2524) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2525) static int tty_tiocmset(struct tty_struct *tty, unsigned int cmd,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2526) 	     unsigned __user *p)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2527) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2528) 	int retval;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2529) 	unsigned int set, clear, val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2530) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2531) 	if (tty->ops->tiocmset == NULL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2532) 		return -ENOTTY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2533) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2534) 	retval = get_user(val, p);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2535) 	if (retval)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2536) 		return retval;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2537) 	set = clear = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2538) 	switch (cmd) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2539) 	case TIOCMBIS:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2540) 		set = val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2541) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2542) 	case TIOCMBIC:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2543) 		clear = val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2544) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2545) 	case TIOCMSET:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2546) 		set = val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2547) 		clear = ~val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2548) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2549) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2550) 	set &= TIOCM_DTR|TIOCM_RTS|TIOCM_OUT1|TIOCM_OUT2|TIOCM_LOOP;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2551) 	clear &= TIOCM_DTR|TIOCM_RTS|TIOCM_OUT1|TIOCM_OUT2|TIOCM_LOOP;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2552) 	return tty->ops->tiocmset(tty, set, clear);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2553) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2554) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2555) static int tty_tiocgicount(struct tty_struct *tty, void __user *arg)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2556) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2557) 	int retval = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2558) 	struct serial_icounter_struct icount;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2559) 	memset(&icount, 0, sizeof(icount));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2560) 	if (tty->ops->get_icount)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2561) 		retval = tty->ops->get_icount(tty, &icount);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2562) 	if (retval != 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2563) 		return retval;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2564) 	if (copy_to_user(arg, &icount, sizeof(icount)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2565) 		return -EFAULT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2566) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2567) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2568) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2569) static int tty_tiocsserial(struct tty_struct *tty, struct serial_struct __user *ss)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2570) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2571) 	static DEFINE_RATELIMIT_STATE(depr_flags,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2572) 			DEFAULT_RATELIMIT_INTERVAL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2573) 			DEFAULT_RATELIMIT_BURST);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2574) 	char comm[TASK_COMM_LEN];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2575) 	struct serial_struct v;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2576) 	int flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2577) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2578) 	if (copy_from_user(&v, ss, sizeof(*ss)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2579) 		return -EFAULT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2580) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2581) 	flags = v.flags & ASYNC_DEPRECATED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2582) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2583) 	if (flags && __ratelimit(&depr_flags))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2584) 		pr_warn("%s: '%s' is using deprecated serial flags (with no effect): %.8x\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2585) 			__func__, get_task_comm(comm, current), flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2586) 	if (!tty->ops->set_serial)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2587) 		return -ENOTTY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2588) 	return tty->ops->set_serial(tty, &v);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2589) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2590) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2591) static int tty_tiocgserial(struct tty_struct *tty, struct serial_struct __user *ss)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2592) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2593) 	struct serial_struct v;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2594) 	int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2595) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2596) 	memset(&v, 0, sizeof(v));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2597) 	if (!tty->ops->get_serial)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2598) 		return -ENOTTY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2599) 	err = tty->ops->get_serial(tty, &v);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2600) 	if (!err && copy_to_user(ss, &v, sizeof(v)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2601) 		err = -EFAULT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2602) 	return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2603) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2604) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2605) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2606)  * if pty, return the slave side (real_tty)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2607)  * otherwise, return self
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2608)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2609) static struct tty_struct *tty_pair_get_tty(struct tty_struct *tty)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2610) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2611) 	if (tty->driver->type == TTY_DRIVER_TYPE_PTY &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2612) 	    tty->driver->subtype == PTY_TYPE_MASTER)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2613) 		tty = tty->link;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2614) 	return tty;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2615) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2616) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2617) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2618)  * Split this up, as gcc can choke on it otherwise..
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2619)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2620) long tty_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2621) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2622) 	struct tty_struct *tty = file_tty(file);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2623) 	struct tty_struct *real_tty;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2624) 	void __user *p = (void __user *)arg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2625) 	int retval;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2626) 	struct tty_ldisc *ld;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2627) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2628) 	if (tty_paranoia_check(tty, file_inode(file), "tty_ioctl"))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2629) 		return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2630) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2631) 	real_tty = tty_pair_get_tty(tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2632) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2633) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2634) 	 * Factor out some common prep work
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2635) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2636) 	switch (cmd) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2637) 	case TIOCSETD:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2638) 	case TIOCSBRK:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2639) 	case TIOCCBRK:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2640) 	case TCSBRK:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2641) 	case TCSBRKP:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2642) 		retval = tty_check_change(tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2643) 		if (retval)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2644) 			return retval;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2645) 		if (cmd != TIOCCBRK) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2646) 			tty_wait_until_sent(tty, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2647) 			if (signal_pending(current))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2648) 				return -EINTR;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2649) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2650) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2651) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2652) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2653) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2654) 	 *	Now do the stuff.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2655) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2656) 	switch (cmd) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2657) 	case TIOCSTI:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2658) 		return tiocsti(tty, p);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2659) 	case TIOCGWINSZ:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2660) 		return tiocgwinsz(real_tty, p);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2661) 	case TIOCSWINSZ:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2662) 		return tiocswinsz(real_tty, p);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2663) 	case TIOCCONS:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2664) 		return real_tty != tty ? -EINVAL : tioccons(file);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2665) 	case TIOCEXCL:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2666) 		set_bit(TTY_EXCLUSIVE, &tty->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2667) 		return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2668) 	case TIOCNXCL:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2669) 		clear_bit(TTY_EXCLUSIVE, &tty->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2670) 		return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2671) 	case TIOCGEXCL:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2672) 	{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2673) 		int excl = test_bit(TTY_EXCLUSIVE, &tty->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2674) 		return put_user(excl, (int __user *)p);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2675) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2676) 	case TIOCGETD:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2677) 		return tiocgetd(tty, p);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2678) 	case TIOCSETD:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2679) 		return tiocsetd(tty, p);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2680) 	case TIOCVHANGUP:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2681) 		if (!capable(CAP_SYS_ADMIN))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2682) 			return -EPERM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2683) 		tty_vhangup(tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2684) 		return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2685) 	case TIOCGDEV:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2686) 	{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2687) 		unsigned int ret = new_encode_dev(tty_devnum(real_tty));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2688) 		return put_user(ret, (unsigned int __user *)p);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2689) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2690) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2691) 	 * Break handling
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2692) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2693) 	case TIOCSBRK:	/* Turn break on, unconditionally */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2694) 		if (tty->ops->break_ctl)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2695) 			return tty->ops->break_ctl(tty, -1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2696) 		return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2697) 	case TIOCCBRK:	/* Turn break off, unconditionally */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2698) 		if (tty->ops->break_ctl)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2699) 			return tty->ops->break_ctl(tty, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2700) 		return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2701) 	case TCSBRK:   /* SVID version: non-zero arg --> no break */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2702) 		/* non-zero arg means wait for all output data
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2703) 		 * to be sent (performed above) but don't send break.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2704) 		 * This is used by the tcdrain() termios function.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2705) 		 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2706) 		if (!arg)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2707) 			return send_break(tty, 250);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2708) 		return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2709) 	case TCSBRKP:	/* support for POSIX tcsendbreak() */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2710) 		return send_break(tty, arg ? arg*100 : 250);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2711) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2712) 	case TIOCMGET:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2713) 		return tty_tiocmget(tty, p);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2714) 	case TIOCMSET:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2715) 	case TIOCMBIC:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2716) 	case TIOCMBIS:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2717) 		return tty_tiocmset(tty, cmd, p);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2718) 	case TIOCGICOUNT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2719) 		return tty_tiocgicount(tty, p);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2720) 	case TCFLSH:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2721) 		switch (arg) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2722) 		case TCIFLUSH:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2723) 		case TCIOFLUSH:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2724) 		/* flush tty buffer and allow ldisc to process ioctl */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2725) 			tty_buffer_flush(tty, NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2726) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2727) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2728) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2729) 	case TIOCSSERIAL:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2730) 		return tty_tiocsserial(tty, p);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2731) 	case TIOCGSERIAL:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2732) 		return tty_tiocgserial(tty, p);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2733) 	case TIOCGPTPEER:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2734) 		/* Special because the struct file is needed */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2735) 		return ptm_open_peer(file, tty, (int)arg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2736) 	default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2737) 		retval = tty_jobctrl_ioctl(tty, real_tty, file, cmd, arg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2738) 		if (retval != -ENOIOCTLCMD)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2739) 			return retval;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2740) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2741) 	if (tty->ops->ioctl) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2742) 		retval = tty->ops->ioctl(tty, cmd, arg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2743) 		if (retval != -ENOIOCTLCMD)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2744) 			return retval;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2745) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2746) 	ld = tty_ldisc_ref_wait(tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2747) 	if (!ld)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2748) 		return hung_up_tty_ioctl(file, cmd, arg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2749) 	retval = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2750) 	if (ld->ops->ioctl) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2751) 		retval = ld->ops->ioctl(tty, file, cmd, arg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2752) 		if (retval == -ENOIOCTLCMD)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2753) 			retval = -ENOTTY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2754) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2755) 	tty_ldisc_deref(ld);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2756) 	return retval;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2757) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2758) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2759) #ifdef CONFIG_COMPAT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2760) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2761) struct serial_struct32 {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2762) 	compat_int_t    type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2763) 	compat_int_t    line;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2764) 	compat_uint_t   port;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2765) 	compat_int_t    irq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2766) 	compat_int_t    flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2767) 	compat_int_t    xmit_fifo_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2768) 	compat_int_t    custom_divisor;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2769) 	compat_int_t    baud_base;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2770) 	unsigned short  close_delay;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2771) 	char    io_type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2772) 	char    reserved_char;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2773) 	compat_int_t    hub6;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2774) 	unsigned short  closing_wait; /* time to wait before closing */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2775) 	unsigned short  closing_wait2; /* no longer used... */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2776) 	compat_uint_t   iomem_base;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2777) 	unsigned short  iomem_reg_shift;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2778) 	unsigned int    port_high;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2779) 	/* compat_ulong_t  iomap_base FIXME */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2780) 	compat_int_t    reserved;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2781) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2782) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2783) static int compat_tty_tiocsserial(struct tty_struct *tty,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2784) 		struct serial_struct32 __user *ss)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2785) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2786) 	static DEFINE_RATELIMIT_STATE(depr_flags,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2787) 			DEFAULT_RATELIMIT_INTERVAL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2788) 			DEFAULT_RATELIMIT_BURST);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2789) 	char comm[TASK_COMM_LEN];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2790) 	struct serial_struct32 v32;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2791) 	struct serial_struct v;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2792) 	int flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2793) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2794) 	if (copy_from_user(&v32, ss, sizeof(*ss)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2795) 		return -EFAULT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2796) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2797) 	memcpy(&v, &v32, offsetof(struct serial_struct32, iomem_base));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2798) 	v.iomem_base = compat_ptr(v32.iomem_base);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2799) 	v.iomem_reg_shift = v32.iomem_reg_shift;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2800) 	v.port_high = v32.port_high;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2801) 	v.iomap_base = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2802) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2803) 	flags = v.flags & ASYNC_DEPRECATED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2804) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2805) 	if (flags && __ratelimit(&depr_flags))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2806) 		pr_warn("%s: '%s' is using deprecated serial flags (with no effect): %.8x\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2807) 			__func__, get_task_comm(comm, current), flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2808) 	if (!tty->ops->set_serial)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2809) 		return -ENOTTY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2810) 	return tty->ops->set_serial(tty, &v);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2811) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2812) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2813) static int compat_tty_tiocgserial(struct tty_struct *tty,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2814) 			struct serial_struct32 __user *ss)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2815) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2816) 	struct serial_struct32 v32;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2817) 	struct serial_struct v;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2818) 	int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2819) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2820) 	memset(&v, 0, sizeof(v));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2821) 	memset(&v32, 0, sizeof(v32));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2822) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2823) 	if (!tty->ops->get_serial)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2824) 		return -ENOTTY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2825) 	err = tty->ops->get_serial(tty, &v);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2826) 	if (!err) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2827) 		memcpy(&v32, &v, offsetof(struct serial_struct32, iomem_base));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2828) 		v32.iomem_base = (unsigned long)v.iomem_base >> 32 ?
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2829) 			0xfffffff : ptr_to_compat(v.iomem_base);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2830) 		v32.iomem_reg_shift = v.iomem_reg_shift;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2831) 		v32.port_high = v.port_high;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2832) 		if (copy_to_user(ss, &v32, sizeof(v32)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2833) 			err = -EFAULT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2834) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2835) 	return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2836) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2837) static long tty_compat_ioctl(struct file *file, unsigned int cmd,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2838) 				unsigned long arg)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2839) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2840) 	struct tty_struct *tty = file_tty(file);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2841) 	struct tty_ldisc *ld;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2842) 	int retval = -ENOIOCTLCMD;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2843) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2844) 	switch (cmd) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2845) 	case TIOCOUTQ:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2846) 	case TIOCSTI:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2847) 	case TIOCGWINSZ:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2848) 	case TIOCSWINSZ:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2849) 	case TIOCGEXCL:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2850) 	case TIOCGETD:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2851) 	case TIOCSETD:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2852) 	case TIOCGDEV:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2853) 	case TIOCMGET:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2854) 	case TIOCMSET:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2855) 	case TIOCMBIC:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2856) 	case TIOCMBIS:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2857) 	case TIOCGICOUNT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2858) 	case TIOCGPGRP:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2859) 	case TIOCSPGRP:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2860) 	case TIOCGSID:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2861) 	case TIOCSERGETLSR:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2862) 	case TIOCGRS485:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2863) 	case TIOCSRS485:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2864) #ifdef TIOCGETP
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2865) 	case TIOCGETP:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2866) 	case TIOCSETP:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2867) 	case TIOCSETN:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2868) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2869) #ifdef TIOCGETC
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2870) 	case TIOCGETC:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2871) 	case TIOCSETC:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2872) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2873) #ifdef TIOCGLTC
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2874) 	case TIOCGLTC:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2875) 	case TIOCSLTC:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2876) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2877) 	case TCSETSF:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2878) 	case TCSETSW:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2879) 	case TCSETS:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2880) 	case TCGETS:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2881) #ifdef TCGETS2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2882) 	case TCGETS2:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2883) 	case TCSETSF2:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2884) 	case TCSETSW2:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2885) 	case TCSETS2:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2886) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2887) 	case TCGETA:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2888) 	case TCSETAF:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2889) 	case TCSETAW:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2890) 	case TCSETA:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2891) 	case TIOCGLCKTRMIOS:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2892) 	case TIOCSLCKTRMIOS:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2893) #ifdef TCGETX
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2894) 	case TCGETX:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2895) 	case TCSETX:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2896) 	case TCSETXW:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2897) 	case TCSETXF:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2898) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2899) 	case TIOCGSOFTCAR:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2900) 	case TIOCSSOFTCAR:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2901) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2902) 	case PPPIOCGCHAN:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2903) 	case PPPIOCGUNIT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2904) 		return tty_ioctl(file, cmd, (unsigned long)compat_ptr(arg));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2905) 	case TIOCCONS:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2906) 	case TIOCEXCL:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2907) 	case TIOCNXCL:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2908) 	case TIOCVHANGUP:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2909) 	case TIOCSBRK:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2910) 	case TIOCCBRK:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2911) 	case TCSBRK:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2912) 	case TCSBRKP:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2913) 	case TCFLSH:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2914) 	case TIOCGPTPEER:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2915) 	case TIOCNOTTY:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2916) 	case TIOCSCTTY:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2917) 	case TCXONC:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2918) 	case TIOCMIWAIT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2919) 	case TIOCSERCONFIG:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2920) 		return tty_ioctl(file, cmd, arg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2921) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2922) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2923) 	if (tty_paranoia_check(tty, file_inode(file), "tty_ioctl"))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2924) 		return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2925) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2926) 	switch (cmd) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2927) 	case TIOCSSERIAL:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2928) 		return compat_tty_tiocsserial(tty, compat_ptr(arg));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2929) 	case TIOCGSERIAL:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2930) 		return compat_tty_tiocgserial(tty, compat_ptr(arg));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2931) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2932) 	if (tty->ops->compat_ioctl) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2933) 		retval = tty->ops->compat_ioctl(tty, cmd, arg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2934) 		if (retval != -ENOIOCTLCMD)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2935) 			return retval;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2936) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2937) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2938) 	ld = tty_ldisc_ref_wait(tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2939) 	if (!ld)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2940) 		return hung_up_tty_compat_ioctl(file, cmd, arg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2941) 	if (ld->ops->compat_ioctl)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2942) 		retval = ld->ops->compat_ioctl(tty, file, cmd, arg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2943) 	if (retval == -ENOIOCTLCMD && ld->ops->ioctl)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2944) 		retval = ld->ops->ioctl(tty, file,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2945) 				(unsigned long)compat_ptr(cmd), arg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2946) 	tty_ldisc_deref(ld);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2947) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2948) 	return retval;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2949) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2950) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2951) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2952) static int this_tty(const void *t, struct file *file, unsigned fd)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2953) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2954) 	if (likely(file->f_op->read_iter != tty_read))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2955) 		return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2956) 	return file_tty(file) != t ? 0 : fd + 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2957) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2958) 	
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2959) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2960)  * This implements the "Secure Attention Key" ---  the idea is to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2961)  * prevent trojan horses by killing all processes associated with this
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2962)  * tty when the user hits the "Secure Attention Key".  Required for
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2963)  * super-paranoid applications --- see the Orange Book for more details.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2964)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2965)  * This code could be nicer; ideally it should send a HUP, wait a few
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2966)  * seconds, then send a INT, and then a KILL signal.  But you then
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2967)  * have to coordinate with the init process, since all processes associated
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2968)  * with the current tty must be dead before the new getty is allowed
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2969)  * to spawn.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2970)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2971)  * Now, if it would be correct ;-/ The current code has a nasty hole -
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2972)  * it doesn't catch files in flight. We may send the descriptor to ourselves
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2973)  * via AF_UNIX socket, close it and later fetch from socket. FIXME.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2974)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2975)  * Nasty bug: do_SAK is being called in interrupt context.  This can
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2976)  * deadlock.  We punt it up to process context.  AKPM - 16Mar2001
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2977)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2978) void __do_SAK(struct tty_struct *tty)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2979) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2980) #ifdef TTY_SOFT_SAK
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2981) 	tty_hangup(tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2982) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2983) 	struct task_struct *g, *p;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2984) 	struct pid *session;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2985) 	int		i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2986) 	unsigned long flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2987) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2988) 	if (!tty)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2989) 		return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2990) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2991) 	spin_lock_irqsave(&tty->ctrl_lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2992) 	session = get_pid(tty->session);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2993) 	spin_unlock_irqrestore(&tty->ctrl_lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2994) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2995) 	tty_ldisc_flush(tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2996) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2997) 	tty_driver_flush_buffer(tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2998) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2999) 	read_lock(&tasklist_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3000) 	/* Kill the entire session */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3001) 	do_each_pid_task(session, PIDTYPE_SID, p) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3002) 		tty_notice(tty, "SAK: killed process %d (%s): by session\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3003) 			   task_pid_nr(p), p->comm);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3004) 		group_send_sig_info(SIGKILL, SEND_SIG_PRIV, p, PIDTYPE_SID);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3005) 	} while_each_pid_task(session, PIDTYPE_SID, p);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3006) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3007) 	/* Now kill any processes that happen to have the tty open */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3008) 	do_each_thread(g, p) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3009) 		if (p->signal->tty == tty) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3010) 			tty_notice(tty, "SAK: killed process %d (%s): by controlling tty\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3011) 				   task_pid_nr(p), p->comm);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3012) 			group_send_sig_info(SIGKILL, SEND_SIG_PRIV, p, PIDTYPE_SID);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3013) 			continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3014) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3015) 		task_lock(p);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3016) 		i = iterate_fd(p->files, 0, this_tty, tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3017) 		if (i != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3018) 			tty_notice(tty, "SAK: killed process %d (%s): by fd#%d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3019) 				   task_pid_nr(p), p->comm, i - 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3020) 			group_send_sig_info(SIGKILL, SEND_SIG_PRIV, p, PIDTYPE_SID);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3021) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3022) 		task_unlock(p);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3023) 	} while_each_thread(g, p);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3024) 	read_unlock(&tasklist_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3025) 	put_pid(session);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3026) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3027) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3028) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3029) static void do_SAK_work(struct work_struct *work)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3030) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3031) 	struct tty_struct *tty =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3032) 		container_of(work, struct tty_struct, SAK_work);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3033) 	__do_SAK(tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3034) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3035) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3036) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3037)  * The tq handling here is a little racy - tty->SAK_work may already be queued.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3038)  * Fortunately we don't need to worry, because if ->SAK_work is already queued,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3039)  * the values which we write to it will be identical to the values which it
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3040)  * already has. --akpm
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3041)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3042) void do_SAK(struct tty_struct *tty)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3043) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3044) 	if (!tty)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3045) 		return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3046) 	schedule_work(&tty->SAK_work);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3047) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3048) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3049) EXPORT_SYMBOL(do_SAK);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3050) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3051) /* Must put_device() after it's unused! */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3052) static struct device *tty_get_device(struct tty_struct *tty)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3053) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3054) 	dev_t devt = tty_devnum(tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3055) 	return class_find_device_by_devt(tty_class, devt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3056) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3057) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3058) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3059) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3060)  *	alloc_tty_struct
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3061)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3062)  *	This subroutine allocates and initializes a tty structure.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3063)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3064)  *	Locking: none - tty in question is not exposed at this point
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3065)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3066) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3067) struct tty_struct *alloc_tty_struct(struct tty_driver *driver, int idx)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3068) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3069) 	struct tty_struct *tty;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3070) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3071) 	tty = kzalloc(sizeof(*tty), GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3072) 	if (!tty)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3073) 		return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3074) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3075) 	kref_init(&tty->kref);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3076) 	tty->magic = TTY_MAGIC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3077) 	if (tty_ldisc_init(tty)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3078) 		kfree(tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3079) 		return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3080) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3081) 	tty->session = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3082) 	tty->pgrp = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3083) 	mutex_init(&tty->legacy_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3084) 	mutex_init(&tty->throttle_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3085) 	init_rwsem(&tty->termios_rwsem);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3086) 	mutex_init(&tty->winsize_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3087) 	init_ldsem(&tty->ldisc_sem);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3088) 	init_waitqueue_head(&tty->write_wait);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3089) 	init_waitqueue_head(&tty->read_wait);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3090) 	INIT_WORK(&tty->hangup_work, do_tty_hangup);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3091) 	mutex_init(&tty->atomic_write_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3092) 	spin_lock_init(&tty->ctrl_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3093) 	spin_lock_init(&tty->flow_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3094) 	spin_lock_init(&tty->files_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3095) 	INIT_LIST_HEAD(&tty->tty_files);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3096) 	INIT_WORK(&tty->SAK_work, do_SAK_work);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3097) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3098) 	tty->driver = driver;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3099) 	tty->ops = driver->ops;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3100) 	tty->index = idx;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3101) 	tty_line_name(driver, idx, tty->name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3102) 	tty->dev = tty_get_device(tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3103) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3104) 	return tty;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3105) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3106) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3107) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3108)  *	tty_put_char	-	write one character to a tty
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3109)  *	@tty: tty
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3110)  *	@ch: character
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3111)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3112)  *	Write one byte to the tty using the provided put_char method
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3113)  *	if present. Returns the number of characters successfully output.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3114)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3115)  *	Note: the specific put_char operation in the driver layer may go
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3116)  *	away soon. Don't call it directly, use this method
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3117)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3118) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3119) int tty_put_char(struct tty_struct *tty, unsigned char ch)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3120) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3121) 	if (tty->ops->put_char)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3122) 		return tty->ops->put_char(tty, ch);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3123) 	return tty->ops->write(tty, &ch, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3124) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3125) EXPORT_SYMBOL_GPL(tty_put_char);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3126) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3127) struct class *tty_class;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3128) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3129) static int tty_cdev_add(struct tty_driver *driver, dev_t dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3130) 		unsigned int index, unsigned int count)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3131) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3132) 	int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3133) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3134) 	/* init here, since reused cdevs cause crashes */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3135) 	driver->cdevs[index] = cdev_alloc();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3136) 	if (!driver->cdevs[index])
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3137) 		return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3138) 	driver->cdevs[index]->ops = &tty_fops;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3139) 	driver->cdevs[index]->owner = driver->owner;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3140) 	err = cdev_add(driver->cdevs[index], dev, count);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3141) 	if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3142) 		kobject_put(&driver->cdevs[index]->kobj);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3143) 	return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3144) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3145) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3146) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3147)  *	tty_register_device - register a tty device
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3148)  *	@driver: the tty driver that describes the tty device
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3149)  *	@index: the index in the tty driver for this tty device
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3150)  *	@device: a struct device that is associated with this tty device.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3151)  *		This field is optional, if there is no known struct device
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3152)  *		for this tty device it can be set to NULL safely.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3153)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3154)  *	Returns a pointer to the struct device for this tty device
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3155)  *	(or ERR_PTR(-EFOO) on error).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3156)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3157)  *	This call is required to be made to register an individual tty device
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3158)  *	if the tty driver's flags have the TTY_DRIVER_DYNAMIC_DEV bit set.  If
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3159)  *	that bit is not set, this function should not be called by a tty
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3160)  *	driver.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3161)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3162)  *	Locking: ??
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3163)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3164) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3165) struct device *tty_register_device(struct tty_driver *driver, unsigned index,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3166) 				   struct device *device)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3167) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3168) 	return tty_register_device_attr(driver, index, device, NULL, NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3169) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3170) EXPORT_SYMBOL(tty_register_device);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3171) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3172) static void tty_device_create_release(struct device *dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3173) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3174) 	dev_dbg(dev, "releasing...\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3175) 	kfree(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3176) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3177) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3178) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3179)  *	tty_register_device_attr - register a tty device
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3180)  *	@driver: the tty driver that describes the tty device
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3181)  *	@index: the index in the tty driver for this tty device
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3182)  *	@device: a struct device that is associated with this tty device.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3183)  *		This field is optional, if there is no known struct device
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3184)  *		for this tty device it can be set to NULL safely.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3185)  *	@drvdata: Driver data to be set to device.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3186)  *	@attr_grp: Attribute group to be set on device.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3187)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3188)  *	Returns a pointer to the struct device for this tty device
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3189)  *	(or ERR_PTR(-EFOO) on error).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3190)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3191)  *	This call is required to be made to register an individual tty device
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3192)  *	if the tty driver's flags have the TTY_DRIVER_DYNAMIC_DEV bit set.  If
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3193)  *	that bit is not set, this function should not be called by a tty
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3194)  *	driver.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3195)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3196)  *	Locking: ??
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3197)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3198) struct device *tty_register_device_attr(struct tty_driver *driver,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3199) 				   unsigned index, struct device *device,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3200) 				   void *drvdata,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3201) 				   const struct attribute_group **attr_grp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3202) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3203) 	char name[64];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3204) 	dev_t devt = MKDEV(driver->major, driver->minor_start) + index;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3205) 	struct ktermios *tp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3206) 	struct device *dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3207) 	int retval;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3208) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3209) 	if (index >= driver->num) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3210) 		pr_err("%s: Attempt to register invalid tty line number (%d)\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3211) 		       driver->name, index);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3212) 		return ERR_PTR(-EINVAL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3213) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3214) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3215) 	if (driver->type == TTY_DRIVER_TYPE_PTY)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3216) 		pty_line_name(driver, index, name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3217) 	else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3218) 		tty_line_name(driver, index, name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3219) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3220) 	dev = kzalloc(sizeof(*dev), GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3221) 	if (!dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3222) 		return ERR_PTR(-ENOMEM);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3223) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3224) 	dev->devt = devt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3225) 	dev->class = tty_class;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3226) 	dev->parent = device;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3227) 	dev->release = tty_device_create_release;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3228) 	dev_set_name(dev, "%s", name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3229) 	dev->groups = attr_grp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3230) 	dev_set_drvdata(dev, drvdata);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3231) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3232) 	dev_set_uevent_suppress(dev, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3233) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3234) 	retval = device_register(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3235) 	if (retval)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3236) 		goto err_put;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3237) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3238) 	if (!(driver->flags & TTY_DRIVER_DYNAMIC_ALLOC)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3239) 		/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3240) 		 * Free any saved termios data so that the termios state is
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3241) 		 * reset when reusing a minor number.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3242) 		 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3243) 		tp = driver->termios[index];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3244) 		if (tp) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3245) 			driver->termios[index] = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3246) 			kfree(tp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3247) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3248) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3249) 		retval = tty_cdev_add(driver, devt, index, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3250) 		if (retval)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3251) 			goto err_del;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3252) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3253) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3254) 	dev_set_uevent_suppress(dev, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3255) 	kobject_uevent(&dev->kobj, KOBJ_ADD);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3256) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3257) 	return dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3258) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3259) err_del:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3260) 	device_del(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3261) err_put:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3262) 	put_device(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3263) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3264) 	return ERR_PTR(retval);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3265) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3266) EXPORT_SYMBOL_GPL(tty_register_device_attr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3267) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3268) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3269)  * 	tty_unregister_device - unregister a tty device
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3270)  * 	@driver: the tty driver that describes the tty device
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3271)  * 	@index: the index in the tty driver for this tty device
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3272)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3273)  * 	If a tty device is registered with a call to tty_register_device() then
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3274)  *	this function must be called when the tty device is gone.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3275)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3276)  *	Locking: ??
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3277)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3278) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3279) void tty_unregister_device(struct tty_driver *driver, unsigned index)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3280) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3281) 	device_destroy(tty_class,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3282) 		MKDEV(driver->major, driver->minor_start) + index);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3283) 	if (!(driver->flags & TTY_DRIVER_DYNAMIC_ALLOC)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3284) 		cdev_del(driver->cdevs[index]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3285) 		driver->cdevs[index] = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3286) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3287) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3288) EXPORT_SYMBOL(tty_unregister_device);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3289) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3290) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3291)  * __tty_alloc_driver -- allocate tty driver
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3292)  * @lines: count of lines this driver can handle at most
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3293)  * @owner: module which is responsible for this driver
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3294)  * @flags: some of TTY_DRIVER_* flags, will be set in driver->flags
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3295)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3296)  * This should not be called directly, some of the provided macros should be
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3297)  * used instead. Use IS_ERR and friends on @retval.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3298)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3299) struct tty_driver *__tty_alloc_driver(unsigned int lines, struct module *owner,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3300) 		unsigned long flags)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3301) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3302) 	struct tty_driver *driver;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3303) 	unsigned int cdevs = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3304) 	int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3305) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3306) 	if (!lines || (flags & TTY_DRIVER_UNNUMBERED_NODE && lines > 1))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3307) 		return ERR_PTR(-EINVAL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3308) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3309) 	driver = kzalloc(sizeof(*driver), GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3310) 	if (!driver)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3311) 		return ERR_PTR(-ENOMEM);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3312) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3313) 	kref_init(&driver->kref);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3314) 	driver->magic = TTY_DRIVER_MAGIC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3315) 	driver->num = lines;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3316) 	driver->owner = owner;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3317) 	driver->flags = flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3318) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3319) 	if (!(flags & TTY_DRIVER_DEVPTS_MEM)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3320) 		driver->ttys = kcalloc(lines, sizeof(*driver->ttys),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3321) 				GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3322) 		driver->termios = kcalloc(lines, sizeof(*driver->termios),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3323) 				GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3324) 		if (!driver->ttys || !driver->termios) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3325) 			err = -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3326) 			goto err_free_all;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3327) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3328) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3329) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3330) 	if (!(flags & TTY_DRIVER_DYNAMIC_ALLOC)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3331) 		driver->ports = kcalloc(lines, sizeof(*driver->ports),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3332) 				GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3333) 		if (!driver->ports) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3334) 			err = -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3335) 			goto err_free_all;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3336) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3337) 		cdevs = lines;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3338) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3339) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3340) 	driver->cdevs = kcalloc(cdevs, sizeof(*driver->cdevs), GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3341) 	if (!driver->cdevs) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3342) 		err = -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3343) 		goto err_free_all;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3344) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3345) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3346) 	return driver;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3347) err_free_all:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3348) 	kfree(driver->ports);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3349) 	kfree(driver->ttys);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3350) 	kfree(driver->termios);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3351) 	kfree(driver->cdevs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3352) 	kfree(driver);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3353) 	return ERR_PTR(err);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3354) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3355) EXPORT_SYMBOL(__tty_alloc_driver);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3356) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3357) static void destruct_tty_driver(struct kref *kref)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3358) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3359) 	struct tty_driver *driver = container_of(kref, struct tty_driver, kref);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3360) 	int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3361) 	struct ktermios *tp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3362) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3363) 	if (driver->flags & TTY_DRIVER_INSTALLED) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3364) 		for (i = 0; i < driver->num; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3365) 			tp = driver->termios[i];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3366) 			if (tp) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3367) 				driver->termios[i] = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3368) 				kfree(tp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3369) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3370) 			if (!(driver->flags & TTY_DRIVER_DYNAMIC_DEV))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3371) 				tty_unregister_device(driver, i);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3372) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3373) 		proc_tty_unregister_driver(driver);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3374) 		if (driver->flags & TTY_DRIVER_DYNAMIC_ALLOC)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3375) 			cdev_del(driver->cdevs[0]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3376) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3377) 	kfree(driver->cdevs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3378) 	kfree(driver->ports);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3379) 	kfree(driver->termios);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3380) 	kfree(driver->ttys);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3381) 	kfree(driver);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3382) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3383) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3384) void tty_driver_kref_put(struct tty_driver *driver)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3385) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3386) 	kref_put(&driver->kref, destruct_tty_driver);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3387) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3388) EXPORT_SYMBOL(tty_driver_kref_put);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3389) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3390) void tty_set_operations(struct tty_driver *driver,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3391) 			const struct tty_operations *op)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3392) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3393) 	driver->ops = op;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3394) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3395) EXPORT_SYMBOL(tty_set_operations);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3396) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3397) void put_tty_driver(struct tty_driver *d)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3398) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3399) 	tty_driver_kref_put(d);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3400) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3401) EXPORT_SYMBOL(put_tty_driver);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3402) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3403) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3404)  * Called by a tty driver to register itself.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3405)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3406) int tty_register_driver(struct tty_driver *driver)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3407) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3408) 	int error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3409) 	int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3410) 	dev_t dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3411) 	struct device *d;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3412) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3413) 	if (!driver->major) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3414) 		error = alloc_chrdev_region(&dev, driver->minor_start,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3415) 						driver->num, driver->name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3416) 		if (!error) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3417) 			driver->major = MAJOR(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3418) 			driver->minor_start = MINOR(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3419) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3420) 	} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3421) 		dev = MKDEV(driver->major, driver->minor_start);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3422) 		error = register_chrdev_region(dev, driver->num, driver->name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3423) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3424) 	if (error < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3425) 		goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3426) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3427) 	if (driver->flags & TTY_DRIVER_DYNAMIC_ALLOC) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3428) 		error = tty_cdev_add(driver, dev, 0, driver->num);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3429) 		if (error)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3430) 			goto err_unreg_char;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3431) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3432) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3433) 	mutex_lock(&tty_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3434) 	list_add(&driver->tty_drivers, &tty_drivers);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3435) 	mutex_unlock(&tty_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3436) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3437) 	if (!(driver->flags & TTY_DRIVER_DYNAMIC_DEV)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3438) 		for (i = 0; i < driver->num; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3439) 			d = tty_register_device(driver, i, NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3440) 			if (IS_ERR(d)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3441) 				error = PTR_ERR(d);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3442) 				goto err_unreg_devs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3443) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3444) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3445) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3446) 	proc_tty_register_driver(driver);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3447) 	driver->flags |= TTY_DRIVER_INSTALLED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3448) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3449) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3450) err_unreg_devs:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3451) 	for (i--; i >= 0; i--)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3452) 		tty_unregister_device(driver, i);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3453) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3454) 	mutex_lock(&tty_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3455) 	list_del(&driver->tty_drivers);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3456) 	mutex_unlock(&tty_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3457) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3458) err_unreg_char:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3459) 	unregister_chrdev_region(dev, driver->num);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3460) err:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3461) 	return error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3462) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3463) EXPORT_SYMBOL(tty_register_driver);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3464) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3465) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3466)  * Called by a tty driver to unregister itself.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3467)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3468) int tty_unregister_driver(struct tty_driver *driver)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3469) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3470) #if 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3471) 	/* FIXME */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3472) 	if (driver->refcount)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3473) 		return -EBUSY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3474) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3475) 	unregister_chrdev_region(MKDEV(driver->major, driver->minor_start),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3476) 				driver->num);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3477) 	mutex_lock(&tty_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3478) 	list_del(&driver->tty_drivers);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3479) 	mutex_unlock(&tty_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3480) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3481) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3482) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3483) EXPORT_SYMBOL(tty_unregister_driver);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3484) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3485) dev_t tty_devnum(struct tty_struct *tty)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3486) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3487) 	return MKDEV(tty->driver->major, tty->driver->minor_start) + tty->index;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3488) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3489) EXPORT_SYMBOL(tty_devnum);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3490) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3491) void tty_default_fops(struct file_operations *fops)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3492) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3493) 	*fops = tty_fops;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3494) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3495) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3496) static char *tty_devnode(struct device *dev, umode_t *mode)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3497) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3498) 	if (!mode)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3499) 		return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3500) 	if (dev->devt == MKDEV(TTYAUX_MAJOR, 0) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3501) 	    dev->devt == MKDEV(TTYAUX_MAJOR, 2))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3502) 		*mode = 0666;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3503) 	return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3504) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3505) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3506) static int __init tty_class_init(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3507) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3508) 	tty_class = class_create(THIS_MODULE, "tty");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3509) 	if (IS_ERR(tty_class))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3510) 		return PTR_ERR(tty_class);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3511) 	tty_class->devnode = tty_devnode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3512) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3513) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3514) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3515) postcore_initcall(tty_class_init);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3516) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3517) /* 3/2004 jmc: why do these devices exist? */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3518) static struct cdev tty_cdev, console_cdev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3519) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3520) static ssize_t show_cons_active(struct device *dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3521) 				struct device_attribute *attr, char *buf)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3522) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3523) 	struct console *cs[16];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3524) 	int i = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3525) 	struct console *c;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3526) 	ssize_t count = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3527) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3528) 	console_lock();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3529) 	for_each_console(c) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3530) 		if (!c->device)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3531) 			continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3532) 		if (!c->write)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3533) 			continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3534) 		if ((c->flags & CON_ENABLED) == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3535) 			continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3536) 		cs[i++] = c;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3537) 		if (i >= ARRAY_SIZE(cs))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3538) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3539) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3540) 	while (i--) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3541) 		int index = cs[i]->index;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3542) 		struct tty_driver *drv = cs[i]->device(cs[i], &index);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3543) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3544) 		/* don't resolve tty0 as some programs depend on it */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3545) 		if (drv && (cs[i]->index > 0 || drv->major != TTY_MAJOR))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3546) 			count += tty_line_name(drv, index, buf + count);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3547) 		else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3548) 			count += sprintf(buf + count, "%s%d",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3549) 					 cs[i]->name, cs[i]->index);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3550) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3551) 		count += sprintf(buf + count, "%c", i ? ' ':'\n');
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3552) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3553) 	console_unlock();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3554) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3555) 	return count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3556) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3557) static DEVICE_ATTR(active, S_IRUGO, show_cons_active, NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3558) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3559) static struct attribute *cons_dev_attrs[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3560) 	&dev_attr_active.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3561) 	NULL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3562) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3563) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3564) ATTRIBUTE_GROUPS(cons_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3565) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3566) static struct device *consdev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3567) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3568) void console_sysfs_notify(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3569) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3570) 	if (consdev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3571) 		sysfs_notify(&consdev->kobj, NULL, "active");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3572) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3573) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3574) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3575)  * Ok, now we can initialize the rest of the tty devices and can count
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3576)  * on memory allocations, interrupts etc..
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3577)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3578) int __init tty_init(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3579) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3580) 	tty_sysctl_init();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3581) 	cdev_init(&tty_cdev, &tty_fops);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3582) 	if (cdev_add(&tty_cdev, MKDEV(TTYAUX_MAJOR, 0), 1) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3583) 	    register_chrdev_region(MKDEV(TTYAUX_MAJOR, 0), 1, "/dev/tty") < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3584) 		panic("Couldn't register /dev/tty driver\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3585) 	device_create(tty_class, NULL, MKDEV(TTYAUX_MAJOR, 0), NULL, "tty");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3586) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3587) 	cdev_init(&console_cdev, &console_fops);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3588) 	if (cdev_add(&console_cdev, MKDEV(TTYAUX_MAJOR, 1), 1) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3589) 	    register_chrdev_region(MKDEV(TTYAUX_MAJOR, 1), 1, "/dev/console") < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3590) 		panic("Couldn't register /dev/console driver\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3591) 	consdev = device_create_with_groups(tty_class, NULL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3592) 					    MKDEV(TTYAUX_MAJOR, 1), NULL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3593) 					    cons_dev_groups, "console");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3594) 	if (IS_ERR(consdev))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3595) 		consdev = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3596) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3597) #ifdef CONFIG_VT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3598) 	vty_init(&console_fops);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3599) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3600) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3601) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3602)