This source file includes following definitions.
- tty_register_ldisc
- tty_unregister_ldisc
- get_ldops
- put_ldops
- tty_ldisc_get
- tty_ldisc_put
- tty_ldiscs_seq_start
- tty_ldiscs_seq_next
- tty_ldiscs_seq_stop
- tty_ldiscs_seq_show
- tty_ldisc_ref_wait
- tty_ldisc_ref
- tty_ldisc_deref
- __tty_ldisc_lock
- __tty_ldisc_lock_nested
- __tty_ldisc_unlock
- tty_ldisc_lock
- tty_ldisc_unlock
- tty_ldisc_lock_pair_timeout
- tty_ldisc_lock_pair
- tty_ldisc_unlock_pair
- tty_ldisc_flush
- tty_set_termios_ldisc
- tty_ldisc_open
- tty_ldisc_close
- tty_ldisc_failto
- tty_ldisc_restore
- tty_set_ldisc
- tty_ldisc_kill
- tty_reset_termios
- tty_ldisc_reinit
- tty_ldisc_hangup
- tty_ldisc_setup
- tty_ldisc_release
- tty_ldisc_init
- tty_ldisc_deinit
- tty_sysctl_init
1
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
32 enum {
33 LDISC_SEM_NORMAL,
34 LDISC_SEM_OTHER,
35 };
36
37
38
39
40
41
42
43
44 static DEFINE_RAW_SPINLOCK(tty_ldiscs_lock);
45
46 static struct tty_ldisc_ops *tty_ldiscs[NR_LDISCS];
47
48
49
50
51
52
53
54
55
56
57
58
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
81
82
83
84
85
86
87
88
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
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159 #if defined(CONFIG_LDISC_AUTOLOAD)
160 #define INITIAL_AUTOLOAD_STATE 1
161 #else
162 #define INITIAL_AUTOLOAD_STATE 0
163 #endif
164 static int tty_ldisc_autoload = INITIAL_AUTOLOAD_STATE;
165
166 static struct tty_ldisc *tty_ldisc_get(struct tty_struct *tty, int disc)
167 {
168 struct tty_ldisc *ld;
169 struct tty_ldisc_ops *ldops;
170
171 if (disc < N_TTY || disc >= NR_LDISCS)
172 return ERR_PTR(-EINVAL);
173
174
175
176
177
178 ldops = get_ldops(disc);
179 if (IS_ERR(ldops)) {
180 if (!capable(CAP_SYS_MODULE) && !tty_ldisc_autoload)
181 return ERR_PTR(-EPERM);
182 request_module("tty-ldisc-%d", disc);
183 ldops = get_ldops(disc);
184 if (IS_ERR(ldops))
185 return ERR_CAST(ldops);
186 }
187
188
189
190
191
192 ld = kmalloc(sizeof(struct tty_ldisc), GFP_KERNEL | __GFP_NOFAIL);
193 ld->ops = ldops;
194 ld->tty = tty;
195
196 return ld;
197 }
198
199
200
201
202
203
204 static void tty_ldisc_put(struct tty_ldisc *ld)
205 {
206 if (WARN_ON_ONCE(!ld))
207 return;
208
209 put_ldops(ld->ops);
210 kfree(ld);
211 }
212
213 static void *tty_ldiscs_seq_start(struct seq_file *m, loff_t *pos)
214 {
215 return (*pos < NR_LDISCS) ? pos : NULL;
216 }
217
218 static void *tty_ldiscs_seq_next(struct seq_file *m, void *v, loff_t *pos)
219 {
220 (*pos)++;
221 return (*pos < NR_LDISCS) ? pos : NULL;
222 }
223
224 static void tty_ldiscs_seq_stop(struct seq_file *m, void *v)
225 {
226 }
227
228 static int tty_ldiscs_seq_show(struct seq_file *m, void *v)
229 {
230 int i = *(loff_t *)v;
231 struct tty_ldisc_ops *ldops;
232
233 ldops = get_ldops(i);
234 if (IS_ERR(ldops))
235 return 0;
236 seq_printf(m, "%-10s %2d\n", ldops->name ? ldops->name : "???", i);
237 put_ldops(ldops);
238 return 0;
239 }
240
241 const struct seq_operations tty_ldiscs_seq_ops = {
242 .start = tty_ldiscs_seq_start,
243 .next = tty_ldiscs_seq_next,
244 .stop = tty_ldiscs_seq_stop,
245 .show = tty_ldiscs_seq_show,
246 };
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268 struct tty_ldisc *tty_ldisc_ref_wait(struct tty_struct *tty)
269 {
270 struct tty_ldisc *ld;
271
272 ldsem_down_read(&tty->ldisc_sem, MAX_SCHEDULE_TIMEOUT);
273 ld = tty->ldisc;
274 if (!ld)
275 ldsem_up_read(&tty->ldisc_sem);
276 return ld;
277 }
278 EXPORT_SYMBOL_GPL(tty_ldisc_ref_wait);
279
280
281
282
283
284
285
286
287
288
289 struct tty_ldisc *tty_ldisc_ref(struct tty_struct *tty)
290 {
291 struct tty_ldisc *ld = NULL;
292
293 if (ldsem_down_read_trylock(&tty->ldisc_sem)) {
294 ld = tty->ldisc;
295 if (!ld)
296 ldsem_up_read(&tty->ldisc_sem);
297 }
298 return ld;
299 }
300 EXPORT_SYMBOL_GPL(tty_ldisc_ref);
301
302
303
304
305
306
307
308
309
310 void tty_ldisc_deref(struct tty_ldisc *ld)
311 {
312 ldsem_up_read(&ld->tty->ldisc_sem);
313 }
314 EXPORT_SYMBOL_GPL(tty_ldisc_deref);
315
316
317 static inline int
318 __tty_ldisc_lock(struct tty_struct *tty, unsigned long timeout)
319 {
320 return ldsem_down_write(&tty->ldisc_sem, timeout);
321 }
322
323 static inline int
324 __tty_ldisc_lock_nested(struct tty_struct *tty, unsigned long timeout)
325 {
326 return ldsem_down_write_nested(&tty->ldisc_sem,
327 LDISC_SEM_OTHER, timeout);
328 }
329
330 static inline void __tty_ldisc_unlock(struct tty_struct *tty)
331 {
332 ldsem_up_write(&tty->ldisc_sem);
333 }
334
335 int tty_ldisc_lock(struct tty_struct *tty, unsigned long timeout)
336 {
337 int ret;
338
339
340 set_bit(TTY_LDISC_CHANGING, &tty->flags);
341 wake_up_interruptible_all(&tty->read_wait);
342 wake_up_interruptible_all(&tty->write_wait);
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
355 clear_bit(TTY_LDISC_CHANGING, &tty->flags);
356 __tty_ldisc_unlock(tty);
357 }
358
359 static int
360 tty_ldisc_lock_pair_timeout(struct tty_struct *tty, struct tty_struct *tty2,
361 unsigned long timeout)
362 {
363 int ret;
364
365 if (tty < tty2) {
366 ret = __tty_ldisc_lock(tty, timeout);
367 if (ret) {
368 ret = __tty_ldisc_lock_nested(tty2, timeout);
369 if (!ret)
370 __tty_ldisc_unlock(tty);
371 }
372 } else {
373
374 WARN_ON_ONCE(tty == tty2);
375 if (tty2 && tty != tty2) {
376 ret = __tty_ldisc_lock(tty2, timeout);
377 if (ret) {
378 ret = __tty_ldisc_lock_nested(tty, timeout);
379 if (!ret)
380 __tty_ldisc_unlock(tty2);
381 }
382 } else
383 ret = __tty_ldisc_lock(tty, timeout);
384 }
385
386 if (!ret)
387 return -EBUSY;
388
389 set_bit(TTY_LDISC_HALTED, &tty->flags);
390 if (tty2)
391 set_bit(TTY_LDISC_HALTED, &tty2->flags);
392 return 0;
393 }
394
395 static void tty_ldisc_lock_pair(struct tty_struct *tty, struct tty_struct *tty2)
396 {
397 tty_ldisc_lock_pair_timeout(tty, tty2, MAX_SCHEDULE_TIMEOUT);
398 }
399
400 static void tty_ldisc_unlock_pair(struct tty_struct *tty,
401 struct tty_struct *tty2)
402 {
403 __tty_ldisc_unlock(tty);
404 if (tty2)
405 __tty_ldisc_unlock(tty2);
406 }
407
408
409
410
411
412
413
414
415
416 void tty_ldisc_flush(struct tty_struct *tty)
417 {
418 struct tty_ldisc *ld = tty_ldisc_ref(tty);
419
420 tty_buffer_flush(tty, ld);
421 if (ld)
422 tty_ldisc_deref(ld);
423 }
424 EXPORT_SYMBOL_GPL(tty_ldisc_flush);
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442 static void tty_set_termios_ldisc(struct tty_struct *tty, int disc)
443 {
444 down_write(&tty->termios_rwsem);
445 tty->termios.c_line = disc;
446 up_write(&tty->termios_rwsem);
447
448 tty->disc_data = NULL;
449 tty->receive_room = 0;
450 }
451
452
453
454
455
456
457
458
459
460
461
462
463 static int tty_ldisc_open(struct tty_struct *tty, struct tty_ldisc *ld)
464 {
465 WARN_ON(test_and_set_bit(TTY_LDISC_OPEN, &tty->flags));
466 if (ld->ops->open) {
467 int ret;
468
469 ret = ld->ops->open(tty);
470 if (ret)
471 clear_bit(TTY_LDISC_OPEN, &tty->flags);
472
473 tty_ldisc_debug(tty, "%p: opened\n", ld);
474 return ret;
475 }
476 return 0;
477 }
478
479
480
481
482
483
484
485
486
487
488 static void tty_ldisc_close(struct tty_struct *tty, struct tty_ldisc *ld)
489 {
490 lockdep_assert_held_write(&tty->ldisc_sem);
491 WARN_ON(!test_bit(TTY_LDISC_OPEN, &tty->flags));
492 clear_bit(TTY_LDISC_OPEN, &tty->flags);
493 if (ld->ops->close)
494 ld->ops->close(tty);
495 tty_ldisc_debug(tty, "%p: closed\n", ld);
496 }
497
498
499
500
501
502
503
504
505
506
507 static int tty_ldisc_failto(struct tty_struct *tty, int ld)
508 {
509 struct tty_ldisc *disc = tty_ldisc_get(tty, ld);
510 int r;
511
512 lockdep_assert_held_write(&tty->ldisc_sem);
513 if (IS_ERR(disc))
514 return PTR_ERR(disc);
515 tty->ldisc = disc;
516 tty_set_termios_ldisc(tty, ld);
517 if ((r = tty_ldisc_open(tty, disc)) < 0)
518 tty_ldisc_put(disc);
519 return r;
520 }
521
522
523
524
525
526
527
528
529
530
531 static void tty_ldisc_restore(struct tty_struct *tty, struct tty_ldisc *old)
532 {
533
534 if (tty_ldisc_failto(tty, old->ops->num) < 0) {
535 const char *name = tty_name(tty);
536
537 pr_warn("Falling back ldisc for %s.\n", name);
538
539
540
541 if (tty_ldisc_failto(tty, N_TTY) < 0 &&
542 tty_ldisc_failto(tty, N_NULL) < 0)
543 panic("Couldn't open N_NULL ldisc for %s.", name);
544 }
545 }
546
547
548
549
550
551
552
553
554
555
556
557
558 int tty_set_ldisc(struct tty_struct *tty, int disc)
559 {
560 int retval;
561 struct tty_ldisc *old_ldisc, *new_ldisc;
562
563 new_ldisc = tty_ldisc_get(tty, disc);
564 if (IS_ERR(new_ldisc))
565 return PTR_ERR(new_ldisc);
566
567 tty_lock(tty);
568 retval = tty_ldisc_lock(tty, 5 * HZ);
569 if (retval)
570 goto err;
571
572 if (!tty->ldisc) {
573 retval = -EIO;
574 goto out;
575 }
576
577
578 if (tty->ldisc->ops->num == disc)
579 goto out;
580
581 if (test_bit(TTY_HUPPED, &tty->flags)) {
582
583 retval = -EIO;
584 goto out;
585 }
586
587 old_ldisc = tty->ldisc;
588
589
590 tty_ldisc_close(tty, old_ldisc);
591
592
593 tty->ldisc = new_ldisc;
594 tty_set_termios_ldisc(tty, disc);
595
596 retval = tty_ldisc_open(tty, new_ldisc);
597 if (retval < 0) {
598
599 tty_ldisc_put(new_ldisc);
600 tty_ldisc_restore(tty, old_ldisc);
601 }
602
603 if (tty->ldisc->ops->num != old_ldisc->ops->num && tty->ops->set_ldisc) {
604 down_read(&tty->termios_rwsem);
605 tty->ops->set_ldisc(tty);
606 up_read(&tty->termios_rwsem);
607 }
608
609
610
611
612
613
614 new_ldisc = old_ldisc;
615 out:
616 tty_ldisc_unlock(tty);
617
618
619
620 tty_buffer_restart_work(tty->port);
621 err:
622 tty_ldisc_put(new_ldisc);
623 tty_unlock(tty);
624 return retval;
625 }
626 EXPORT_SYMBOL_GPL(tty_set_ldisc);
627
628
629
630
631
632
633
634 static void tty_ldisc_kill(struct tty_struct *tty)
635 {
636 lockdep_assert_held_write(&tty->ldisc_sem);
637 if (!tty->ldisc)
638 return;
639
640
641
642 tty_ldisc_close(tty, tty->ldisc);
643 tty_ldisc_put(tty->ldisc);
644
645 tty->ldisc = NULL;
646 }
647
648
649
650
651
652
653
654
655 static void tty_reset_termios(struct tty_struct *tty)
656 {
657 down_write(&tty->termios_rwsem);
658 tty->termios = tty->driver->init_termios;
659 tty->termios.c_ispeed = tty_termios_input_baud_rate(&tty->termios);
660 tty->termios.c_ospeed = tty_termios_baud_rate(&tty->termios);
661 up_write(&tty->termios_rwsem);
662 }
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679 int tty_ldisc_reinit(struct tty_struct *tty, int disc)
680 {
681 struct tty_ldisc *ld;
682 int retval;
683
684 lockdep_assert_held_write(&tty->ldisc_sem);
685 ld = tty_ldisc_get(tty, disc);
686 if (IS_ERR(ld)) {
687 BUG_ON(disc == N_TTY);
688 return PTR_ERR(ld);
689 }
690
691 if (tty->ldisc) {
692 tty_ldisc_close(tty, tty->ldisc);
693 tty_ldisc_put(tty->ldisc);
694 }
695
696
697 tty->ldisc = ld;
698 tty_set_termios_ldisc(tty, disc);
699 retval = tty_ldisc_open(tty, tty->ldisc);
700 if (retval) {
701 tty_ldisc_put(tty->ldisc);
702 tty->ldisc = NULL;
703 }
704 return retval;
705 }
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722 void tty_ldisc_hangup(struct tty_struct *tty, bool reinit)
723 {
724 struct tty_ldisc *ld;
725
726 tty_ldisc_debug(tty, "%p: hangup\n", tty->ldisc);
727
728 ld = tty_ldisc_ref(tty);
729 if (ld != NULL) {
730 if (ld->ops->flush_buffer)
731 ld->ops->flush_buffer(tty);
732 tty_driver_flush_buffer(tty);
733 if ((test_bit(TTY_DO_WRITE_WAKEUP, &tty->flags)) &&
734 ld->ops->write_wakeup)
735 ld->ops->write_wakeup(tty);
736 if (ld->ops->hangup)
737 ld->ops->hangup(tty);
738 tty_ldisc_deref(ld);
739 }
740
741 wake_up_interruptible_poll(&tty->write_wait, EPOLLOUT);
742 wake_up_interruptible_poll(&tty->read_wait, EPOLLIN);
743
744
745
746
747
748
749
750 tty_ldisc_lock(tty, MAX_SCHEDULE_TIMEOUT);
751
752 if (tty->driver->flags & TTY_DRIVER_RESET_TERMIOS)
753 tty_reset_termios(tty);
754
755 if (tty->ldisc) {
756 if (reinit) {
757 if (tty_ldisc_reinit(tty, tty->termios.c_line) < 0 &&
758 tty_ldisc_reinit(tty, N_TTY) < 0)
759 WARN_ON(tty_ldisc_reinit(tty, N_NULL) < 0);
760 } else
761 tty_ldisc_kill(tty);
762 }
763 tty_ldisc_unlock(tty);
764 }
765
766
767
768
769
770
771
772
773
774
775
776 int tty_ldisc_setup(struct tty_struct *tty, struct tty_struct *o_tty)
777 {
778 int retval = tty_ldisc_open(tty, tty->ldisc);
779 if (retval)
780 return retval;
781
782 if (o_tty) {
783
784
785
786
787 retval = tty_ldisc_open(o_tty, o_tty->ldisc);
788 if (retval) {
789 tty_ldisc_close(tty, tty->ldisc);
790 return retval;
791 }
792 }
793 return 0;
794 }
795
796
797
798
799
800
801
802
803
804 void tty_ldisc_release(struct tty_struct *tty)
805 {
806 struct tty_struct *o_tty = tty->link;
807
808
809
810
811
812
813 tty_ldisc_lock_pair(tty, o_tty);
814 tty_ldisc_kill(tty);
815 if (o_tty)
816 tty_ldisc_kill(o_tty);
817 tty_ldisc_unlock_pair(tty, o_tty);
818
819
820
821
822 tty_ldisc_debug(tty, "released\n");
823 }
824 EXPORT_SYMBOL_GPL(tty_ldisc_release);
825
826
827
828
829
830
831
832
833
834 int tty_ldisc_init(struct tty_struct *tty)
835 {
836 struct tty_ldisc *ld = tty_ldisc_get(tty, N_TTY);
837 if (IS_ERR(ld))
838 return PTR_ERR(ld);
839 tty->ldisc = ld;
840 return 0;
841 }
842
843
844
845
846
847
848
849
850 void tty_ldisc_deinit(struct tty_struct *tty)
851 {
852
853 if (tty->ldisc)
854 tty_ldisc_put(tty->ldisc);
855 tty->ldisc = NULL;
856 }
857
858 static struct ctl_table tty_table[] = {
859 {
860 .procname = "ldisc_autoload",
861 .data = &tty_ldisc_autoload,
862 .maxlen = sizeof(tty_ldisc_autoload),
863 .mode = 0644,
864 .proc_handler = proc_dointvec,
865 .extra1 = SYSCTL_ZERO,
866 .extra2 = SYSCTL_ONE,
867 },
868 { }
869 };
870
871 static struct ctl_table tty_dir_table[] = {
872 {
873 .procname = "tty",
874 .mode = 0555,
875 .child = tty_table,
876 },
877 { }
878 };
879
880 static struct ctl_table tty_root_table[] = {
881 {
882 .procname = "dev",
883 .mode = 0555,
884 .child = tty_dir_table,
885 },
886 { }
887 };
888
889 void tty_sysctl_init(void)
890 {
891 register_sysctl_table(tty_root_table);
892 }