]> asedeno.scripts.mit.edu Git - linux.git/blob - drivers/tty/tty_ldisc.c
tty: Don't call panic() at tty_ldisc_init()
[linux.git] / drivers / tty / tty_ldisc.c
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
23 #undef LDISC_DEBUG_HANGUP
24
25 #ifdef LDISC_DEBUG_HANGUP
26 #define tty_ldisc_debug(tty, f, args...)        tty_debug(tty, f, ##args)
27 #else
28 #define tty_ldisc_debug(tty, f, args...)
29 #endif
30
31 /* lockdep nested classes for tty->ldisc_sem */
32 enum {
33         LDISC_SEM_NORMAL,
34         LDISC_SEM_OTHER,
35 };
36
37
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
44 static DEFINE_RAW_SPINLOCK(tty_ldiscs_lock);
45 /* Line disc dispatch table */
46 static 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:
58  *              takes tty_ldiscs_lock to guard against ldisc races
59  */
60
61 int 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
69         raw_spin_lock_irqsave(&tty_ldiscs_lock, flags);
70         tty_ldiscs[disc] = new_ldisc;
71         new_ldisc->num = disc;
72         new_ldisc->refcount = 0;
73         raw_spin_unlock_irqrestore(&tty_ldiscs_lock, flags);
74
75         return ret;
76 }
77 EXPORT_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:
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 /**
140  *      tty_ldisc_get           -       take a reference to an ldisc
141  *      @disc: ldisc number
142  *
143  *      Takes a reference to a line discipline. Deals with refcounts and
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
154  *
155  *      Locking:
156  *              takes tty_ldiscs_lock to guard against ldisc races
157  */
158
159 static struct tty_ldisc *tty_ldisc_get(struct tty_struct *tty, int disc)
160 {
161         struct tty_ldisc *ld;
162         struct tty_ldisc_ops *ldops;
163
164         if (disc < N_TTY || disc >= NR_LDISCS)
165                 return ERR_PTR(-EINVAL);
166
167         /*
168          * Get the ldisc ops - we may need to request them to be loaded
169          * dynamically and try again.
170          */
171         ldops = get_ldops(disc);
172         if (IS_ERR(ldops)) {
173                 request_module("tty-ldisc-%d", disc);
174                 ldops = get_ldops(disc);
175                 if (IS_ERR(ldops))
176                         return ERR_CAST(ldops);
177         }
178
179         ld = kmalloc(sizeof(struct tty_ldisc), GFP_KERNEL);
180         if (ld == NULL) {
181                 put_ldops(ldops);
182                 return ERR_PTR(-ENOMEM);
183         }
184
185         ld->ops = ldops;
186         ld->tty = tty;
187
188         return ld;
189 }
190
191 /**
192  *      tty_ldisc_put           -       release the ldisc
193  *
194  *      Complement of tty_ldisc_get().
195  */
196 static void tty_ldisc_put(struct tty_ldisc *ld)
197 {
198         if (WARN_ON_ONCE(!ld))
199                 return;
200
201         put_ldops(ld->ops);
202         kfree(ld);
203 }
204
205 static void *tty_ldiscs_seq_start(struct seq_file *m, loff_t *pos)
206 {
207         return (*pos < NR_LDISCS) ? pos : NULL;
208 }
209
210 static void *tty_ldiscs_seq_next(struct seq_file *m, void *v, loff_t *pos)
211 {
212         (*pos)++;
213         return (*pos < NR_LDISCS) ? pos : NULL;
214 }
215
216 static void tty_ldiscs_seq_stop(struct seq_file *m, void *v)
217 {
218 }
219
220 static int tty_ldiscs_seq_show(struct seq_file *m, void *v)
221 {
222         int i = *(loff_t *)v;
223         struct tty_ldisc_ops *ldops;
224
225         ldops = get_ldops(i);
226         if (IS_ERR(ldops))
227                 return 0;
228         seq_printf(m, "%-10s %2d\n", ldops->name ? ldops->name : "???", i);
229         put_ldops(ldops);
230         return 0;
231 }
232
233 static const struct seq_operations tty_ldiscs_seq_ops = {
234         .start  = tty_ldiscs_seq_start,
235         .next   = tty_ldiscs_seq_next,
236         .stop   = tty_ldiscs_seq_stop,
237         .show   = tty_ldiscs_seq_show,
238 };
239
240 static int proc_tty_ldiscs_open(struct inode *inode, struct file *file)
241 {
242         return seq_open(file, &tty_ldiscs_seq_ops);
243 }
244
245 const struct file_operations tty_ldiscs_proc_fops = {
246         .owner          = THIS_MODULE,
247         .open           = proc_tty_ldiscs_open,
248         .read           = seq_read,
249         .llseek         = seq_lseek,
250         .release        = seq_release,
251 };
252
253 /**
254  *      tty_ldisc_ref_wait      -       wait for the tty ldisc
255  *      @tty: tty device
256  *
257  *      Dereference the line discipline for the terminal and take a
258  *      reference to it. If the line discipline is in flux then
259  *      wait patiently until it changes.
260  *
261  *      Returns: NULL if the tty has been hungup and not re-opened with
262  *               a new file descriptor, otherwise valid ldisc reference
263  *
264  *      Note: Must not be called from an IRQ/timer context. The caller
265  *      must also be careful not to hold other locks that will deadlock
266  *      against a discipline change, such as an existing ldisc reference
267  *      (which we check for)
268  *
269  *      Note: a file_operations routine (read/poll/write) should use this
270  *      function to wait for any ldisc lifetime events to finish.
271  */
272
273 struct tty_ldisc *tty_ldisc_ref_wait(struct tty_struct *tty)
274 {
275         struct tty_ldisc *ld;
276
277         ldsem_down_read(&tty->ldisc_sem, MAX_SCHEDULE_TIMEOUT);
278         ld = tty->ldisc;
279         if (!ld)
280                 ldsem_up_read(&tty->ldisc_sem);
281         return ld;
282 }
283 EXPORT_SYMBOL_GPL(tty_ldisc_ref_wait);
284
285 /**
286  *      tty_ldisc_ref           -       get the tty ldisc
287  *      @tty: tty device
288  *
289  *      Dereference the line discipline for the terminal and take a
290  *      reference to it. If the line discipline is in flux then
291  *      return NULL. Can be called from IRQ and timer functions.
292  */
293
294 struct tty_ldisc *tty_ldisc_ref(struct tty_struct *tty)
295 {
296         struct tty_ldisc *ld = NULL;
297
298         if (ldsem_down_read_trylock(&tty->ldisc_sem)) {
299                 ld = tty->ldisc;
300                 if (!ld)
301                         ldsem_up_read(&tty->ldisc_sem);
302         }
303         return ld;
304 }
305 EXPORT_SYMBOL_GPL(tty_ldisc_ref);
306
307 /**
308  *      tty_ldisc_deref         -       free a tty ldisc reference
309  *      @ld: reference to free up
310  *
311  *      Undoes the effect of tty_ldisc_ref or tty_ldisc_ref_wait. May
312  *      be called in IRQ context.
313  */
314
315 void tty_ldisc_deref(struct tty_ldisc *ld)
316 {
317         ldsem_up_read(&ld->tty->ldisc_sem);
318 }
319 EXPORT_SYMBOL_GPL(tty_ldisc_deref);
320
321
322 static inline int
323 __tty_ldisc_lock(struct tty_struct *tty, unsigned long timeout)
324 {
325         return ldsem_down_write(&tty->ldisc_sem, timeout);
326 }
327
328 static inline int
329 __tty_ldisc_lock_nested(struct tty_struct *tty, unsigned long timeout)
330 {
331         return ldsem_down_write_nested(&tty->ldisc_sem,
332                                        LDISC_SEM_OTHER, timeout);
333 }
334
335 static inline void __tty_ldisc_unlock(struct tty_struct *tty)
336 {
337         ldsem_up_write(&tty->ldisc_sem);
338 }
339
340 int tty_ldisc_lock(struct tty_struct *tty, unsigned long timeout)
341 {
342         int ret;
343
344         ret = __tty_ldisc_lock(tty, timeout);
345         if (!ret)
346                 return -EBUSY;
347         set_bit(TTY_LDISC_HALTED, &tty->flags);
348         return 0;
349 }
350
351 void tty_ldisc_unlock(struct tty_struct *tty)
352 {
353         clear_bit(TTY_LDISC_HALTED, &tty->flags);
354         __tty_ldisc_unlock(tty);
355 }
356
357 static int
358 tty_ldisc_lock_pair_timeout(struct tty_struct *tty, struct tty_struct *tty2,
359                             unsigned long timeout)
360 {
361         int ret;
362
363         if (tty < tty2) {
364                 ret = __tty_ldisc_lock(tty, timeout);
365                 if (ret) {
366                         ret = __tty_ldisc_lock_nested(tty2, timeout);
367                         if (!ret)
368                                 __tty_ldisc_unlock(tty);
369                 }
370         } else {
371                 /* if this is possible, it has lots of implications */
372                 WARN_ON_ONCE(tty == tty2);
373                 if (tty2 && tty != tty2) {
374                         ret = __tty_ldisc_lock(tty2, timeout);
375                         if (ret) {
376                                 ret = __tty_ldisc_lock_nested(tty, timeout);
377                                 if (!ret)
378                                         __tty_ldisc_unlock(tty2);
379                         }
380                 } else
381                         ret = __tty_ldisc_lock(tty, timeout);
382         }
383
384         if (!ret)
385                 return -EBUSY;
386
387         set_bit(TTY_LDISC_HALTED, &tty->flags);
388         if (tty2)
389                 set_bit(TTY_LDISC_HALTED, &tty2->flags);
390         return 0;
391 }
392
393 static void tty_ldisc_lock_pair(struct tty_struct *tty, struct tty_struct *tty2)
394 {
395         tty_ldisc_lock_pair_timeout(tty, tty2, MAX_SCHEDULE_TIMEOUT);
396 }
397
398 static void tty_ldisc_unlock_pair(struct tty_struct *tty,
399                                   struct tty_struct *tty2)
400 {
401         __tty_ldisc_unlock(tty);
402         if (tty2)
403                 __tty_ldisc_unlock(tty2);
404 }
405
406 /**
407  *      tty_ldisc_flush -       flush line discipline queue
408  *      @tty: tty
409  *
410  *      Flush the line discipline queue (if any) and the tty flip buffers
411  *      for this tty.
412  */
413
414 void tty_ldisc_flush(struct tty_struct *tty)
415 {
416         struct tty_ldisc *ld = tty_ldisc_ref(tty);
417
418         tty_buffer_flush(tty, ld);
419         if (ld)
420                 tty_ldisc_deref(ld);
421 }
422 EXPORT_SYMBOL_GPL(tty_ldisc_flush);
423
424 /**
425  *      tty_set_termios_ldisc           -       set ldisc field
426  *      @tty: tty structure
427  *      @disc: line discipline number
428  *
429  *      This is probably overkill for real world processors but
430  *      they are not on hot paths so a little discipline won't do
431  *      any harm.
432  *
433  *      The line discipline-related tty_struct fields are reset to
434  *      prevent the ldisc driver from re-using stale information for
435  *      the new ldisc instance.
436  *
437  *      Locking: takes termios_rwsem
438  */
439
440 static void tty_set_termios_ldisc(struct tty_struct *tty, int disc)
441 {
442         down_write(&tty->termios_rwsem);
443         tty->termios.c_line = disc;
444         up_write(&tty->termios_rwsem);
445
446         tty->disc_data = NULL;
447         tty->receive_room = 0;
448 }
449
450 /**
451  *      tty_ldisc_open          -       open a line discipline
452  *      @tty: tty we are opening the ldisc on
453  *      @ld: discipline to open
454  *
455  *      A helper opening method. Also a convenient debugging and check
456  *      point.
457  *
458  *      Locking: always called with BTM already held.
459  */
460
461 static int tty_ldisc_open(struct tty_struct *tty, struct tty_ldisc *ld)
462 {
463         WARN_ON(test_and_set_bit(TTY_LDISC_OPEN, &tty->flags));
464         if (ld->ops->open) {
465                 int ret;
466                 /* BTM here locks versus a hangup event */
467                 ret = ld->ops->open(tty);
468                 if (ret)
469                         clear_bit(TTY_LDISC_OPEN, &tty->flags);
470
471                 tty_ldisc_debug(tty, "%p: opened\n", ld);
472                 return ret;
473         }
474         return 0;
475 }
476
477 /**
478  *      tty_ldisc_close         -       close a line discipline
479  *      @tty: tty we are opening the ldisc on
480  *      @ld: discipline to close
481  *
482  *      A helper close method. Also a convenient debugging and check
483  *      point.
484  */
485
486 static void tty_ldisc_close(struct tty_struct *tty, struct tty_ldisc *ld)
487 {
488         WARN_ON(!test_bit(TTY_LDISC_OPEN, &tty->flags));
489         clear_bit(TTY_LDISC_OPEN, &tty->flags);
490         if (ld->ops->close)
491                 ld->ops->close(tty);
492         tty_ldisc_debug(tty, "%p: closed\n", ld);
493 }
494
495 /**
496  *      tty_ldisc_failto        -       helper for ldisc failback
497  *      @tty: tty to open the ldisc on
498  *      @ld: ldisc we are trying to fail back to
499  *
500  *      Helper to try and recover a tty when switching back to the old
501  *      ldisc fails and we need something attached.
502  */
503
504 static int tty_ldisc_failto(struct tty_struct *tty, int ld)
505 {
506         struct tty_ldisc *disc = tty_ldisc_get(tty, ld);
507         int r;
508
509         if (IS_ERR(disc))
510                 return PTR_ERR(disc);
511         tty->ldisc = disc;
512         tty_set_termios_ldisc(tty, ld);
513         if ((r = tty_ldisc_open(tty, disc)) < 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                 /* The traditional behaviour is to fall back to N_TTY, we
535                    want to avoid falling back to N_NULL unless we have no
536                    choice to avoid the risk of breaking anything */
537                 if (tty_ldisc_failto(tty, N_TTY) < 0 &&
538                     tty_ldisc_failto(tty, N_NULL) < 0)
539                         panic("Couldn't open N_NULL ldisc for %s.", name);
540         }
541 }
542
543 /**
544  *      tty_set_ldisc           -       set line discipline
545  *      @tty: the terminal to set
546  *      @ldisc: the line discipline
547  *
548  *      Set the discipline of a tty line. Must be called from a process
549  *      context. The ldisc change logic has to protect itself against any
550  *      overlapping ldisc change (including on the other end of pty pairs),
551  *      the close of one side of a tty/pty pair, and eventually hangup.
552  */
553
554 int tty_set_ldisc(struct tty_struct *tty, int disc)
555 {
556         int retval;
557         struct tty_ldisc *old_ldisc, *new_ldisc;
558
559         new_ldisc = tty_ldisc_get(tty, disc);
560         if (IS_ERR(new_ldisc))
561                 return PTR_ERR(new_ldisc);
562
563         tty_lock(tty);
564         retval = tty_ldisc_lock(tty, 5 * HZ);
565         if (retval)
566                 goto err;
567
568         if (!tty->ldisc) {
569                 retval = -EIO;
570                 goto out;
571         }
572
573         /* Check the no-op case */
574         if (tty->ldisc->ops->num == disc)
575                 goto out;
576
577         if (test_bit(TTY_HUPPED, &tty->flags)) {
578                 /* We were raced by hangup */
579                 retval = -EIO;
580                 goto out;
581         }
582
583         old_ldisc = tty->ldisc;
584
585         /* Shutdown the old discipline. */
586         tty_ldisc_close(tty, old_ldisc);
587
588         /* Now set up the new line discipline. */
589         tty->ldisc = new_ldisc;
590         tty_set_termios_ldisc(tty, disc);
591
592         retval = tty_ldisc_open(tty, new_ldisc);
593         if (retval < 0) {
594                 /* Back to the old one or N_TTY if we can't */
595                 tty_ldisc_put(new_ldisc);
596                 tty_ldisc_restore(tty, old_ldisc);
597         }
598
599         if (tty->ldisc->ops->num != old_ldisc->ops->num && tty->ops->set_ldisc) {
600                 down_read(&tty->termios_rwsem);
601                 tty->ops->set_ldisc(tty);
602                 up_read(&tty->termios_rwsem);
603         }
604
605         /* At this point we hold a reference to the new ldisc and a
606            reference to the old ldisc, or we hold two references to
607            the old ldisc (if it was restored as part of error cleanup
608            above). In either case, releasing a single reference from
609            the old ldisc is correct. */
610         new_ldisc = old_ldisc;
611 out:
612         tty_ldisc_unlock(tty);
613
614         /* Restart the work queue in case no characters kick it off. Safe if
615            already running */
616         tty_buffer_restart_work(tty->port);
617 err:
618         tty_ldisc_put(new_ldisc);       /* drop the extra reference */
619         tty_unlock(tty);
620         return retval;
621 }
622 EXPORT_SYMBOL_GPL(tty_set_ldisc);
623
624 /**
625  *      tty_ldisc_kill  -       teardown ldisc
626  *      @tty: tty being released
627  *
628  *      Perform final close of the ldisc and reset tty->ldisc
629  */
630 static void tty_ldisc_kill(struct tty_struct *tty)
631 {
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
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
650 static void tty_reset_termios(struct tty_struct *tty)
651 {
652         down_write(&tty->termios_rwsem);
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);
656         up_write(&tty->termios_rwsem);
657 }
658
659
660 /**
661  *      tty_ldisc_reinit        -       reinitialise the tty ldisc
662  *      @tty: tty to reinit
663  *      @disc: line discipline to reinitialize
664  *
665  *      Completely reinitialize the line discipline state, by closing the
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.
670  *
671  *      Returns 0 if successful, otherwise error code < 0
672  */
673
674 int tty_ldisc_reinit(struct tty_struct *tty, int disc)
675 {
676         struct tty_ldisc *ld;
677         int retval;
678
679         ld = tty_ldisc_get(tty, disc);
680         if (IS_ERR(ld)) {
681                 BUG_ON(disc == N_TTY);
682                 return PTR_ERR(ld);
683         }
684
685         if (tty->ldisc) {
686                 tty_ldisc_close(tty, tty->ldisc);
687                 tty_ldisc_put(tty->ldisc);
688         }
689
690         /* switch the line discipline */
691         tty->ldisc = ld;
692         tty_set_termios_ldisc(tty, disc);
693         retval = tty_ldisc_open(tty, tty->ldisc);
694         if (retval) {
695                 tty_ldisc_put(tty->ldisc);
696                 tty->ldisc = NULL;
697         }
698         return retval;
699 }
700
701 /**
702  *      tty_ldisc_hangup                -       hangup ldisc reset
703  *      @tty: tty being hung up
704  *
705  *      Some tty devices reset their termios when they receive a hangup
706  *      event. In that situation we must also switch back to N_TTY properly
707  *      before we reset the termios data.
708  *
709  *      Locking: We can take the ldisc mutex as the rest of the code is
710  *      careful to allow for this.
711  *
712  *      In the pty pair case this occurs in the close() path of the
713  *      tty itself so we must be careful about locking rules.
714  */
715
716 void tty_ldisc_hangup(struct tty_struct *tty, bool reinit)
717 {
718         struct tty_ldisc *ld;
719
720         tty_ldisc_debug(tty, "%p: hangup\n", tty->ldisc);
721
722         ld = tty_ldisc_ref(tty);
723         if (ld != NULL) {
724                 if (ld->ops->flush_buffer)
725                         ld->ops->flush_buffer(tty);
726                 tty_driver_flush_buffer(tty);
727                 if ((test_bit(TTY_DO_WRITE_WAKEUP, &tty->flags)) &&
728                     ld->ops->write_wakeup)
729                         ld->ops->write_wakeup(tty);
730                 if (ld->ops->hangup)
731                         ld->ops->hangup(tty);
732                 tty_ldisc_deref(ld);
733         }
734
735         wake_up_interruptible_poll(&tty->write_wait, EPOLLOUT);
736         wake_up_interruptible_poll(&tty->read_wait, EPOLLIN);
737
738         /*
739          * Shutdown the current line discipline, and reset it to
740          * N_TTY if need be.
741          *
742          * Avoid racing set_ldisc or tty_ldisc_release
743          */
744         tty_ldisc_lock(tty, MAX_SCHEDULE_TIMEOUT);
745
746         if (tty->driver->flags & TTY_DRIVER_RESET_TERMIOS)
747                 tty_reset_termios(tty);
748
749         if (tty->ldisc) {
750                 if (reinit) {
751                         if (tty_ldisc_reinit(tty, tty->termios.c_line) < 0 &&
752                             tty_ldisc_reinit(tty, N_TTY) < 0)
753                                 WARN_ON(tty_ldisc_reinit(tty, N_NULL) < 0);
754                 } else
755                         tty_ldisc_kill(tty);
756         }
757         tty_ldisc_unlock(tty);
758 }
759
760 /**
761  *      tty_ldisc_setup                 -       open line discipline
762  *      @tty: tty being shut down
763  *      @o_tty: pair tty for pty/tty pairs
764  *
765  *      Called during the initial open of a tty/pty pair in order to set up the
766  *      line disciplines and bind them to the tty. This has no locking issues
767  *      as the device isn't yet active.
768  */
769
770 int tty_ldisc_setup(struct tty_struct *tty, struct tty_struct *o_tty)
771 {
772         int retval = tty_ldisc_open(tty, tty->ldisc);
773         if (retval)
774                 return retval;
775
776         if (o_tty) {
777                 retval = tty_ldisc_open(o_tty, o_tty->ldisc);
778                 if (retval) {
779                         tty_ldisc_close(tty, tty->ldisc);
780                         return retval;
781                 }
782         }
783         return 0;
784 }
785
786 /**
787  *      tty_ldisc_release               -       release line discipline
788  *      @tty: tty being shut down (or one end of pty pair)
789  *
790  *      Called during the final close of a tty or a pty pair in order to shut
791  *      down the line discpline layer. On exit, each tty's ldisc is NULL.
792  */
793
794 void tty_ldisc_release(struct tty_struct *tty)
795 {
796         struct tty_struct *o_tty = tty->link;
797
798         /*
799          * Shutdown this line discipline. As this is the final close,
800          * it does not race with the set_ldisc code path.
801          */
802
803         tty_ldisc_lock_pair(tty, o_tty);
804         tty_ldisc_kill(tty);
805         if (o_tty)
806                 tty_ldisc_kill(o_tty);
807         tty_ldisc_unlock_pair(tty, o_tty);
808
809         /* And the memory resources remaining (buffers, termios) will be
810            disposed of when the kref hits zero */
811
812         tty_ldisc_debug(tty, "released\n");
813 }
814 EXPORT_SYMBOL_GPL(tty_ldisc_release);
815
816 /**
817  *      tty_ldisc_init          -       ldisc setup for new tty
818  *      @tty: tty being allocated
819  *
820  *      Set up the line discipline objects for a newly allocated tty. Note that
821  *      the tty structure is not completely set up when this call is made.
822  */
823
824 int tty_ldisc_init(struct tty_struct *tty)
825 {
826         struct tty_ldisc *ld = tty_ldisc_get(tty, N_TTY);
827         if (IS_ERR(ld))
828                 return PTR_ERR(ld);
829         tty->ldisc = ld;
830         return 0;
831 }
832
833 /**
834  *      tty_ldisc_deinit        -       ldisc cleanup for new tty
835  *      @tty: tty that was allocated recently
836  *
837  *      The tty structure must not becompletely set up (tty_ldisc_setup) when
838  *      this call is made.
839  */
840 void tty_ldisc_deinit(struct tty_struct *tty)
841 {
842         if (tty->ldisc)
843                 tty_ldisc_put(tty->ldisc);
844         tty->ldisc = NULL;
845 }