1#include <linux/types.h>
2#include <linux/errno.h>
3#include <linux/kmod.h>
4#include <linux/sched.h>
5#include <linux/interrupt.h>
6#include <linux/tty.h>
7#include <linux/tty_driver.h>
8#include <linux/file.h>
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>
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
24
25
26
27
28
29static DEFINE_SPINLOCK(tty_ldisc_lock);
30static DECLARE_WAIT_QUEUE_HEAD(tty_ldisc_wait);
31static DECLARE_WAIT_QUEUE_HEAD(tty_ldisc_idle);
32
33static struct tty_ldisc_ops *tty_ldiscs[NR_LDISCS];
34
35static inline struct tty_ldisc *get_ldisc(struct tty_ldisc *ld)
36{
37 if (ld)
38 atomic_inc(&ld->users);
39 return ld;
40}
41
42static void put_ldisc(struct tty_ldisc *ld)
43{
44 unsigned long flags;
45
46 if (WARN_ON_ONCE(!ld))
47 return;
48
49
50
51
52
53
54
55
56 local_irq_save(flags);
57 if (atomic_dec_and_lock(&ld->users, &tty_ldisc_lock)) {
58 struct tty_ldisc_ops *ldo = ld->ops;
59
60 ldo->refcount--;
61 module_put(ldo->owner);
62 spin_unlock_irqrestore(&tty_ldisc_lock, flags);
63
64 kfree(ld);
65 return;
66 }
67 local_irq_restore(flags);
68 wake_up(&tty_ldisc_idle);
69}
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84int tty_register_ldisc(int disc, struct tty_ldisc_ops *new_ldisc)
85{
86 unsigned long flags;
87 int ret = 0;
88
89 if (disc < N_TTY || disc >= NR_LDISCS)
90 return -EINVAL;
91
92 spin_lock_irqsave(&tty_ldisc_lock, flags);
93 tty_ldiscs[disc] = new_ldisc;
94 new_ldisc->num = disc;
95 new_ldisc->refcount = 0;
96 spin_unlock_irqrestore(&tty_ldisc_lock, flags);
97
98 return ret;
99}
100EXPORT_SYMBOL(tty_register_ldisc);
101
102
103
104
105
106
107
108
109
110
111
112
113
114int tty_unregister_ldisc(int disc)
115{
116 unsigned long flags;
117 int ret = 0;
118
119 if (disc < N_TTY || disc >= NR_LDISCS)
120 return -EINVAL;
121
122 spin_lock_irqsave(&tty_ldisc_lock, flags);
123 if (tty_ldiscs[disc]->refcount)
124 ret = -EBUSY;
125 else
126 tty_ldiscs[disc] = NULL;
127 spin_unlock_irqrestore(&tty_ldisc_lock, flags);
128
129 return ret;
130}
131EXPORT_SYMBOL(tty_unregister_ldisc);
132
133static struct tty_ldisc_ops *get_ldops(int disc)
134{
135 unsigned long flags;
136 struct tty_ldisc_ops *ldops, *ret;
137
138 spin_lock_irqsave(&tty_ldisc_lock, flags);
139 ret = ERR_PTR(-EINVAL);
140 ldops = tty_ldiscs[disc];
141 if (ldops) {
142 ret = ERR_PTR(-EAGAIN);
143 if (try_module_get(ldops->owner)) {
144 ldops->refcount++;
145 ret = ldops;
146 }
147 }
148 spin_unlock_irqrestore(&tty_ldisc_lock, flags);
149 return ret;
150}
151
152static void put_ldops(struct tty_ldisc_ops *ldops)
153{
154 unsigned long flags;
155
156 spin_lock_irqsave(&tty_ldisc_lock, flags);
157 ldops->refcount--;
158 module_put(ldops->owner);
159 spin_unlock_irqrestore(&tty_ldisc_lock, flags);
160}
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175static struct tty_ldisc *tty_ldisc_get(int disc)
176{
177 struct tty_ldisc *ld;
178 struct tty_ldisc_ops *ldops;
179
180 if (disc < N_TTY || disc >= NR_LDISCS)
181 return ERR_PTR(-EINVAL);
182
183
184
185
186
187 ldops = get_ldops(disc);
188 if (IS_ERR(ldops)) {
189 request_module("tty-ldisc-%d", disc);
190 ldops = get_ldops(disc);
191 if (IS_ERR(ldops))
192 return ERR_CAST(ldops);
193 }
194
195 ld = kmalloc(sizeof(struct tty_ldisc), GFP_KERNEL);
196 if (ld == NULL) {
197 put_ldops(ldops);
198 return ERR_PTR(-ENOMEM);
199 }
200
201 ld->ops = ldops;
202 atomic_set(&ld->users, 1);
203 return ld;
204}
205
206static void *tty_ldiscs_seq_start(struct seq_file *m, loff_t *pos)
207{
208 return (*pos < NR_LDISCS) ? pos : NULL;
209}
210
211static void *tty_ldiscs_seq_next(struct seq_file *m, void *v, loff_t *pos)
212{
213 (*pos)++;
214 return (*pos < NR_LDISCS) ? pos : NULL;
215}
216
217static void tty_ldiscs_seq_stop(struct seq_file *m, void *v)
218{
219}
220
221static int tty_ldiscs_seq_show(struct seq_file *m, void *v)
222{
223 int i = *(loff_t *)v;
224 struct tty_ldisc_ops *ldops;
225
226 ldops = get_ldops(i);
227 if (IS_ERR(ldops))
228 return 0;
229 seq_printf(m, "%-10s %2d\n", ldops->name ? ldops->name : "???", i);
230 put_ldops(ldops);
231 return 0;
232}
233
234static const struct seq_operations tty_ldiscs_seq_ops = {
235 .start = tty_ldiscs_seq_start,
236 .next = tty_ldiscs_seq_next,
237 .stop = tty_ldiscs_seq_stop,
238 .show = tty_ldiscs_seq_show,
239};
240
241static int proc_tty_ldiscs_open(struct inode *inode, struct file *file)
242{
243 return seq_open(file, &tty_ldiscs_seq_ops);
244}
245
246const struct file_operations tty_ldiscs_proc_fops = {
247 .owner = THIS_MODULE,
248 .open = proc_tty_ldiscs_open,
249 .read = seq_read,
250 .llseek = seq_lseek,
251 .release = seq_release,
252};
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267static void tty_ldisc_assign(struct tty_struct *tty, struct tty_ldisc *ld)
268{
269 tty->ldisc = ld;
270}
271
272
273
274
275
276
277
278
279
280
281
282
283
284static struct tty_ldisc *tty_ldisc_try(struct tty_struct *tty)
285{
286 unsigned long flags;
287 struct tty_ldisc *ld;
288
289 spin_lock_irqsave(&tty_ldisc_lock, flags);
290 ld = NULL;
291 if (test_bit(TTY_LDISC, &tty->flags))
292 ld = get_ldisc(tty->ldisc);
293 spin_unlock_irqrestore(&tty_ldisc_lock, flags);
294 return ld;
295}
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313struct tty_ldisc *tty_ldisc_ref_wait(struct tty_struct *tty)
314{
315 struct tty_ldisc *ld;
316
317
318 wait_event(tty_ldisc_wait, (ld = tty_ldisc_try(tty)) != NULL);
319 return ld;
320}
321EXPORT_SYMBOL_GPL(tty_ldisc_ref_wait);
322
323
324
325
326
327
328
329
330
331
332
333
334struct tty_ldisc *tty_ldisc_ref(struct tty_struct *tty)
335{
336 return tty_ldisc_try(tty);
337}
338EXPORT_SYMBOL_GPL(tty_ldisc_ref);
339
340
341
342
343
344
345
346
347
348
349
350void tty_ldisc_deref(struct tty_ldisc *ld)
351{
352 put_ldisc(ld);
353}
354EXPORT_SYMBOL_GPL(tty_ldisc_deref);
355
356static inline void tty_ldisc_put(struct tty_ldisc *ld)
357{
358 put_ldisc(ld);
359}
360
361
362
363
364
365
366
367
368
369
370
371
372
373void tty_ldisc_enable(struct tty_struct *tty)
374{
375 set_bit(TTY_LDISC, &tty->flags);
376 clear_bit(TTY_LDISC_CHANGING, &tty->flags);
377 wake_up(&tty_ldisc_wait);
378}
379
380
381
382
383
384
385
386
387
388void tty_ldisc_flush(struct tty_struct *tty)
389{
390 struct tty_ldisc *ld = tty_ldisc_ref(tty);
391 if (ld) {
392 if (ld->ops->flush_buffer)
393 ld->ops->flush_buffer(tty);
394 tty_ldisc_deref(ld);
395 }
396 tty_buffer_flush(tty);
397}
398EXPORT_SYMBOL_GPL(tty_ldisc_flush);
399
400
401
402
403
404
405
406
407
408
409
410
411
412static void tty_set_termios_ldisc(struct tty_struct *tty, int num)
413{
414 mutex_lock(&tty->termios_mutex);
415 tty->termios->c_line = num;
416 mutex_unlock(&tty->termios_mutex);
417}
418
419
420
421
422
423
424
425
426
427
428
429
430static int tty_ldisc_open(struct tty_struct *tty, struct tty_ldisc *ld)
431{
432 WARN_ON(test_and_set_bit(TTY_LDISC_OPEN, &tty->flags));
433 if (ld->ops->open) {
434 int ret;
435
436 ret = ld->ops->open(tty);
437 if (ret)
438 clear_bit(TTY_LDISC_OPEN, &tty->flags);
439 return ret;
440 }
441 return 0;
442}
443
444
445
446
447
448
449
450
451
452
453static void tty_ldisc_close(struct tty_struct *tty, struct tty_ldisc *ld)
454{
455 WARN_ON(!test_bit(TTY_LDISC_OPEN, &tty->flags));
456 clear_bit(TTY_LDISC_OPEN, &tty->flags);
457 if (ld->ops->close)
458 ld->ops->close(tty);
459}
460
461
462
463
464
465
466
467
468
469
470static void tty_ldisc_restore(struct tty_struct *tty, struct tty_ldisc *old)
471{
472 char buf[64];
473 struct tty_ldisc *new_ldisc;
474 int r;
475
476
477 old = tty_ldisc_get(old->ops->num);
478 WARN_ON(IS_ERR(old));
479 tty_ldisc_assign(tty, old);
480 tty_set_termios_ldisc(tty, old->ops->num);
481 if (tty_ldisc_open(tty, old) < 0) {
482 tty_ldisc_put(old);
483
484 new_ldisc = tty_ldisc_get(N_TTY);
485 if (IS_ERR(new_ldisc))
486 panic("n_tty: get");
487 tty_ldisc_assign(tty, new_ldisc);
488 tty_set_termios_ldisc(tty, N_TTY);
489 r = tty_ldisc_open(tty, new_ldisc);
490 if (r < 0)
491 panic("Couldn't open N_TTY ldisc for "
492 "%s --- error %d.",
493 tty_name(tty, buf), r);
494 }
495}
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511static int tty_ldisc_halt(struct tty_struct *tty)
512{
513 clear_bit(TTY_LDISC, &tty->flags);
514 return cancel_work_sync(&tty->buf.work);
515}
516
517
518
519
520
521
522
523static void tty_ldisc_flush_works(struct tty_struct *tty)
524{
525 flush_work_sync(&tty->hangup_work);
526 flush_work_sync(&tty->SAK_work);
527 flush_work_sync(&tty->buf.work);
528}
529
530
531
532
533
534
535
536
537
538static int tty_ldisc_wait_idle(struct tty_struct *tty, long timeout)
539{
540 long ret;
541 ret = wait_event_timeout(tty_ldisc_idle,
542 atomic_read(&tty->ldisc->users) == 1, timeout);
543 return ret > 0 ? 0 : -EBUSY;
544}
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559int tty_set_ldisc(struct tty_struct *tty, int ldisc)
560{
561 int retval;
562 struct tty_ldisc *o_ldisc, *new_ldisc;
563 int work, o_work = 0;
564 struct tty_struct *o_tty;
565
566 new_ldisc = tty_ldisc_get(ldisc);
567 if (IS_ERR(new_ldisc))
568 return PTR_ERR(new_ldisc);
569
570 tty_lock();
571
572
573
574
575
576 o_tty = tty->link;
577
578
579
580
581
582
583 if (tty->ldisc->ops->num == ldisc) {
584 tty_unlock();
585 tty_ldisc_put(new_ldisc);
586 return 0;
587 }
588
589 tty_unlock();
590
591
592
593
594
595 tty_wait_until_sent(tty, 0);
596
597 tty_lock();
598 mutex_lock(&tty->ldisc_mutex);
599
600
601
602
603
604
605 while (test_bit(TTY_LDISC_CHANGING, &tty->flags)) {
606 mutex_unlock(&tty->ldisc_mutex);
607 tty_unlock();
608 wait_event(tty_ldisc_wait,
609 test_bit(TTY_LDISC_CHANGING, &tty->flags) == 0);
610 tty_lock();
611 mutex_lock(&tty->ldisc_mutex);
612 }
613
614 set_bit(TTY_LDISC_CHANGING, &tty->flags);
615
616
617
618
619
620
621 tty->receive_room = 0;
622
623 o_ldisc = tty->ldisc;
624
625 tty_unlock();
626
627
628
629
630
631
632
633
634
635
636
637 work = tty_ldisc_halt(tty);
638 if (o_tty)
639 o_work = tty_ldisc_halt(o_tty);
640
641
642
643
644
645
646 mutex_unlock(&tty->ldisc_mutex);
647
648 tty_ldisc_flush_works(tty);
649
650 retval = tty_ldisc_wait_idle(tty, 5 * HZ);
651
652 tty_lock();
653 mutex_lock(&tty->ldisc_mutex);
654
655
656 if (retval) {
657 tty_ldisc_put(new_ldisc);
658 goto enable;
659 }
660
661 if (test_bit(TTY_HUPPED, &tty->flags)) {
662
663
664 clear_bit(TTY_LDISC_CHANGING, &tty->flags);
665 mutex_unlock(&tty->ldisc_mutex);
666 tty_ldisc_put(new_ldisc);
667 tty_unlock();
668 return -EIO;
669 }
670
671
672 tty_ldisc_close(tty, o_ldisc);
673
674
675 tty_ldisc_assign(tty, new_ldisc);
676 tty_set_termios_ldisc(tty, ldisc);
677
678 retval = tty_ldisc_open(tty, new_ldisc);
679 if (retval < 0) {
680
681 tty_ldisc_put(new_ldisc);
682 tty_ldisc_restore(tty, o_ldisc);
683 }
684
685
686
687
688
689 if (tty->ldisc->ops->num != o_ldisc->ops->num && tty->ops->set_ldisc)
690 tty->ops->set_ldisc(tty);
691
692 tty_ldisc_put(o_ldisc);
693
694enable:
695
696
697
698
699 tty_ldisc_enable(tty);
700 if (o_tty)
701 tty_ldisc_enable(o_tty);
702
703
704
705 if (work)
706 schedule_work(&tty->buf.work);
707 if (o_work)
708 schedule_work(&o_tty->buf.work);
709 mutex_unlock(&tty->ldisc_mutex);
710 tty_unlock();
711 return retval;
712}
713
714
715
716
717
718
719
720
721static void tty_reset_termios(struct tty_struct *tty)
722{
723 mutex_lock(&tty->termios_mutex);
724 *tty->termios = tty->driver->init_termios;
725 tty->termios->c_ispeed = tty_termios_input_baud_rate(tty->termios);
726 tty->termios->c_ospeed = tty_termios_baud_rate(tty->termios);
727 mutex_unlock(&tty->termios_mutex);
728}
729
730
731
732
733
734
735
736
737
738
739
740static int tty_ldisc_reinit(struct tty_struct *tty, int ldisc)
741{
742 struct tty_ldisc *ld = tty_ldisc_get(ldisc);
743
744 if (IS_ERR(ld))
745 return -1;
746
747 tty_ldisc_close(tty, tty->ldisc);
748 tty_ldisc_put(tty->ldisc);
749 tty->ldisc = NULL;
750
751
752
753 tty_ldisc_assign(tty, ld);
754 tty_set_termios_ldisc(tty, ldisc);
755
756 return 0;
757}
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774void tty_ldisc_hangup(struct tty_struct *tty)
775{
776 struct tty_ldisc *ld;
777 int reset = tty->driver->flags & TTY_DRIVER_RESET_TERMIOS;
778 int err = 0;
779
780
781
782
783
784
785 ld = tty_ldisc_ref(tty);
786 if (ld != NULL) {
787
788 if (ld->ops->flush_buffer)
789 ld->ops->flush_buffer(tty);
790 tty_driver_flush_buffer(tty);
791 if ((test_bit(TTY_DO_WRITE_WAKEUP, &tty->flags)) &&
792 ld->ops->write_wakeup)
793 ld->ops->write_wakeup(tty);
794 if (ld->ops->hangup)
795 ld->ops->hangup(tty);
796 tty_ldisc_deref(ld);
797 }
798
799
800
801
802 wake_up_interruptible_poll(&tty->write_wait, POLLOUT);
803 wake_up_interruptible_poll(&tty->read_wait, POLLIN);
804
805
806
807
808
809
810 mutex_lock(&tty->ldisc_mutex);
811
812
813
814
815
816
817 clear_bit(TTY_LDISC, &tty->flags);
818 tty_unlock();
819 cancel_work_sync(&tty->buf.work);
820 mutex_unlock(&tty->ldisc_mutex);
821retry:
822 tty_lock();
823 mutex_lock(&tty->ldisc_mutex);
824
825
826
827
828
829 if (tty->ldisc) {
830 if (atomic_read(&tty->ldisc->users) != 1) {
831 char cur_n[TASK_COMM_LEN], tty_n[64];
832 long timeout = 3 * HZ;
833 tty_unlock();
834
835 while (tty_ldisc_wait_idle(tty, timeout) == -EBUSY) {
836 timeout = MAX_SCHEDULE_TIMEOUT;
837 printk_ratelimited(KERN_WARNING
838 "%s: waiting (%s) for %s took too long, but we keep waiting...\n",
839 __func__, get_task_comm(cur_n, current),
840 tty_name(tty, tty_n));
841 }
842 mutex_unlock(&tty->ldisc_mutex);
843 goto retry;
844 }
845
846 if (reset == 0) {
847
848 if (!tty_ldisc_reinit(tty, tty->termios->c_line))
849 err = tty_ldisc_open(tty, tty->ldisc);
850 else
851 err = 1;
852 }
853
854
855 if (reset || err) {
856 BUG_ON(tty_ldisc_reinit(tty, N_TTY));
857 WARN_ON(tty_ldisc_open(tty, tty->ldisc));
858 }
859 tty_ldisc_enable(tty);
860 }
861 mutex_unlock(&tty->ldisc_mutex);
862 if (reset)
863 tty_reset_termios(tty);
864}
865
866
867
868
869
870
871
872
873
874
875
876int tty_ldisc_setup(struct tty_struct *tty, struct tty_struct *o_tty)
877{
878 struct tty_ldisc *ld = tty->ldisc;
879 int retval;
880
881 retval = tty_ldisc_open(tty, ld);
882 if (retval)
883 return retval;
884
885 if (o_tty) {
886 retval = tty_ldisc_open(o_tty, o_tty->ldisc);
887 if (retval) {
888 tty_ldisc_close(tty, ld);
889 return retval;
890 }
891 tty_ldisc_enable(o_tty);
892 }
893 tty_ldisc_enable(tty);
894 return 0;
895}
896
897
898
899
900
901
902
903
904
905
906void tty_ldisc_release(struct tty_struct *tty, struct tty_struct *o_tty)
907{
908
909
910
911
912
913
914 tty_unlock();
915 tty_ldisc_halt(tty);
916 tty_ldisc_flush_works(tty);
917 tty_lock();
918
919 mutex_lock(&tty->ldisc_mutex);
920
921
922
923 tty_ldisc_close(tty, tty->ldisc);
924 tty_ldisc_put(tty->ldisc);
925
926 tty->ldisc = NULL;
927
928
929 tty_set_termios_ldisc(tty, N_TTY);
930 mutex_unlock(&tty->ldisc_mutex);
931
932
933 if (o_tty)
934 tty_ldisc_release(o_tty, NULL);
935
936
937
938}
939
940
941
942
943
944
945
946
947
948void tty_ldisc_init(struct tty_struct *tty)
949{
950 struct tty_ldisc *ld = tty_ldisc_get(N_TTY);
951 if (IS_ERR(ld))
952 panic("n_tty: init_tty");
953 tty_ldisc_assign(tty, ld);
954}
955
956
957
958
959
960
961
962
963void tty_ldisc_deinit(struct tty_struct *tty)
964{
965 put_ldisc(tty->ldisc);
966 tty_ldisc_assign(tty, NULL);
967}
968
969void tty_ldisc_begin(void)
970{
971
972 (void) tty_register_ldisc(N_TTY, &tty_ldisc_N_TTY);
973}
974