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