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