drm/amd/pm: remove the average clock value in sysfs
[linux-2.6-block.git] / drivers / tty / tty_ldisc.c
CommitLineData
e3b3d0f5 1// SPDX-License-Identifier: GPL-2.0
01e1abb2 2#include <linux/types.h>
01e1abb2 3#include <linux/errno.h>
8b3ffa17 4#include <linux/kmod.h>
01e1abb2
AC
5#include <linux/sched.h>
6#include <linux/interrupt.h>
7#include <linux/tty.h>
8#include <linux/tty_driver.h>
01e1abb2 9#include <linux/file.h>
01e1abb2
AC
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>
01e1abb2 15#include <linux/module.h>
01e1abb2
AC
16#include <linux/device.h>
17#include <linux/wait.h>
18#include <linux/bitops.h>
01e1abb2 19#include <linux/seq_file.h>
01e1abb2 20#include <linux/uaccess.h>
0c73c08e 21#include <linux/ratelimit.h>
01e1abb2 22
fc575ee6
PH
23#undef LDISC_DEBUG_HANGUP
24
25#ifdef LDISC_DEBUG_HANGUP
0a6adc13 26#define tty_ldisc_debug(tty, f, args...) tty_debug(tty, f, ##args)
fc575ee6
PH
27#else
28#define tty_ldisc_debug(tty, f, args...)
29#endif
30
d2c43890
PH
31/* lockdep nested classes for tty->ldisc_sem */
32enum {
33 LDISC_SEM_NORMAL,
34 LDISC_SEM_OTHER,
35};
36
37
01e1abb2
AC
38/*
39 * This guards the refcounted line discipline lists. The lock
40 * must be taken with irqs off because there are hangup path
41 * callers who will do ldisc lookups and cannot sleep.
42 */
43
137084bb 44static DEFINE_RAW_SPINLOCK(tty_ldiscs_lock);
01e1abb2
AC
45/* Line disc dispatch table */
46static struct tty_ldisc_ops *tty_ldiscs[NR_LDISCS];
47
48/**
49 * tty_register_ldisc - install a line discipline
50 * @disc: ldisc number
51 * @new_ldisc: pointer to the ldisc object
52 *
53 * Installs a new line discipline into the kernel. The discipline
54 * is set up as unreferenced and then made available to the kernel
55 * from this point onwards.
56 *
57 * Locking:
137084bb 58 * takes tty_ldiscs_lock to guard against ldisc races
01e1abb2
AC
59 */
60
61int tty_register_ldisc(int disc, struct tty_ldisc_ops *new_ldisc)
62{
63 unsigned long flags;
64 int ret = 0;
65
66 if (disc < N_TTY || disc >= NR_LDISCS)
67 return -EINVAL;
68
137084bb 69 raw_spin_lock_irqsave(&tty_ldiscs_lock, flags);
01e1abb2
AC
70 tty_ldiscs[disc] = new_ldisc;
71 new_ldisc->num = disc;
72 new_ldisc->refcount = 0;
137084bb 73 raw_spin_unlock_irqrestore(&tty_ldiscs_lock, flags);
01e1abb2
AC
74
75 return ret;
76}
77EXPORT_SYMBOL(tty_register_ldisc);
78
79/**
80 * tty_unregister_ldisc - unload a line discipline
81 * @disc: ldisc number
82 * @new_ldisc: pointer to the ldisc object
83 *
84 * Remove a line discipline from the kernel providing it is not
85 * currently in use.
86 *
87 * Locking:
137084bb 88 * takes tty_ldiscs_lock to guard against ldisc races
01e1abb2
AC
89 */
90
91int 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
137084bb 99 raw_spin_lock_irqsave(&tty_ldiscs_lock, flags);
01e1abb2
AC
100 if (tty_ldiscs[disc]->refcount)
101 ret = -EBUSY;
102 else
103 tty_ldiscs[disc] = NULL;
137084bb 104 raw_spin_unlock_irqrestore(&tty_ldiscs_lock, flags);
01e1abb2
AC
105
106 return ret;
107}
108EXPORT_SYMBOL(tty_unregister_ldisc);
109
f0de0e8d
LT
110static struct tty_ldisc_ops *get_ldops(int disc)
111{
112 unsigned long flags;
113 struct tty_ldisc_ops *ldops, *ret;
114
137084bb 115 raw_spin_lock_irqsave(&tty_ldiscs_lock, flags);
f0de0e8d
LT
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 }
137084bb 125 raw_spin_unlock_irqrestore(&tty_ldiscs_lock, flags);
f0de0e8d
LT
126 return ret;
127}
128
129static void put_ldops(struct tty_ldisc_ops *ldops)
130{
131 unsigned long flags;
132
137084bb 133 raw_spin_lock_irqsave(&tty_ldiscs_lock, flags);
f0de0e8d
LT
134 ldops->refcount--;
135 module_put(ldops->owner);
137084bb 136 raw_spin_unlock_irqrestore(&tty_ldiscs_lock, flags);
f0de0e8d 137}
01e1abb2 138
01e1abb2
AC
139/**
140 * tty_ldisc_get - take a reference to an ldisc
141 * @disc: ldisc number
01e1abb2
AC
142 *
143 * Takes a reference to a line discipline. Deals with refcounts and
c0cc1c5d
PH
144 * module locking counts.
145 *
146 * Returns: -EINVAL if the discipline index is not [N_TTY..NR_LDISCS] or
147 * if the discipline is not registered
148 * -EAGAIN if request_module() failed to load or register the
149 * the discipline
150 * -ENOMEM if allocation failure
151 *
152 * Otherwise, returns a pointer to the discipline and bumps the
153 * ref count
01e1abb2
AC
154 *
155 * Locking:
137084bb 156 * takes tty_ldiscs_lock to guard against ldisc races
01e1abb2
AC
157 */
158
530c4ba3 159static int tty_ldisc_autoload = IS_BUILTIN(CONFIG_LDISC_AUTOLOAD);
7c0cca7c 160
36697529 161static struct tty_ldisc *tty_ldisc_get(struct tty_struct *tty, int disc)
01e1abb2 162{
c65c9bc3 163 struct tty_ldisc *ld;
182274f8 164 struct tty_ldisc_ops *ldops;
01e1abb2
AC
165
166 if (disc < N_TTY || disc >= NR_LDISCS)
c65c9bc3 167 return ERR_PTR(-EINVAL);
182274f8
LT
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)) {
7c0cca7c
GKH
175 if (!capable(CAP_SYS_MODULE) && !tty_ldisc_autoload)
176 return ERR_PTR(-EPERM);
01e1abb2 177 request_module("tty-ldisc-%d", disc);
182274f8
LT
178 ldops = get_ldops(disc);
179 if (IS_ERR(ldops))
180 return ERR_CAST(ldops);
181 }
182
bcdd0ca8
TH
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);
182274f8 188 ld->ops = ldops;
36697529 189 ld->tty = tty;
1541f845 190
c65c9bc3 191 return ld;
01e1abb2
AC
192}
193
734de249
PH
194/**
195 * tty_ldisc_put - release the ldisc
196 *
197 * Complement of tty_ldisc_get().
198 */
cb128f69 199static void tty_ldisc_put(struct tty_ldisc *ld)
734de249 200{
734de249
PH
201 if (WARN_ON_ONCE(!ld))
202 return;
203
36697529 204 put_ldops(ld->ops);
734de249 205 kfree(ld);
734de249
PH
206}
207
852e99d2 208static void *tty_ldiscs_seq_start(struct seq_file *m, loff_t *pos)
01e1abb2
AC
209{
210 return (*pos < NR_LDISCS) ? pos : NULL;
211}
212
852e99d2 213static void *tty_ldiscs_seq_next(struct seq_file *m, void *v, loff_t *pos)
01e1abb2
AC
214{
215 (*pos)++;
216 return (*pos < NR_LDISCS) ? pos : NULL;
217}
218
219static void tty_ldiscs_seq_stop(struct seq_file *m, void *v)
220{
221}
222
223static int tty_ldiscs_seq_show(struct seq_file *m, void *v)
224{
225 int i = *(loff_t *)v;
f0de0e8d 226 struct tty_ldisc_ops *ldops;
852e99d2 227
f0de0e8d
LT
228 ldops = get_ldops(i);
229 if (IS_ERR(ldops))
01e1abb2 230 return 0;
f0de0e8d
LT
231 seq_printf(m, "%-10s %2d\n", ldops->name ? ldops->name : "???", i);
232 put_ldops(ldops);
01e1abb2
AC
233 return 0;
234}
235
fddda2b7 236const struct seq_operations tty_ldiscs_seq_ops = {
01e1abb2
AC
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
01e1abb2
AC
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 *
892d1fa7
PH
251 * Returns: NULL if the tty has been hungup and not re-opened with
252 * a new file descriptor, otherwise valid ldisc reference
253 *
01e1abb2
AC
254 * Note: 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 *
e55afd11
PH
259 * Note: a file_operations routine (read/poll/write) should use this
260 * function to wait for any ldisc lifetime events to finish.
01e1abb2
AC
261 */
262
263struct tty_ldisc *tty_ldisc_ref_wait(struct tty_struct *tty)
264{
a4a3e061
DV
265 struct tty_ldisc *ld;
266
36697529 267 ldsem_down_read(&tty->ldisc_sem, MAX_SCHEDULE_TIMEOUT);
a4a3e061
DV
268 ld = tty->ldisc;
269 if (!ld)
a570a49a 270 ldsem_up_read(&tty->ldisc_sem);
a4a3e061 271 return ld;
01e1abb2 272}
01e1abb2
AC
273EXPORT_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.
01e1abb2
AC
282 */
283
284struct tty_ldisc *tty_ldisc_ref(struct tty_struct *tty)
285{
36697529
PH
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;
01e1abb2 294}
01e1abb2
AC
295EXPORT_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.
01e1abb2
AC
303 */
304
305void tty_ldisc_deref(struct tty_ldisc *ld)
306{
36697529 307 ldsem_up_read(&ld->tty->ldisc_sem);
01e1abb2 308}
01e1abb2
AC
309EXPORT_SYMBOL_GPL(tty_ldisc_deref);
310
d2c43890 311
c2bb524b 312static inline int
e80a10ee 313__tty_ldisc_lock(struct tty_struct *tty, unsigned long timeout)
d2c43890
PH
314{
315 return ldsem_down_write(&tty->ldisc_sem, timeout);
316}
317
c2bb524b 318static inline int
e80a10ee 319__tty_ldisc_lock_nested(struct tty_struct *tty, unsigned long timeout)
d2c43890
PH
320{
321 return ldsem_down_write_nested(&tty->ldisc_sem,
322 LDISC_SEM_OTHER, timeout);
323}
324
e80a10ee 325static inline void __tty_ldisc_unlock(struct tty_struct *tty)
d2c43890 326{
52772ea6 327 ldsem_up_write(&tty->ldisc_sem);
d2c43890
PH
328}
329
b027e229 330int tty_ldisc_lock(struct tty_struct *tty, unsigned long timeout)
fae76e9a
PH
331{
332 int ret;
333
c96cf923
DS
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
fae76e9a
PH
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
b027e229 346void tty_ldisc_unlock(struct tty_struct *tty)
fae76e9a
PH
347{
348 clear_bit(TTY_LDISC_HALTED, &tty->flags);
c96cf923
DS
349 /* Can be cleared here - ldisc_unlock will wake up writers firstly */
350 clear_bit(TTY_LDISC_CHANGING, &tty->flags);
fae76e9a
PH
351 __tty_ldisc_unlock(tty);
352}
353
c2bb524b 354static int
d2c43890
PH
355tty_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) {
e80a10ee 361 ret = __tty_ldisc_lock(tty, timeout);
d2c43890 362 if (ret) {
e80a10ee 363 ret = __tty_ldisc_lock_nested(tty2, timeout);
d2c43890 364 if (!ret)
e80a10ee 365 __tty_ldisc_unlock(tty);
d2c43890
PH
366 }
367 } else {
368 /* if this is possible, it has lots of implications */
369 WARN_ON_ONCE(tty == tty2);
370 if (tty2 && tty != tty2) {
e80a10ee 371 ret = __tty_ldisc_lock(tty2, timeout);
d2c43890 372 if (ret) {
e80a10ee 373 ret = __tty_ldisc_lock_nested(tty, timeout);
d2c43890 374 if (!ret)
e80a10ee 375 __tty_ldisc_unlock(tty2);
d2c43890
PH
376 }
377 } else
e80a10ee 378 ret = __tty_ldisc_lock(tty, timeout);
d2c43890
PH
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
c2bb524b 390static void tty_ldisc_lock_pair(struct tty_struct *tty, struct tty_struct *tty2)
d2c43890
PH
391{
392 tty_ldisc_lock_pair_timeout(tty, tty2, MAX_SCHEDULE_TIMEOUT);
393}
394
c2bb524b
PH
395static void tty_ldisc_unlock_pair(struct tty_struct *tty,
396 struct tty_struct *tty2)
d2c43890 397{
e80a10ee 398 __tty_ldisc_unlock(tty);
d2c43890 399 if (tty2)
e80a10ee 400 __tty_ldisc_unlock(tty2);
d2c43890
PH
401}
402
f2c4c65c
AC
403/**
404 * tty_ldisc_flush - flush line discipline queue
405 * @tty: tty
406 *
86c80a8e
PH
407 * Flush the line discipline queue (if any) and the tty flip buffers
408 * for this tty.
f2c4c65c
AC
409 */
410
411void tty_ldisc_flush(struct tty_struct *tty)
412{
413 struct tty_ldisc *ld = tty_ldisc_ref(tty);
86c80a8e
PH
414
415 tty_buffer_flush(tty, ld);
416 if (ld)
f2c4c65c 417 tty_ldisc_deref(ld);
f2c4c65c 418}
f2c4c65c
AC
419EXPORT_SYMBOL_GPL(tty_ldisc_flush);
420
01e1abb2
AC
421/**
422 * tty_set_termios_ldisc - set ldisc field
423 * @tty: tty structure
c12da96f 424 * @disc: line discipline number
01e1abb2
AC
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 *
dd42bf11
PH
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 *
6a1c0680 434 * Locking: takes termios_rwsem
01e1abb2
AC
435 */
436
c12da96f 437static void tty_set_termios_ldisc(struct tty_struct *tty, int disc)
01e1abb2 438{
6a1c0680 439 down_write(&tty->termios_rwsem);
c12da96f 440 tty->termios.c_line = disc;
6a1c0680 441 up_write(&tty->termios_rwsem);
dd42bf11
PH
442
443 tty->disc_data = NULL;
444 tty->receive_room = 0;
01e1abb2
AC
445}
446
c65c9bc3
AC
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.
ec79d605
AB
454 *
455 * Locking: always called with BTM already held.
c65c9bc3
AC
456 */
457
458static 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));
f18f9498
AC
461 if (ld->ops->open) {
462 int ret;
ec79d605 463 /* BTM here locks versus a hangup event */
f18f9498 464 ret = ld->ops->open(tty);
7f90cfc5
JS
465 if (ret)
466 clear_bit(TTY_LDISC_OPEN, &tty->flags);
fb6edc91 467
a570a49a 468 tty_ldisc_debug(tty, "%p: opened\n", ld);
f18f9498
AC
469 return ret;
470 }
c65c9bc3
AC
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
483static void tty_ldisc_close(struct tty_struct *tty, struct tty_ldisc *ld)
484{
9ffbe8ac 485 lockdep_assert_held_write(&tty->ldisc_sem);
c65c9bc3
AC
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);
a570a49a 490 tty_ldisc_debug(tty, "%p: closed\n", ld);
c65c9bc3 491}
01e1abb2 492
8a8dabf2
AC
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
502static 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
9ffbe8ac 507 lockdep_assert_held_write(&tty->ldisc_sem);
8a8dabf2
AC
508 if (IS_ERR(disc))
509 return PTR_ERR(disc);
510 tty->ldisc = disc;
511 tty_set_termios_ldisc(tty, ld);
512 if ((r = tty_ldisc_open(tty, disc)) < 0)
513 tty_ldisc_put(disc);
514 return r;
515}
516
a8983d01
GKH
517/**
518 * tty_ldisc_restore - helper for tty ldisc change
519 * @tty: tty to recover
520 * @old: previous ldisc
521 *
522 * Restore the previous line discipline or N_TTY when a line discipline
523 * change fails due to an open error
524 */
525
526static void tty_ldisc_restore(struct tty_struct *tty, struct tty_ldisc *old)
527{
a8983d01 528 /* There is an outstanding reference here so this is safe */
598c2d41
TH
529 if (tty_ldisc_failto(tty, old->ops->num) < 0) {
530 const char *name = tty_name(tty);
531
532 pr_warn("Falling back ldisc for %s.\n", name);
8a8dabf2
AC
533 /* The traditional behaviour is to fall back to N_TTY, we
534 want to avoid falling back to N_NULL unless we have no
535 choice to avoid the risk of breaking anything */
536 if (tty_ldisc_failto(tty, N_TTY) < 0 &&
537 tty_ldisc_failto(tty, N_NULL) < 0)
598c2d41 538 panic("Couldn't open N_NULL ldisc for %s.", name);
a8983d01
GKH
539 }
540}
541
01e1abb2
AC
542/**
543 * tty_set_ldisc - set line discipline
544 * @tty: the terminal to set
545 * @ldisc: the line discipline
546 *
547 * Set the discipline of a tty line. Must be called from a process
c65c9bc3
AC
548 * context. The ldisc change logic has to protect itself against any
549 * overlapping ldisc change (including on the other end of pty pairs),
550 * the close of one side of a tty/pty pair, and eventually hangup.
01e1abb2
AC
551 */
552
c12da96f 553int tty_set_ldisc(struct tty_struct *tty, int disc)
01e1abb2 554{
a8983d01
GKH
555 int retval;
556 struct tty_ldisc *old_ldisc, *new_ldisc;
557
558 new_ldisc = tty_ldisc_get(tty, disc);
559 if (IS_ERR(new_ldisc))
560 return PTR_ERR(new_ldisc);
01e1abb2 561
c8483bc9 562 tty_lock(tty);
276a661a 563 retval = tty_ldisc_lock(tty, 5 * HZ);
63d8cb3f
PH
564 if (retval)
565 goto err;
01e1abb2 566
a570a49a
PH
567 if (!tty->ldisc) {
568 retval = -EIO;
569 goto out;
570 }
571
63d8cb3f 572 /* Check the no-op case */
a8983d01 573 if (tty->ldisc->ops->num == disc)
63d8cb3f 574 goto out;
c65c9bc3 575
63d8cb3f
PH
576 if (test_bit(TTY_HUPPED, &tty->flags)) {
577 /* We were raced by hangup */
578 retval = -EIO;
579 goto out;
01e1abb2
AC
580 }
581
a8983d01
GKH
582 old_ldisc = tty->ldisc;
583
584 /* Shutdown the old discipline. */
585 tty_ldisc_close(tty, old_ldisc);
586
587 /* Now set up the new line discipline. */
588 tty->ldisc = new_ldisc;
589 tty_set_termios_ldisc(tty, disc);
590
591 retval = tty_ldisc_open(tty, new_ldisc);
01e1abb2 592 if (retval < 0) {
c65c9bc3 593 /* Back to the old one or N_TTY if we can't */
a8983d01
GKH
594 tty_ldisc_put(new_ldisc);
595 tty_ldisc_restore(tty, old_ldisc);
01e1abb2 596 }
c65c9bc3 597
a8983d01 598 if (tty->ldisc->ops->num != old_ldisc->ops->num && tty->ops->set_ldisc) {
9191aaaa 599 down_read(&tty->termios_rwsem);
01e1abb2 600 tty->ops->set_ldisc(tty);
9191aaaa
PH
601 up_read(&tty->termios_rwsem);
602 }
01e1abb2 603
a8983d01
GKH
604 /* At this point we hold a reference to the new ldisc and a
605 reference to the old ldisc, or we hold two references to
606 the old ldisc (if it was restored as part of error cleanup
607 above). In either case, releasing a single reference from
608 the old ldisc is correct. */
609 new_ldisc = old_ldisc;
63d8cb3f 610out:
276a661a 611 tty_ldisc_unlock(tty);
01e1abb2 612
c65c9bc3 613 /* Restart the work queue in case no characters kick it off. Safe if
01e1abb2 614 already running */
17a69219 615 tty_buffer_restart_work(tty->port);
63d8cb3f 616err:
a8983d01 617 tty_ldisc_put(new_ldisc); /* drop the extra reference */
89c8d91e 618 tty_unlock(tty);
01e1abb2
AC
619 return retval;
620}
1ab92da3 621EXPORT_SYMBOL_GPL(tty_set_ldisc);
01e1abb2 622
6ffeb4b2
PH
623/**
624 * tty_ldisc_kill - teardown ldisc
625 * @tty: tty being released
626 *
627 * Perform final close of the ldisc and reset tty->ldisc
628 */
629static void tty_ldisc_kill(struct tty_struct *tty)
630{
9ffbe8ac 631 lockdep_assert_held_write(&tty->ldisc_sem);
6ffeb4b2
PH
632 if (!tty->ldisc)
633 return;
634 /*
635 * Now kill off the ldisc
636 */
637 tty_ldisc_close(tty, tty->ldisc);
638 tty_ldisc_put(tty->ldisc);
639 /* Force an oops if we mess this up */
640 tty->ldisc = NULL;
641}
642
c65c9bc3
AC
643/**
644 * tty_reset_termios - reset terminal state
645 * @tty: tty to reset
646 *
647 * Restore a terminal to the driver default state.
648 */
649
650static void tty_reset_termios(struct tty_struct *tty)
651{
6a1c0680 652 down_write(&tty->termios_rwsem);
adc8d746
AC
653 tty->termios = tty->driver->init_termios;
654 tty->termios.c_ispeed = tty_termios_input_baud_rate(&tty->termios);
655 tty->termios.c_ospeed = tty_termios_baud_rate(&tty->termios);
6a1c0680 656 up_write(&tty->termios_rwsem);
c65c9bc3
AC
657}
658
659
660/**
661 * tty_ldisc_reinit - reinitialise the tty ldisc
662 * @tty: tty to reinit
c12da96f 663 * @disc: line discipline to reinitialize
c65c9bc3 664 *
7896f30d 665 * Completely reinitialize the line discipline state, by closing the
892d1fa7
PH
666 * current instance, if there is one, and opening a new instance. If
667 * an error occurs opening the new non-N_TTY instance, the instance
668 * is dropped and tty->ldisc reset to NULL. The caller can then retry
669 * with N_TTY instead.
7896f30d
PH
670 *
671 * Returns 0 if successful, otherwise error code < 0
c65c9bc3
AC
672 */
673
892d1fa7 674int tty_ldisc_reinit(struct tty_struct *tty, int disc)
c65c9bc3 675{
7896f30d
PH
676 struct tty_ldisc *ld;
677 int retval;
1c95ba1e 678
9ffbe8ac 679 lockdep_assert_held_write(&tty->ldisc_sem);
7896f30d 680 ld = tty_ldisc_get(tty, disc);
a8983d01
GKH
681 if (IS_ERR(ld)) {
682 BUG_ON(disc == N_TTY);
7896f30d 683 return PTR_ERR(ld);
a8983d01 684 }
c65c9bc3 685
7896f30d
PH
686 if (tty->ldisc) {
687 tty_ldisc_close(tty, tty->ldisc);
688 tty_ldisc_put(tty->ldisc);
689 }
690
691 /* switch the line discipline */
f4807045 692 tty->ldisc = ld;
c12da96f 693 tty_set_termios_ldisc(tty, disc);
7896f30d
PH
694 retval = tty_ldisc_open(tty, tty->ldisc);
695 if (retval) {
e65c62b1
JW
696 tty_ldisc_put(tty->ldisc);
697 tty->ldisc = NULL;
7896f30d
PH
698 }
699 return retval;
c65c9bc3
AC
700}
701
702/**
703 * tty_ldisc_hangup - hangup ldisc reset
704 * @tty: tty being hung up
705 *
706 * Some tty devices reset their termios when they receive a hangup
707 * event. In that situation we must also switch back to N_TTY properly
708 * before we reset the termios data.
709 *
710 * Locking: We can take the ldisc mutex as the rest of the code is
711 * careful to allow for this.
712 *
713 * In the pty pair case this occurs in the close() path of the
714 * tty itself so we must be careful about locking rules.
715 */
716
892d1fa7 717void tty_ldisc_hangup(struct tty_struct *tty, bool reinit)
c65c9bc3
AC
718{
719 struct tty_ldisc *ld;
720
a570a49a 721 tty_ldisc_debug(tty, "%p: hangup\n", tty->ldisc);
fc575ee6 722
c65c9bc3
AC
723 ld = tty_ldisc_ref(tty);
724 if (ld != NULL) {
c65c9bc3
AC
725 if (ld->ops->flush_buffer)
726 ld->ops->flush_buffer(tty);
727 tty_driver_flush_buffer(tty);
728 if ((test_bit(TTY_DO_WRITE_WAKEUP, &tty->flags)) &&
729 ld->ops->write_wakeup)
730 ld->ops->write_wakeup(tty);
731 if (ld->ops->hangup)
732 ld->ops->hangup(tty);
733 tty_ldisc_deref(ld);
734 }
36697529 735
a9a08845
LT
736 wake_up_interruptible_poll(&tty->write_wait, EPOLLOUT);
737 wake_up_interruptible_poll(&tty->read_wait, EPOLLIN);
36697529 738
c65c9bc3
AC
739 /*
740 * Shutdown the current line discipline, and reset it to
638b9648
AC
741 * N_TTY if need be.
742 *
743 * Avoid racing set_ldisc or tty_ldisc_release
c65c9bc3 744 */
fae76e9a 745 tty_ldisc_lock(tty, MAX_SCHEDULE_TIMEOUT);
60af22d2 746
892d1fa7
PH
747 if (tty->driver->flags & TTY_DRIVER_RESET_TERMIOS)
748 tty_reset_termios(tty);
c8785241 749
892d1fa7
PH
750 if (tty->ldisc) {
751 if (reinit) {
e65c62b1
JW
752 if (tty_ldisc_reinit(tty, tty->termios.c_line) < 0 &&
753 tty_ldisc_reinit(tty, N_TTY) < 0)
754 WARN_ON(tty_ldisc_reinit(tty, N_NULL) < 0);
892d1fa7
PH
755 } else
756 tty_ldisc_kill(tty);
c65c9bc3 757 }
fae76e9a 758 tty_ldisc_unlock(tty);
c65c9bc3 759}
01e1abb2
AC
760
761/**
762 * tty_ldisc_setup - open line discipline
763 * @tty: tty being shut down
764 * @o_tty: pair tty for pty/tty pairs
765 *
766 * Called during the initial open of a tty/pty pair in order to set up the
c65c9bc3
AC
767 * line disciplines and bind them to the tty. This has no locking issues
768 * as the device isn't yet active.
01e1abb2
AC
769 */
770
771int tty_ldisc_setup(struct tty_struct *tty, struct tty_struct *o_tty)
772{
9de2a7ce 773 int retval = tty_ldisc_open(tty, tty->ldisc);
c65c9bc3
AC
774 if (retval)
775 return retval;
776
777 if (o_tty) {
110b8928
DS
778 /*
779 * Called without o_tty->ldisc_sem held, as o_tty has been
780 * just allocated and no one has a reference to it.
781 */
c65c9bc3 782 retval = tty_ldisc_open(o_tty, o_tty->ldisc);
01e1abb2 783 if (retval) {
9de2a7ce 784 tty_ldisc_close(tty, tty->ldisc);
01e1abb2
AC
785 return retval;
786 }
01e1abb2 787 }
01e1abb2
AC
788 return 0;
789}
89c8d91e 790
01e1abb2
AC
791/**
792 * tty_ldisc_release - release line discipline
62462aef 793 * @tty: tty being shut down (or one end of pty pair)
3ee175d9 794 *
62462aef 795 * Called during the final close of a tty or a pty pair in order to shut
5b6e6832 796 * down the line discpline layer. On exit, each tty's ldisc is NULL.
01e1abb2
AC
797 */
798
62462aef 799void tty_ldisc_release(struct tty_struct *tty)
01e1abb2 800{
62462aef
PH
801 struct tty_struct *o_tty = tty->link;
802
01e1abb2 803 /*
a2965b7b
PH
804 * Shutdown this line discipline. As this is the final close,
805 * it does not race with the set_ldisc code path.
01e1abb2 806 */
01e1abb2 807
36697529 808 tty_ldisc_lock_pair(tty, o_tty);
89c8d91e 809 tty_ldisc_kill(tty);
c65c9bc3 810 if (o_tty)
89c8d91e 811 tty_ldisc_kill(o_tty);
36697529
PH
812 tty_ldisc_unlock_pair(tty, o_tty);
813
aef29bc2
AC
814 /* And the memory resources remaining (buffers, termios) will be
815 disposed of when the kref hits zero */
fc575ee6 816
fb6edc91 817 tty_ldisc_debug(tty, "released\n");
01e1abb2 818}
1ab92da3 819EXPORT_SYMBOL_GPL(tty_ldisc_release);
01e1abb2
AC
820
821/**
822 * tty_ldisc_init - ldisc setup for new tty
823 * @tty: tty being allocated
824 *
825 * Set up the line discipline objects for a newly allocated tty. Note that
826 * the tty structure is not completely set up when this call is made.
827 */
828
903f9db1 829int tty_ldisc_init(struct tty_struct *tty)
01e1abb2 830{
36697529 831 struct tty_ldisc *ld = tty_ldisc_get(tty, N_TTY);
c65c9bc3 832 if (IS_ERR(ld))
903f9db1 833 return PTR_ERR(ld);
f4807045 834 tty->ldisc = ld;
903f9db1 835 return 0;
01e1abb2
AC
836}
837
6716671d 838/**
c8b710b3 839 * tty_ldisc_deinit - ldisc cleanup for new tty
6716671d
JS
840 * @tty: tty that was allocated recently
841 *
842 * The tty structure must not becompletely set up (tty_ldisc_setup) when
843 * this call is made.
844 */
845void tty_ldisc_deinit(struct tty_struct *tty)
846{
110b8928 847 /* no ldisc_sem, tty is being destroyed */
c8b710b3
PH
848 if (tty->ldisc)
849 tty_ldisc_put(tty->ldisc);
f4807045 850 tty->ldisc = NULL;
6716671d 851}
7c0cca7c 852
7c0cca7c
GKH
853static struct ctl_table tty_table[] = {
854 {
855 .procname = "ldisc_autoload",
856 .data = &tty_ldisc_autoload,
857 .maxlen = sizeof(tty_ldisc_autoload),
858 .mode = 0644,
859 .proc_handler = proc_dointvec,
eec4844f
MC
860 .extra1 = SYSCTL_ZERO,
861 .extra2 = SYSCTL_ONE,
7c0cca7c
GKH
862 },
863 { }
864};
865
866static struct ctl_table tty_dir_table[] = {
867 {
868 .procname = "tty",
869 .mode = 0555,
870 .child = tty_table,
871 },
872 { }
873};
874
875static struct ctl_table tty_root_table[] = {
876 {
877 .procname = "dev",
878 .mode = 0555,
879 .child = tty_dir_table,
880 },
881 { }
882};
883
884void tty_sysctl_init(void)
885{
886 register_sysctl_table(tty_root_table);
887}