xref: /openbmc/linux/drivers/tty/tty_ldisc.c (revision 249592bf)
1 // SPDX-License-Identifier: GPL-2.0
2 #include <linux/types.h>
3 #include <linux/errno.h>
4 #include <linux/kmod.h>
5 #include <linux/sched.h>
6 #include <linux/interrupt.h>
7 #include <linux/tty.h>
8 #include <linux/tty_driver.h>
9 #include <linux/file.h>
10 #include <linux/mm.h>
11 #include <linux/string.h>
12 #include <linux/slab.h>
13 #include <linux/poll.h>
14 #include <linux/proc_fs.h>
15 #include <linux/module.h>
16 #include <linux/device.h>
17 #include <linux/wait.h>
18 #include <linux/bitops.h>
19 #include <linux/seq_file.h>
20 #include <linux/uaccess.h>
21 #include <linux/ratelimit.h>
22 #include "tty.h"
23 
24 #undef LDISC_DEBUG_HANGUP
25 
26 #ifdef LDISC_DEBUG_HANGUP
27 #define tty_ldisc_debug(tty, f, args...)	tty_debug(tty, f, ##args)
28 #else
29 #define tty_ldisc_debug(tty, f, args...)
30 #endif
31 
32 /* lockdep nested classes for tty->ldisc_sem */
33 enum {
34 	LDISC_SEM_NORMAL,
35 	LDISC_SEM_OTHER,
36 };
37 
38 
39 /*
40  *	This guards the refcounted line discipline lists. The lock
41  *	must be taken with irqs off because there are hangup path
42  *	callers who will do ldisc lookups and cannot sleep.
43  */
44 
45 static DEFINE_RAW_SPINLOCK(tty_ldiscs_lock);
46 /* Line disc dispatch table */
47 static struct tty_ldisc_ops *tty_ldiscs[NR_LDISCS];
48 
49 /**
50  *	tty_register_ldisc	-	install a line discipline
51  *	@disc: ldisc number
52  *	@new_ldisc: pointer to the ldisc object
53  *
54  *	Installs a new line discipline into the kernel. The discipline
55  *	is set up as unreferenced and then made available to the kernel
56  *	from this point onwards.
57  *
58  *	Locking:
59  *		takes tty_ldiscs_lock to guard against ldisc races
60  */
61 
62 int tty_register_ldisc(int disc, struct tty_ldisc_ops *new_ldisc)
63 {
64 	unsigned long flags;
65 	int ret = 0;
66 
67 	if (disc < N_TTY || disc >= NR_LDISCS)
68 		return -EINVAL;
69 
70 	raw_spin_lock_irqsave(&tty_ldiscs_lock, flags);
71 	tty_ldiscs[disc] = new_ldisc;
72 	new_ldisc->num = disc;
73 	new_ldisc->refcount = 0;
74 	raw_spin_unlock_irqrestore(&tty_ldiscs_lock, flags);
75 
76 	return ret;
77 }
78 EXPORT_SYMBOL(tty_register_ldisc);
79 
80 /**
81  *	tty_unregister_ldisc	-	unload a line discipline
82  *	@disc: ldisc number
83  *
84  *	Remove a line discipline from the kernel providing it is not
85  *	currently in use.
86  *
87  *	Locking:
88  *		takes tty_ldiscs_lock to guard against ldisc races
89  */
90 
91 int tty_unregister_ldisc(int disc)
92 {
93 	unsigned long flags;
94 	int ret = 0;
95 
96 	if (disc < N_TTY || disc >= NR_LDISCS)
97 		return -EINVAL;
98 
99 	raw_spin_lock_irqsave(&tty_ldiscs_lock, flags);
100 	if (tty_ldiscs[disc]->refcount)
101 		ret = -EBUSY;
102 	else
103 		tty_ldiscs[disc] = NULL;
104 	raw_spin_unlock_irqrestore(&tty_ldiscs_lock, flags);
105 
106 	return ret;
107 }
108 EXPORT_SYMBOL(tty_unregister_ldisc);
109 
110 static struct tty_ldisc_ops *get_ldops(int disc)
111 {
112 	unsigned long flags;
113 	struct tty_ldisc_ops *ldops, *ret;
114 
115 	raw_spin_lock_irqsave(&tty_ldiscs_lock, flags);
116 	ret = ERR_PTR(-EINVAL);
117 	ldops = tty_ldiscs[disc];
118 	if (ldops) {
119 		ret = ERR_PTR(-EAGAIN);
120 		if (try_module_get(ldops->owner)) {
121 			ldops->refcount++;
122 			ret = ldops;
123 		}
124 	}
125 	raw_spin_unlock_irqrestore(&tty_ldiscs_lock, flags);
126 	return ret;
127 }
128 
129 static void put_ldops(struct tty_ldisc_ops *ldops)
130 {
131 	unsigned long flags;
132 
133 	raw_spin_lock_irqsave(&tty_ldiscs_lock, flags);
134 	ldops->refcount--;
135 	module_put(ldops->owner);
136 	raw_spin_unlock_irqrestore(&tty_ldiscs_lock, flags);
137 }
138 
139 static int tty_ldisc_autoload = IS_BUILTIN(CONFIG_LDISC_AUTOLOAD);
140 /**
141  *	tty_ldisc_get		-	take a reference to an ldisc
142  *	@tty: tty device
143  *	@disc: ldisc number
144  *
145  *	Takes a reference to a line discipline. Deals with refcounts and
146  *	module locking counts.
147  *
148  *	Returns: -EINVAL if the discipline index is not [N_TTY..NR_LDISCS] or
149  *			 if the discipline is not registered
150  *		 -EAGAIN if request_module() failed to load or register the
151  *			 discipline
152  *		 -ENOMEM if allocation failure
153  *
154  *		 Otherwise, returns a pointer to the discipline and bumps the
155  *		 ref count
156  *
157  *	Locking:
158  *		takes tty_ldiscs_lock to guard against ldisc races
159  */
160 
161 static struct tty_ldisc *tty_ldisc_get(struct tty_struct *tty, int disc)
162 {
163 	struct tty_ldisc *ld;
164 	struct tty_ldisc_ops *ldops;
165 
166 	if (disc < N_TTY || disc >= NR_LDISCS)
167 		return ERR_PTR(-EINVAL);
168 
169 	/*
170 	 * Get the ldisc ops - we may need to request them to be loaded
171 	 * dynamically and try again.
172 	 */
173 	ldops = get_ldops(disc);
174 	if (IS_ERR(ldops)) {
175 		if (!capable(CAP_SYS_MODULE) && !tty_ldisc_autoload)
176 			return ERR_PTR(-EPERM);
177 		request_module("tty-ldisc-%d", disc);
178 		ldops = get_ldops(disc);
179 		if (IS_ERR(ldops))
180 			return ERR_CAST(ldops);
181 	}
182 
183 	/*
184 	 * There is no way to handle allocation failure of only 16 bytes.
185 	 * Let's simplify error handling and save more memory.
186 	 */
187 	ld = kmalloc(sizeof(struct tty_ldisc), GFP_KERNEL | __GFP_NOFAIL);
188 	ld->ops = ldops;
189 	ld->tty = tty;
190 
191 	return ld;
192 }
193 
194 /*
195  *	tty_ldisc_put		-	release the ldisc
196  *
197  *	Complement of tty_ldisc_get().
198  */
199 static void tty_ldisc_put(struct tty_ldisc *ld)
200 {
201 	if (WARN_ON_ONCE(!ld))
202 		return;
203 
204 	put_ldops(ld->ops);
205 	kfree(ld);
206 }
207 
208 static void *tty_ldiscs_seq_start(struct seq_file *m, loff_t *pos)
209 {
210 	return (*pos < NR_LDISCS) ? pos : NULL;
211 }
212 
213 static void *tty_ldiscs_seq_next(struct seq_file *m, void *v, loff_t *pos)
214 {
215 	(*pos)++;
216 	return (*pos < NR_LDISCS) ? pos : NULL;
217 }
218 
219 static void tty_ldiscs_seq_stop(struct seq_file *m, void *v)
220 {
221 }
222 
223 static int tty_ldiscs_seq_show(struct seq_file *m, void *v)
224 {
225 	int i = *(loff_t *)v;
226 	struct tty_ldisc_ops *ldops;
227 
228 	ldops = get_ldops(i);
229 	if (IS_ERR(ldops))
230 		return 0;
231 	seq_printf(m, "%-10s %2d\n", ldops->name ? ldops->name : "???", i);
232 	put_ldops(ldops);
233 	return 0;
234 }
235 
236 const struct seq_operations tty_ldiscs_seq_ops = {
237 	.start	= tty_ldiscs_seq_start,
238 	.next	= tty_ldiscs_seq_next,
239 	.stop	= tty_ldiscs_seq_stop,
240 	.show	= tty_ldiscs_seq_show,
241 };
242 
243 /**
244  *	tty_ldisc_ref_wait	-	wait for the tty ldisc
245  *	@tty: tty device
246  *
247  *	Dereference the line discipline for the terminal and take a
248  *	reference to it. If the line discipline is in flux then
249  *	wait patiently until it changes.
250  *
251  *	Returns: NULL if the tty has been hungup and not re-opened with
252  *		 a new file descriptor, otherwise valid ldisc reference
253  *
254  *	Note 1: Must not be called from an IRQ/timer context. The caller
255  *	must also be careful not to hold other locks that will deadlock
256  *	against a discipline change, such as an existing ldisc reference
257  *	(which we check for)
258  *
259  *	Note 2: a file_operations routine (read/poll/write) should use this
260  *	function to wait for any ldisc lifetime events to finish.
261  */
262 
263 struct tty_ldisc *tty_ldisc_ref_wait(struct tty_struct *tty)
264 {
265 	struct tty_ldisc *ld;
266 
267 	ldsem_down_read(&tty->ldisc_sem, MAX_SCHEDULE_TIMEOUT);
268 	ld = tty->ldisc;
269 	if (!ld)
270 		ldsem_up_read(&tty->ldisc_sem);
271 	return ld;
272 }
273 EXPORT_SYMBOL_GPL(tty_ldisc_ref_wait);
274 
275 /**
276  *	tty_ldisc_ref		-	get the tty ldisc
277  *	@tty: tty device
278  *
279  *	Dereference the line discipline for the terminal and take a
280  *	reference to it. If the line discipline is in flux then
281  *	return NULL. Can be called from IRQ and timer functions.
282  */
283 
284 struct tty_ldisc *tty_ldisc_ref(struct tty_struct *tty)
285 {
286 	struct tty_ldisc *ld = NULL;
287 
288 	if (ldsem_down_read_trylock(&tty->ldisc_sem)) {
289 		ld = tty->ldisc;
290 		if (!ld)
291 			ldsem_up_read(&tty->ldisc_sem);
292 	}
293 	return ld;
294 }
295 EXPORT_SYMBOL_GPL(tty_ldisc_ref);
296 
297 /**
298  *	tty_ldisc_deref		-	free a tty ldisc reference
299  *	@ld: reference to free up
300  *
301  *	Undoes the effect of tty_ldisc_ref or tty_ldisc_ref_wait. May
302  *	be called in IRQ context.
303  */
304 
305 void tty_ldisc_deref(struct tty_ldisc *ld)
306 {
307 	ldsem_up_read(&ld->tty->ldisc_sem);
308 }
309 EXPORT_SYMBOL_GPL(tty_ldisc_deref);
310 
311 
312 static inline int
313 __tty_ldisc_lock(struct tty_struct *tty, unsigned long timeout)
314 {
315 	return ldsem_down_write(&tty->ldisc_sem, timeout);
316 }
317 
318 static inline int
319 __tty_ldisc_lock_nested(struct tty_struct *tty, unsigned long timeout)
320 {
321 	return ldsem_down_write_nested(&tty->ldisc_sem,
322 				       LDISC_SEM_OTHER, timeout);
323 }
324 
325 static inline void __tty_ldisc_unlock(struct tty_struct *tty)
326 {
327 	ldsem_up_write(&tty->ldisc_sem);
328 }
329 
330 int tty_ldisc_lock(struct tty_struct *tty, unsigned long timeout)
331 {
332 	int ret;
333 
334 	/* Kindly asking blocked readers to release the read side */
335 	set_bit(TTY_LDISC_CHANGING, &tty->flags);
336 	wake_up_interruptible_all(&tty->read_wait);
337 	wake_up_interruptible_all(&tty->write_wait);
338 
339 	ret = __tty_ldisc_lock(tty, timeout);
340 	if (!ret)
341 		return -EBUSY;
342 	set_bit(TTY_LDISC_HALTED, &tty->flags);
343 	return 0;
344 }
345 
346 void tty_ldisc_unlock(struct tty_struct *tty)
347 {
348 	clear_bit(TTY_LDISC_HALTED, &tty->flags);
349 	/* Can be cleared here - ldisc_unlock will wake up writers firstly */
350 	clear_bit(TTY_LDISC_CHANGING, &tty->flags);
351 	__tty_ldisc_unlock(tty);
352 }
353 
354 static int
355 tty_ldisc_lock_pair_timeout(struct tty_struct *tty, struct tty_struct *tty2,
356 			    unsigned long timeout)
357 {
358 	int ret;
359 
360 	if (tty < tty2) {
361 		ret = __tty_ldisc_lock(tty, timeout);
362 		if (ret) {
363 			ret = __tty_ldisc_lock_nested(tty2, timeout);
364 			if (!ret)
365 				__tty_ldisc_unlock(tty);
366 		}
367 	} else {
368 		/* if this is possible, it has lots of implications */
369 		WARN_ON_ONCE(tty == tty2);
370 		if (tty2 && tty != tty2) {
371 			ret = __tty_ldisc_lock(tty2, timeout);
372 			if (ret) {
373 				ret = __tty_ldisc_lock_nested(tty, timeout);
374 				if (!ret)
375 					__tty_ldisc_unlock(tty2);
376 			}
377 		} else
378 			ret = __tty_ldisc_lock(tty, timeout);
379 	}
380 
381 	if (!ret)
382 		return -EBUSY;
383 
384 	set_bit(TTY_LDISC_HALTED, &tty->flags);
385 	if (tty2)
386 		set_bit(TTY_LDISC_HALTED, &tty2->flags);
387 	return 0;
388 }
389 
390 static void tty_ldisc_lock_pair(struct tty_struct *tty, struct tty_struct *tty2)
391 {
392 	tty_ldisc_lock_pair_timeout(tty, tty2, MAX_SCHEDULE_TIMEOUT);
393 }
394 
395 static void tty_ldisc_unlock_pair(struct tty_struct *tty,
396 				  struct tty_struct *tty2)
397 {
398 	__tty_ldisc_unlock(tty);
399 	if (tty2)
400 		__tty_ldisc_unlock(tty2);
401 }
402 
403 /**
404  *	tty_ldisc_flush	-	flush line discipline queue
405  *	@tty: tty
406  *
407  *	Flush the line discipline queue (if any) and the tty flip buffers
408  *	for this tty.
409  */
410 
411 void tty_ldisc_flush(struct tty_struct *tty)
412 {
413 	struct tty_ldisc *ld = tty_ldisc_ref(tty);
414 
415 	tty_buffer_flush(tty, ld);
416 	if (ld)
417 		tty_ldisc_deref(ld);
418 }
419 EXPORT_SYMBOL_GPL(tty_ldisc_flush);
420 
421 /**
422  *	tty_set_termios_ldisc		-	set ldisc field
423  *	@tty: tty structure
424  *	@disc: line discipline number
425  *
426  *	This is probably overkill for real world processors but
427  *	they are not on hot paths so a little discipline won't do
428  *	any harm.
429  *
430  *	The line discipline-related tty_struct fields are reset to
431  *	prevent the ldisc driver from re-using stale information for
432  *	the new ldisc instance.
433  *
434  *	Locking: takes termios_rwsem
435  */
436 
437 static void tty_set_termios_ldisc(struct tty_struct *tty, int disc)
438 {
439 	down_write(&tty->termios_rwsem);
440 	tty->termios.c_line = disc;
441 	up_write(&tty->termios_rwsem);
442 
443 	tty->disc_data = NULL;
444 	tty->receive_room = 0;
445 }
446 
447 /**
448  *	tty_ldisc_open		-	open a line discipline
449  *	@tty: tty we are opening the ldisc on
450  *	@ld: discipline to open
451  *
452  *	A helper opening method. Also a convenient debugging and check
453  *	point.
454  *
455  *	Locking: always called with BTM already held.
456  */
457 
458 static int tty_ldisc_open(struct tty_struct *tty, struct tty_ldisc *ld)
459 {
460 	WARN_ON(test_and_set_bit(TTY_LDISC_OPEN, &tty->flags));
461 	if (ld->ops->open) {
462 		int ret;
463 		/* BTM here locks versus a hangup event */
464 		ret = ld->ops->open(tty);
465 		if (ret)
466 			clear_bit(TTY_LDISC_OPEN, &tty->flags);
467 
468 		tty_ldisc_debug(tty, "%p: opened\n", ld);
469 		return ret;
470 	}
471 	return 0;
472 }
473 
474 /**
475  *	tty_ldisc_close		-	close a line discipline
476  *	@tty: tty we are opening the ldisc on
477  *	@ld: discipline to close
478  *
479  *	A helper close method. Also a convenient debugging and check
480  *	point.
481  */
482 
483 static void tty_ldisc_close(struct tty_struct *tty, struct tty_ldisc *ld)
484 {
485 	lockdep_assert_held_write(&tty->ldisc_sem);
486 	WARN_ON(!test_bit(TTY_LDISC_OPEN, &tty->flags));
487 	clear_bit(TTY_LDISC_OPEN, &tty->flags);
488 	if (ld->ops->close)
489 		ld->ops->close(tty);
490 	tty_ldisc_debug(tty, "%p: closed\n", ld);
491 }
492 
493 /**
494  *	tty_ldisc_failto	-	helper for ldisc failback
495  *	@tty: tty to open the ldisc on
496  *	@ld: ldisc we are trying to fail back to
497  *
498  *	Helper to try and recover a tty when switching back to the old
499  *	ldisc fails and we need something attached.
500  */
501 
502 static int tty_ldisc_failto(struct tty_struct *tty, int ld)
503 {
504 	struct tty_ldisc *disc = tty_ldisc_get(tty, ld);
505 	int r;
506 
507 	lockdep_assert_held_write(&tty->ldisc_sem);
508 	if (IS_ERR(disc))
509 		return PTR_ERR(disc);
510 	tty->ldisc = disc;
511 	tty_set_termios_ldisc(tty, ld);
512 	r = tty_ldisc_open(tty, disc);
513 	if (r < 0)
514 		tty_ldisc_put(disc);
515 	return r;
516 }
517 
518 /**
519  *	tty_ldisc_restore	-	helper for tty ldisc change
520  *	@tty: tty to recover
521  *	@old: previous ldisc
522  *
523  *	Restore the previous line discipline or N_TTY when a line discipline
524  *	change fails due to an open error
525  */
526 
527 static void tty_ldisc_restore(struct tty_struct *tty, struct tty_ldisc *old)
528 {
529 	/* There is an outstanding reference here so this is safe */
530 	if (tty_ldisc_failto(tty, old->ops->num) < 0) {
531 		const char *name = tty_name(tty);
532 
533 		pr_warn("Falling back ldisc for %s.\n", name);
534 		/*
535 		 * The traditional behaviour is to fall back to N_TTY, we
536 		 * want to avoid falling back to N_NULL unless we have no
537 		 * choice to avoid the risk of breaking anything
538 		 */
539 		if (tty_ldisc_failto(tty, N_TTY) < 0 &&
540 		    tty_ldisc_failto(tty, N_NULL) < 0)
541 			panic("Couldn't open N_NULL ldisc for %s.", name);
542 	}
543 }
544 
545 /**
546  *	tty_set_ldisc		-	set line discipline
547  *	@tty: the terminal to set
548  *	@disc: the line discipline number
549  *
550  *	Set the discipline of a tty line. Must be called from a process
551  *	context. The ldisc change logic has to protect itself against any
552  *	overlapping ldisc change (including on the other end of pty pairs),
553  *	the close of one side of a tty/pty pair, and eventually hangup.
554  */
555 
556 int tty_set_ldisc(struct tty_struct *tty, int disc)
557 {
558 	int retval;
559 	struct tty_ldisc *old_ldisc, *new_ldisc;
560 
561 	new_ldisc = tty_ldisc_get(tty, disc);
562 	if (IS_ERR(new_ldisc))
563 		return PTR_ERR(new_ldisc);
564 
565 	tty_lock(tty);
566 	retval = tty_ldisc_lock(tty, 5 * HZ);
567 	if (retval)
568 		goto err;
569 
570 	if (!tty->ldisc) {
571 		retval = -EIO;
572 		goto out;
573 	}
574 
575 	/* Check the no-op case */
576 	if (tty->ldisc->ops->num == disc)
577 		goto out;
578 
579 	if (test_bit(TTY_HUPPED, &tty->flags)) {
580 		/* We were raced by hangup */
581 		retval = -EIO;
582 		goto out;
583 	}
584 
585 	old_ldisc = tty->ldisc;
586 
587 	/* Shutdown the old discipline. */
588 	tty_ldisc_close(tty, old_ldisc);
589 
590 	/* Now set up the new line discipline. */
591 	tty->ldisc = new_ldisc;
592 	tty_set_termios_ldisc(tty, disc);
593 
594 	retval = tty_ldisc_open(tty, new_ldisc);
595 	if (retval < 0) {
596 		/* Back to the old one or N_TTY if we can't */
597 		tty_ldisc_put(new_ldisc);
598 		tty_ldisc_restore(tty, old_ldisc);
599 	}
600 
601 	if (tty->ldisc->ops->num != old_ldisc->ops->num && tty->ops->set_ldisc) {
602 		down_read(&tty->termios_rwsem);
603 		tty->ops->set_ldisc(tty);
604 		up_read(&tty->termios_rwsem);
605 	}
606 
607 	/*
608 	 * At this point we hold a reference to the new ldisc and a
609 	 * reference to the old ldisc, or we hold two references to
610 	 * the old ldisc (if it was restored as part of error cleanup
611 	 * above). In either case, releasing a single reference from
612 	 * the old ldisc is correct.
613 	 */
614 	new_ldisc = old_ldisc;
615 out:
616 	tty_ldisc_unlock(tty);
617 
618 	/*
619 	 * Restart the work queue in case no characters kick it off. Safe if
620 	 * already running
621 	 */
622 	tty_buffer_restart_work(tty->port);
623 err:
624 	tty_ldisc_put(new_ldisc);	/* drop the extra reference */
625 	tty_unlock(tty);
626 	return retval;
627 }
628 EXPORT_SYMBOL_GPL(tty_set_ldisc);
629 
630 /**
631  *	tty_ldisc_kill	-	teardown ldisc
632  *	@tty: tty being released
633  *
634  *	Perform final close of the ldisc and reset tty->ldisc
635  */
636 static void tty_ldisc_kill(struct tty_struct *tty)
637 {
638 	lockdep_assert_held_write(&tty->ldisc_sem);
639 	if (!tty->ldisc)
640 		return;
641 	/*
642 	 * Now kill off the ldisc
643 	 */
644 	tty_ldisc_close(tty, tty->ldisc);
645 	tty_ldisc_put(tty->ldisc);
646 	/* Force an oops if we mess this up */
647 	tty->ldisc = NULL;
648 }
649 
650 /**
651  *	tty_reset_termios	-	reset terminal state
652  *	@tty: tty to reset
653  *
654  *	Restore a terminal to the driver default state.
655  */
656 
657 static void tty_reset_termios(struct tty_struct *tty)
658 {
659 	down_write(&tty->termios_rwsem);
660 	tty->termios = tty->driver->init_termios;
661 	tty->termios.c_ispeed = tty_termios_input_baud_rate(&tty->termios);
662 	tty->termios.c_ospeed = tty_termios_baud_rate(&tty->termios);
663 	up_write(&tty->termios_rwsem);
664 }
665 
666 
667 /**
668  *	tty_ldisc_reinit	-	reinitialise the tty ldisc
669  *	@tty: tty to reinit
670  *	@disc: line discipline to reinitialize
671  *
672  *	Completely reinitialize the line discipline state, by closing the
673  *	current instance, if there is one, and opening a new instance. If
674  *	an error occurs opening the new non-N_TTY instance, the instance
675  *	is dropped and tty->ldisc reset to NULL. The caller can then retry
676  *	with N_TTY instead.
677  *
678  *	Returns 0 if successful, otherwise error code < 0
679  */
680 
681 int tty_ldisc_reinit(struct tty_struct *tty, int disc)
682 {
683 	struct tty_ldisc *ld;
684 	int retval;
685 
686 	lockdep_assert_held_write(&tty->ldisc_sem);
687 	ld = tty_ldisc_get(tty, disc);
688 	if (IS_ERR(ld)) {
689 		BUG_ON(disc == N_TTY);
690 		return PTR_ERR(ld);
691 	}
692 
693 	if (tty->ldisc) {
694 		tty_ldisc_close(tty, tty->ldisc);
695 		tty_ldisc_put(tty->ldisc);
696 	}
697 
698 	/* switch the line discipline */
699 	tty->ldisc = ld;
700 	tty_set_termios_ldisc(tty, disc);
701 	retval = tty_ldisc_open(tty, tty->ldisc);
702 	if (retval) {
703 		tty_ldisc_put(tty->ldisc);
704 		tty->ldisc = NULL;
705 	}
706 	return retval;
707 }
708 
709 /**
710  *	tty_ldisc_hangup		-	hangup ldisc reset
711  *	@tty: tty being hung up
712  *	@reinit: whether to re-initialise the tty
713  *
714  *	Some tty devices reset their termios when they receive a hangup
715  *	event. In that situation we must also switch back to N_TTY properly
716  *	before we reset the termios data.
717  *
718  *	Locking: We can take the ldisc mutex as the rest of the code is
719  *	careful to allow for this.
720  *
721  *	In the pty pair case this occurs in the close() path of the
722  *	tty itself so we must be careful about locking rules.
723  */
724 
725 void tty_ldisc_hangup(struct tty_struct *tty, bool reinit)
726 {
727 	struct tty_ldisc *ld;
728 
729 	tty_ldisc_debug(tty, "%p: hangup\n", tty->ldisc);
730 
731 	ld = tty_ldisc_ref(tty);
732 	if (ld != NULL) {
733 		if (ld->ops->flush_buffer)
734 			ld->ops->flush_buffer(tty);
735 		tty_driver_flush_buffer(tty);
736 		if ((test_bit(TTY_DO_WRITE_WAKEUP, &tty->flags)) &&
737 		    ld->ops->write_wakeup)
738 			ld->ops->write_wakeup(tty);
739 		if (ld->ops->hangup)
740 			ld->ops->hangup(tty);
741 		tty_ldisc_deref(ld);
742 	}
743 
744 	wake_up_interruptible_poll(&tty->write_wait, EPOLLOUT);
745 	wake_up_interruptible_poll(&tty->read_wait, EPOLLIN);
746 
747 	/*
748 	 * Shutdown the current line discipline, and reset it to
749 	 * N_TTY if need be.
750 	 *
751 	 * Avoid racing set_ldisc or tty_ldisc_release
752 	 */
753 	tty_ldisc_lock(tty, MAX_SCHEDULE_TIMEOUT);
754 
755 	if (tty->driver->flags & TTY_DRIVER_RESET_TERMIOS)
756 		tty_reset_termios(tty);
757 
758 	if (tty->ldisc) {
759 		if (reinit) {
760 			if (tty_ldisc_reinit(tty, tty->termios.c_line) < 0 &&
761 			    tty_ldisc_reinit(tty, N_TTY) < 0)
762 				WARN_ON(tty_ldisc_reinit(tty, N_NULL) < 0);
763 		} else
764 			tty_ldisc_kill(tty);
765 	}
766 	tty_ldisc_unlock(tty);
767 }
768 
769 /**
770  *	tty_ldisc_setup			-	open line discipline
771  *	@tty: tty being shut down
772  *	@o_tty: pair tty for pty/tty pairs
773  *
774  *	Called during the initial open of a tty/pty pair in order to set up the
775  *	line disciplines and bind them to the tty. This has no locking issues
776  *	as the device isn't yet active.
777  */
778 
779 int tty_ldisc_setup(struct tty_struct *tty, struct tty_struct *o_tty)
780 {
781 	int retval = tty_ldisc_open(tty, tty->ldisc);
782 
783 	if (retval)
784 		return retval;
785 
786 	if (o_tty) {
787 		/*
788 		 * Called without o_tty->ldisc_sem held, as o_tty has been
789 		 * just allocated and no one has a reference to it.
790 		 */
791 		retval = tty_ldisc_open(o_tty, o_tty->ldisc);
792 		if (retval) {
793 			tty_ldisc_close(tty, tty->ldisc);
794 			return retval;
795 		}
796 	}
797 	return 0;
798 }
799 
800 /**
801  *	tty_ldisc_release		-	release line discipline
802  *	@tty: tty being shut down (or one end of pty pair)
803  *
804  *	Called during the final close of a tty or a pty pair in order to shut
805  *	down the line discpline layer. On exit, each tty's ldisc is NULL.
806  */
807 
808 void tty_ldisc_release(struct tty_struct *tty)
809 {
810 	struct tty_struct *o_tty = tty->link;
811 
812 	/*
813 	 * Shutdown this line discipline. As this is the final close,
814 	 * it does not race with the set_ldisc code path.
815 	 */
816 
817 	tty_ldisc_lock_pair(tty, o_tty);
818 	tty_ldisc_kill(tty);
819 	if (o_tty)
820 		tty_ldisc_kill(o_tty);
821 	tty_ldisc_unlock_pair(tty, o_tty);
822 
823 	/*
824 	 * And the memory resources remaining (buffers, termios) will be
825 	 * disposed of when the kref hits zero
826 	 */
827 
828 	tty_ldisc_debug(tty, "released\n");
829 }
830 EXPORT_SYMBOL_GPL(tty_ldisc_release);
831 
832 /**
833  *	tty_ldisc_init		-	ldisc setup for new tty
834  *	@tty: tty being allocated
835  *
836  *	Set up the line discipline objects for a newly allocated tty. Note that
837  *	the tty structure is not completely set up when this call is made.
838  */
839 
840 int tty_ldisc_init(struct tty_struct *tty)
841 {
842 	struct tty_ldisc *ld = tty_ldisc_get(tty, N_TTY);
843 
844 	if (IS_ERR(ld))
845 		return PTR_ERR(ld);
846 	tty->ldisc = ld;
847 	return 0;
848 }
849 
850 /**
851  *	tty_ldisc_deinit	-	ldisc cleanup for new tty
852  *	@tty: tty that was allocated recently
853  *
854  *	The tty structure must not becompletely set up (tty_ldisc_setup) when
855  *      this call is made.
856  */
857 void tty_ldisc_deinit(struct tty_struct *tty)
858 {
859 	/* no ldisc_sem, tty is being destroyed */
860 	if (tty->ldisc)
861 		tty_ldisc_put(tty->ldisc);
862 	tty->ldisc = NULL;
863 }
864 
865 static struct ctl_table tty_table[] = {
866 	{
867 		.procname	= "ldisc_autoload",
868 		.data		= &tty_ldisc_autoload,
869 		.maxlen		= sizeof(tty_ldisc_autoload),
870 		.mode		= 0644,
871 		.proc_handler	= proc_dointvec,
872 		.extra1		= SYSCTL_ZERO,
873 		.extra2		= SYSCTL_ONE,
874 	},
875 	{ }
876 };
877 
878 static struct ctl_table tty_dir_table[] = {
879 	{
880 		.procname	= "tty",
881 		.mode		= 0555,
882 		.child		= tty_table,
883 	},
884 	{ }
885 };
886 
887 static struct ctl_table tty_root_table[] = {
888 	{
889 		.procname	= "dev",
890 		.mode		= 0555,
891 		.child		= tty_dir_table,
892 	},
893 	{ }
894 };
895 
896 void tty_sysctl_init(void)
897 {
898 	register_sysctl_table(tty_root_table);
899 }
900