tty-ldisc: make refcount be atomic_t 'users' count
[safe/jmp/linux-2.6] / drivers / char / tty_ldisc.c
1 #include <linux/types.h>
2 #include <linux/major.h>
3 #include <linux/errno.h>
4 #include <linux/signal.h>
5 #include <linux/fcntl.h>
6 #include <linux/sched.h>
7 #include <linux/interrupt.h>
8 #include <linux/tty.h>
9 #include <linux/tty_driver.h>
10 #include <linux/tty_flip.h>
11 #include <linux/devpts_fs.h>
12 #include <linux/file.h>
13 #include <linux/console.h>
14 #include <linux/timer.h>
15 #include <linux/ctype.h>
16 #include <linux/kd.h>
17 #include <linux/mm.h>
18 #include <linux/string.h>
19 #include <linux/slab.h>
20 #include <linux/poll.h>
21 #include <linux/proc_fs.h>
22 #include <linux/init.h>
23 #include <linux/module.h>
24 #include <linux/device.h>
25 #include <linux/wait.h>
26 #include <linux/bitops.h>
27 #include <linux/delay.h>
28 #include <linux/seq_file.h>
29
30 #include <linux/uaccess.h>
31 #include <asm/system.h>
32
33 #include <linux/kbd_kern.h>
34 #include <linux/vt_kern.h>
35 #include <linux/selection.h>
36
37 #include <linux/kmod.h>
38 #include <linux/nsproxy.h>
39
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
46 static DEFINE_SPINLOCK(tty_ldisc_lock);
47 static DECLARE_WAIT_QUEUE_HEAD(tty_ldisc_wait);
48 /* Line disc dispatch table */
49 static 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:
61  *              takes tty_ldisc_lock to guard against ldisc races
62  */
63
64 int 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
72         spin_lock_irqsave(&tty_ldisc_lock, flags);
73         tty_ldiscs[disc] = new_ldisc;
74         new_ldisc->num = disc;
75         new_ldisc->refcount = 0;
76         spin_unlock_irqrestore(&tty_ldisc_lock, flags);
77
78         return ret;
79 }
80 EXPORT_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:
91  *              takes tty_ldisc_lock to guard against ldisc races
92  */
93
94 int 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
102         spin_lock_irqsave(&tty_ldisc_lock, flags);
103         if (tty_ldiscs[disc]->refcount)
104                 ret = -EBUSY;
105         else
106                 tty_ldiscs[disc] = NULL;
107         spin_unlock_irqrestore(&tty_ldisc_lock, flags);
108
109         return ret;
110 }
111 EXPORT_SYMBOL(tty_unregister_ldisc);
112
113
114 /**
115  *      tty_ldisc_try_get       -       try and reference an ldisc
116  *      @disc: ldisc number
117  *
118  *      Attempt to open and lock a line discipline into place. Return
119  *      the line discipline refcounted or an error.
120  */
121
122 static struct tty_ldisc *tty_ldisc_try_get(int disc)
123 {
124         unsigned long flags;
125         struct tty_ldisc *ld;
126         struct tty_ldisc_ops *ldops;
127         int err = -EINVAL;
128
129         ld = kmalloc(sizeof(struct tty_ldisc), GFP_KERNEL);
130         if (ld == NULL)
131                 return ERR_PTR(-ENOMEM);
132
133         spin_lock_irqsave(&tty_ldisc_lock, flags);
134         ld->ops = NULL;
135         ldops = tty_ldiscs[disc];
136         /* Check the entry is defined */
137         if (ldops) {
138                 /* If the module is being unloaded we can't use it */
139                 if (!try_module_get(ldops->owner))
140                         err = -EAGAIN;
141                 else {
142                         /* lock it */
143                         ldops->refcount++;
144                         ld->ops = ldops;
145                         atomic_set(&ld->users, 0);
146                         err = 0;
147                 }
148         }
149         spin_unlock_irqrestore(&tty_ldisc_lock, flags);
150         if (err) {
151                 kfree(ld);
152                 return ERR_PTR(err);
153         }
154         return ld;
155 }
156
157 /**
158  *      tty_ldisc_get           -       take a reference to an ldisc
159  *      @disc: ldisc number
160  *
161  *      Takes a reference to a line discipline. Deals with refcounts and
162  *      module locking counts. Returns NULL if the discipline is not available.
163  *      Returns a pointer to the discipline and bumps the ref count if it is
164  *      available
165  *
166  *      Locking:
167  *              takes tty_ldisc_lock to guard against ldisc races
168  */
169
170 static struct tty_ldisc *tty_ldisc_get(int disc)
171 {
172         struct tty_ldisc *ld;
173
174         if (disc < N_TTY || disc >= NR_LDISCS)
175                 return ERR_PTR(-EINVAL);
176         ld = tty_ldisc_try_get(disc);
177         if (IS_ERR(ld)) {
178                 request_module("tty-ldisc-%d", disc);
179                 ld = tty_ldisc_try_get(disc);
180         }
181         return ld;
182 }
183
184 /**
185  *      tty_ldisc_put           -       drop ldisc reference
186  *      @ld: ldisc
187  *
188  *      Drop a reference to a line discipline. Manage refcounts and
189  *      module usage counts. Free the ldisc once the recount hits zero.
190  *
191  *      Locking:
192  *              takes tty_ldisc_lock to guard against ldisc races
193  */
194
195 static void tty_ldisc_put(struct tty_ldisc *ld)
196 {
197         unsigned long flags;
198         int disc = ld->ops->num;
199         struct tty_ldisc_ops *ldo;
200
201         BUG_ON(disc < N_TTY || disc >= NR_LDISCS);
202
203         spin_lock_irqsave(&tty_ldisc_lock, flags);
204         ldo = tty_ldiscs[disc];
205         BUG_ON(ldo->refcount == 0);
206         ldo->refcount--;
207         module_put(ldo->owner);
208         spin_unlock_irqrestore(&tty_ldisc_lock, flags);
209         WARN_ON(atomic_read(&ld->users));
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 *ld;
232
233         ld = tty_ldisc_try_get(i);
234         if (IS_ERR(ld))
235                 return 0;
236         seq_printf(m, "%-10s %2d\n", ld->ops->name ? ld->ops->name : "???", i);
237         tty_ldisc_put(ld);
238         return 0;
239 }
240
241 static 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 static int proc_tty_ldiscs_open(struct inode *inode, struct file *file)
249 {
250         return seq_open(file, &tty_ldiscs_seq_ops);
251 }
252
253 const struct file_operations tty_ldiscs_proc_fops = {
254         .owner          = THIS_MODULE,
255         .open           = proc_tty_ldiscs_open,
256         .read           = seq_read,
257         .llseek         = seq_lseek,
258         .release        = seq_release,
259 };
260
261 /**
262  *      tty_ldisc_assign        -       set ldisc on a tty
263  *      @tty: tty to assign
264  *      @ld: line discipline
265  *
266  *      Install an instance of a line discipline into a tty structure. The
267  *      ldisc must have a reference count above zero to ensure it remains.
268  *      The tty instance refcount starts at zero.
269  *
270  *      Locking:
271  *              Caller must hold references
272  */
273
274 static void tty_ldisc_assign(struct tty_struct *tty, struct tty_ldisc *ld)
275 {
276         tty->ldisc = ld;
277 }
278
279 /**
280  *      tty_ldisc_try           -       internal helper
281  *      @tty: the tty
282  *
283  *      Make a single attempt to grab and bump the refcount on
284  *      the tty ldisc. Return 0 on failure or 1 on success. This is
285  *      used to implement both the waiting and non waiting versions
286  *      of tty_ldisc_ref
287  *
288  *      Locking: takes tty_ldisc_lock
289  */
290
291 static int tty_ldisc_try(struct tty_struct *tty)
292 {
293         unsigned long flags;
294         struct tty_ldisc *ld;
295         int ret = 0;
296
297         spin_lock_irqsave(&tty_ldisc_lock, flags);
298         ld = tty->ldisc;
299         if (test_bit(TTY_LDISC, &tty->flags)) {
300                 atomic_inc(&ld->users);
301                 ret = 1;
302         }
303         spin_unlock_irqrestore(&tty_ldisc_lock, flags);
304         return ret;
305 }
306
307 /**
308  *      tty_ldisc_ref_wait      -       wait for the tty ldisc
309  *      @tty: tty device
310  *
311  *      Dereference the line discipline for the terminal and take a
312  *      reference to it. If the line discipline is in flux then
313  *      wait patiently until it changes.
314  *
315  *      Note: Must not be called from an IRQ/timer context. The caller
316  *      must also be careful not to hold other locks that will deadlock
317  *      against a discipline change, such as an existing ldisc reference
318  *      (which we check for)
319  *
320  *      Locking: call functions take tty_ldisc_lock
321  */
322
323 struct tty_ldisc *tty_ldisc_ref_wait(struct tty_struct *tty)
324 {
325         /* wait_event is a macro */
326         wait_event(tty_ldisc_wait, tty_ldisc_try(tty));
327         WARN_ON(atomic_read(&tty->ldisc->users) == 0);
328         return tty->ldisc;
329 }
330 EXPORT_SYMBOL_GPL(tty_ldisc_ref_wait);
331
332 /**
333  *      tty_ldisc_ref           -       get the tty ldisc
334  *      @tty: tty device
335  *
336  *      Dereference the line discipline for the terminal and take a
337  *      reference to it. If the line discipline is in flux then
338  *      return NULL. Can be called from IRQ and timer functions.
339  *
340  *      Locking: called functions take tty_ldisc_lock
341  */
342
343 struct tty_ldisc *tty_ldisc_ref(struct tty_struct *tty)
344 {
345         if (tty_ldisc_try(tty))
346                 return tty->ldisc;
347         return NULL;
348 }
349 EXPORT_SYMBOL_GPL(tty_ldisc_ref);
350
351 /**
352  *      tty_ldisc_deref         -       free a tty ldisc reference
353  *      @ld: reference to free up
354  *
355  *      Undoes the effect of tty_ldisc_ref or tty_ldisc_ref_wait. May
356  *      be called in IRQ context.
357  *
358  *      Locking: takes tty_ldisc_lock
359  */
360
361 void tty_ldisc_deref(struct tty_ldisc *ld)
362 {
363         unsigned long flags;
364
365         BUG_ON(ld == NULL);
366
367         spin_lock_irqsave(&tty_ldisc_lock, flags);
368         if (atomic_read(&ld->users) == 0)
369                 printk(KERN_ERR "tty_ldisc_deref: no references.\n");
370         else if (atomic_dec_and_test(&ld->users))
371                 wake_up(&tty_ldisc_wait);
372         spin_unlock_irqrestore(&tty_ldisc_lock, flags);
373 }
374 EXPORT_SYMBOL_GPL(tty_ldisc_deref);
375
376 /**
377  *      tty_ldisc_enable        -       allow ldisc use
378  *      @tty: terminal to activate ldisc on
379  *
380  *      Set the TTY_LDISC flag when the line discipline can be called
381  *      again. Do necessary wakeups for existing sleepers. Clear the LDISC
382  *      changing flag to indicate any ldisc change is now over.
383  *
384  *      Note: nobody should set the TTY_LDISC bit except via this function.
385  *      Clearing directly is allowed.
386  */
387
388 void tty_ldisc_enable(struct tty_struct *tty)
389 {
390         set_bit(TTY_LDISC, &tty->flags);
391         clear_bit(TTY_LDISC_CHANGING, &tty->flags);
392         wake_up(&tty_ldisc_wait);
393 }
394
395 /**
396  *      tty_ldisc_flush -       flush line discipline queue
397  *      @tty: tty
398  *
399  *      Flush the line discipline queue (if any) for this tty. If there
400  *      is no line discipline active this is a no-op.
401  */
402
403 void tty_ldisc_flush(struct tty_struct *tty)
404 {
405         struct tty_ldisc *ld = tty_ldisc_ref(tty);
406         if (ld) {
407                 if (ld->ops->flush_buffer)
408                         ld->ops->flush_buffer(tty);
409                 tty_ldisc_deref(ld);
410         }
411         tty_buffer_flush(tty);
412 }
413 EXPORT_SYMBOL_GPL(tty_ldisc_flush);
414
415 /**
416  *      tty_set_termios_ldisc           -       set ldisc field
417  *      @tty: tty structure
418  *      @num: line discipline number
419  *
420  *      This is probably overkill for real world processors but
421  *      they are not on hot paths so a little discipline won't do
422  *      any harm.
423  *
424  *      Locking: takes termios_mutex
425  */
426
427 static void tty_set_termios_ldisc(struct tty_struct *tty, int num)
428 {
429         mutex_lock(&tty->termios_mutex);
430         tty->termios->c_line = num;
431         mutex_unlock(&tty->termios_mutex);
432 }
433
434 /**
435  *      tty_ldisc_open          -       open a line discipline
436  *      @tty: tty we are opening the ldisc on
437  *      @ld: discipline to open
438  *
439  *      A helper opening method. Also a convenient debugging and check
440  *      point.
441  */
442
443 static int tty_ldisc_open(struct tty_struct *tty, struct tty_ldisc *ld)
444 {
445         WARN_ON(test_and_set_bit(TTY_LDISC_OPEN, &tty->flags));
446         if (ld->ops->open)
447                 return ld->ops->open(tty);
448         return 0;
449 }
450
451 /**
452  *      tty_ldisc_close         -       close a line discipline
453  *      @tty: tty we are opening the ldisc on
454  *      @ld: discipline to close
455  *
456  *      A helper close method. Also a convenient debugging and check
457  *      point.
458  */
459
460 static void tty_ldisc_close(struct tty_struct *tty, struct tty_ldisc *ld)
461 {
462         WARN_ON(!test_bit(TTY_LDISC_OPEN, &tty->flags));
463         clear_bit(TTY_LDISC_OPEN, &tty->flags);
464         if (ld->ops->close)
465                 ld->ops->close(tty);
466 }
467
468 /**
469  *      tty_ldisc_restore       -       helper for tty ldisc change
470  *      @tty: tty to recover
471  *      @old: previous ldisc
472  *
473  *      Restore the previous line discipline or N_TTY when a line discipline
474  *      change fails due to an open error
475  */
476
477 static void tty_ldisc_restore(struct tty_struct *tty, struct tty_ldisc *old)
478 {
479         char buf[64];
480         struct tty_ldisc *new_ldisc;
481         int r;
482
483         /* There is an outstanding reference here so this is safe */
484         old = tty_ldisc_get(old->ops->num);
485         WARN_ON(IS_ERR(old));
486         tty_ldisc_assign(tty, old);
487         tty_set_termios_ldisc(tty, old->ops->num);
488         if (tty_ldisc_open(tty, old) < 0) {
489                 tty_ldisc_put(old);
490                 /* This driver is always present */
491                 new_ldisc = tty_ldisc_get(N_TTY);
492                 if (IS_ERR(new_ldisc))
493                         panic("n_tty: get");
494                 tty_ldisc_assign(tty, new_ldisc);
495                 tty_set_termios_ldisc(tty, N_TTY);
496                 r = tty_ldisc_open(tty, new_ldisc);
497                 if (r < 0)
498                         panic("Couldn't open N_TTY ldisc for "
499                               "%s --- error %d.",
500                               tty_name(tty, buf), r);
501         }
502 }
503
504 /**
505  *      tty_ldisc_halt          -       shut down the line discipline
506  *      @tty: tty device
507  *
508  *      Shut down the line discipline and work queue for this tty device.
509  *      The TTY_LDISC flag being cleared ensures no further references can
510  *      be obtained while the delayed work queue halt ensures that no more
511  *      data is fed to the ldisc.
512  *
513  *      In order to wait for any existing references to complete see
514  *      tty_ldisc_wait_idle.
515  */
516
517 static int tty_ldisc_halt(struct tty_struct *tty)
518 {
519         clear_bit(TTY_LDISC, &tty->flags);
520         return cancel_delayed_work(&tty->buf.work);
521 }
522
523 /**
524  *      tty_ldisc_wait_idle     -       wait for the ldisc to become idle
525  *      @tty: tty to wait for
526  *
527  *      Wait for the line discipline to become idle. The discipline must
528  *      have been halted for this to guarantee it remains idle.
529  *
530  *      tty_ldisc_lock protects the ref counts currently.
531  */
532
533 static int tty_ldisc_wait_idle(struct tty_struct *tty)
534 {
535         unsigned long flags;
536         spin_lock_irqsave(&tty_ldisc_lock, flags);
537         while (atomic_read(&tty->ldisc->users)) {
538                 spin_unlock_irqrestore(&tty_ldisc_lock, flags);
539                 if (wait_event_timeout(tty_ldisc_wait,
540                                 atomic_read(&tty->ldisc->users) == 0, 5 * HZ) == 0)
541                         return -EBUSY;
542                 spin_lock_irqsave(&tty_ldisc_lock, flags);
543         }
544         spin_unlock_irqrestore(&tty_ldisc_lock, flags);
545         return 0;
546 }
547
548 /**
549  *      tty_set_ldisc           -       set line discipline
550  *      @tty: the terminal to set
551  *      @ldisc: the line discipline
552  *
553  *      Set the discipline of a tty line. Must be called from a process
554  *      context. The ldisc change logic has to protect itself against any
555  *      overlapping ldisc change (including on the other end of pty pairs),
556  *      the close of one side of a tty/pty pair, and eventually hangup.
557  *
558  *      Locking: takes tty_ldisc_lock, termios_mutex
559  */
560
561 int tty_set_ldisc(struct tty_struct *tty, int ldisc)
562 {
563         int retval;
564         struct tty_ldisc *o_ldisc, *new_ldisc;
565         int work, o_work = 0;
566         struct tty_struct *o_tty;
567
568         new_ldisc = tty_ldisc_get(ldisc);
569         if (IS_ERR(new_ldisc))
570                 return PTR_ERR(new_ldisc);
571
572         /*
573          *      We need to look at the tty locking here for pty/tty pairs
574          *      when both sides try to change in parallel.
575          */
576
577         o_tty = tty->link;      /* o_tty is the pty side or NULL */
578
579
580         /*
581          *      Check the no-op case
582          */
583
584         if (tty->ldisc->ops->num == ldisc) {
585                 tty_ldisc_put(new_ldisc);
586                 return 0;
587         }
588
589         /*
590          *      Problem: What do we do if this blocks ?
591          *      We could deadlock here
592          */
593
594         tty_wait_until_sent(tty, 0);
595
596         mutex_lock(&tty->ldisc_mutex);
597
598         /*
599          *      We could be midstream of another ldisc change which has
600          *      dropped the lock during processing. If so we need to wait.
601          */
602
603         while (test_bit(TTY_LDISC_CHANGING, &tty->flags)) {
604                 mutex_unlock(&tty->ldisc_mutex);
605                 wait_event(tty_ldisc_wait,
606                         test_bit(TTY_LDISC_CHANGING, &tty->flags) == 0);
607                 mutex_lock(&tty->ldisc_mutex);
608         }
609         set_bit(TTY_LDISC_CHANGING, &tty->flags);
610
611         /*
612          *      No more input please, we are switching. The new ldisc
613          *      will update this value in the ldisc open function
614          */
615
616         tty->receive_room = 0;
617
618         o_ldisc = tty->ldisc;
619         /*
620          *      Make sure we don't change while someone holds a
621          *      reference to the line discipline. The TTY_LDISC bit
622          *      prevents anyone taking a reference once it is clear.
623          *      We need the lock to avoid racing reference takers.
624          *
625          *      We must clear the TTY_LDISC bit here to avoid a livelock
626          *      with a userspace app continually trying to use the tty in
627          *      parallel to the change and re-referencing the tty.
628          */
629
630         work = tty_ldisc_halt(tty);
631         if (o_tty)
632                 o_work = tty_ldisc_halt(o_tty);
633
634         /*
635          * Wait for ->hangup_work and ->buf.work handlers to terminate.
636          * We must drop the mutex here in case a hangup is also in process.
637          */
638
639         mutex_unlock(&tty->ldisc_mutex);
640
641         flush_scheduled_work();
642
643         /* Let any existing reference holders finish */
644         retval = tty_ldisc_wait_idle(tty);
645         if (retval < 0) {
646                 clear_bit(TTY_LDISC_CHANGING, &tty->flags);
647                 tty_ldisc_put(new_ldisc);
648                 return retval;
649         }
650
651         mutex_lock(&tty->ldisc_mutex);
652         if (test_bit(TTY_HUPPED, &tty->flags)) {
653                 /* We were raced by the hangup method. It will have stomped
654                    the ldisc data and closed the ldisc down */
655                 clear_bit(TTY_LDISC_CHANGING, &tty->flags);
656                 mutex_unlock(&tty->ldisc_mutex);
657                 tty_ldisc_put(new_ldisc);
658                 return -EIO;
659         }
660
661         /* Shutdown the current discipline. */
662         tty_ldisc_close(tty, o_ldisc);
663
664         /* Now set up the new line discipline. */
665         tty_ldisc_assign(tty, new_ldisc);
666         tty_set_termios_ldisc(tty, ldisc);
667
668         retval = tty_ldisc_open(tty, new_ldisc);
669         if (retval < 0) {
670                 /* Back to the old one or N_TTY if we can't */
671                 tty_ldisc_put(new_ldisc);
672                 tty_ldisc_restore(tty, o_ldisc);
673         }
674
675         /* At this point we hold a reference to the new ldisc and a
676            a reference to the old ldisc. If we ended up flipping back
677            to the existing ldisc we have two references to it */
678
679         if (tty->ldisc->ops->num != o_ldisc->ops->num && tty->ops->set_ldisc)
680                 tty->ops->set_ldisc(tty);
681
682         tty_ldisc_put(o_ldisc);
683
684         /*
685          *      Allow ldisc referencing to occur again
686          */
687
688         tty_ldisc_enable(tty);
689         if (o_tty)
690                 tty_ldisc_enable(o_tty);
691
692         /* Restart the work queue in case no characters kick it off. Safe if
693            already running */
694         if (work)
695                 schedule_delayed_work(&tty->buf.work, 1);
696         if (o_work)
697                 schedule_delayed_work(&o_tty->buf.work, 1);
698         mutex_unlock(&tty->ldisc_mutex);
699         return retval;
700 }
701
702 /**
703  *      tty_reset_termios       -       reset terminal state
704  *      @tty: tty to reset
705  *
706  *      Restore a terminal to the driver default state.
707  */
708
709 static void tty_reset_termios(struct tty_struct *tty)
710 {
711         mutex_lock(&tty->termios_mutex);
712         *tty->termios = tty->driver->init_termios;
713         tty->termios->c_ispeed = tty_termios_input_baud_rate(tty->termios);
714         tty->termios->c_ospeed = tty_termios_baud_rate(tty->termios);
715         mutex_unlock(&tty->termios_mutex);
716 }
717
718
719 /**
720  *      tty_ldisc_reinit        -       reinitialise the tty ldisc
721  *      @tty: tty to reinit
722  *
723  *      Switch the tty back to N_TTY line discipline and leave the
724  *      ldisc state closed
725  */
726
727 static void tty_ldisc_reinit(struct tty_struct *tty)
728 {
729         struct tty_ldisc *ld;
730
731         tty_ldisc_close(tty, tty->ldisc);
732         tty_ldisc_put(tty->ldisc);
733         tty->ldisc = NULL;
734         /*
735          *      Switch the line discipline back
736          */
737         ld = tty_ldisc_get(N_TTY);
738         BUG_ON(IS_ERR(ld));
739         tty_ldisc_assign(tty, ld);
740         tty_set_termios_ldisc(tty, N_TTY);
741 }
742
743 /**
744  *      tty_ldisc_hangup                -       hangup ldisc reset
745  *      @tty: tty being hung up
746  *
747  *      Some tty devices reset their termios when they receive a hangup
748  *      event. In that situation we must also switch back to N_TTY properly
749  *      before we reset the termios data.
750  *
751  *      Locking: We can take the ldisc mutex as the rest of the code is
752  *      careful to allow for this.
753  *
754  *      In the pty pair case this occurs in the close() path of the
755  *      tty itself so we must be careful about locking rules.
756  */
757
758 void tty_ldisc_hangup(struct tty_struct *tty)
759 {
760         struct tty_ldisc *ld;
761
762         /*
763          * FIXME! What are the locking issues here? This may me overdoing
764          * things... This question is especially important now that we've
765          * removed the irqlock.
766          */
767         ld = tty_ldisc_ref(tty);
768         if (ld != NULL) {
769                 /* We may have no line discipline at this point */
770                 if (ld->ops->flush_buffer)
771                         ld->ops->flush_buffer(tty);
772                 tty_driver_flush_buffer(tty);
773                 if ((test_bit(TTY_DO_WRITE_WAKEUP, &tty->flags)) &&
774                     ld->ops->write_wakeup)
775                         ld->ops->write_wakeup(tty);
776                 if (ld->ops->hangup)
777                         ld->ops->hangup(tty);
778                 tty_ldisc_deref(ld);
779         }
780         /*
781          * FIXME: Once we trust the LDISC code better we can wait here for
782          * ldisc completion and fix the driver call race
783          */
784         wake_up_interruptible_poll(&tty->write_wait, POLLOUT);
785         wake_up_interruptible_poll(&tty->read_wait, POLLIN);
786         /*
787          * Shutdown the current line discipline, and reset it to
788          * N_TTY.
789          */
790         if (tty->driver->flags & TTY_DRIVER_RESET_TERMIOS) {
791                 /* Avoid racing set_ldisc or tty_ldisc_release */
792                 mutex_lock(&tty->ldisc_mutex);
793                 if (tty->ldisc) {       /* Not yet closed */
794                         /* Switch back to N_TTY */
795                         tty_ldisc_halt(tty);
796                         tty_ldisc_wait_idle(tty);
797                         tty_ldisc_reinit(tty);
798                         /* At this point we have a closed ldisc and we want to
799                            reopen it. We could defer this to the next open but
800                            it means auditing a lot of other paths so this is
801                            a FIXME */
802                         WARN_ON(tty_ldisc_open(tty, tty->ldisc));
803                         tty_ldisc_enable(tty);
804                 }
805                 mutex_unlock(&tty->ldisc_mutex);
806                 tty_reset_termios(tty);
807         }
808 }
809
810 /**
811  *      tty_ldisc_setup                 -       open line discipline
812  *      @tty: tty being shut down
813  *      @o_tty: pair tty for pty/tty pairs
814  *
815  *      Called during the initial open of a tty/pty pair in order to set up the
816  *      line disciplines and bind them to the tty. This has no locking issues
817  *      as the device isn't yet active.
818  */
819
820 int tty_ldisc_setup(struct tty_struct *tty, struct tty_struct *o_tty)
821 {
822         struct tty_ldisc *ld = tty->ldisc;
823         int retval;
824
825         retval = tty_ldisc_open(tty, ld);
826         if (retval)
827                 return retval;
828
829         if (o_tty) {
830                 retval = tty_ldisc_open(o_tty, o_tty->ldisc);
831                 if (retval) {
832                         tty_ldisc_close(tty, ld);
833                         return retval;
834                 }
835                 tty_ldisc_enable(o_tty);
836         }
837         tty_ldisc_enable(tty);
838         return 0;
839 }
840 /**
841  *      tty_ldisc_release               -       release line discipline
842  *      @tty: tty being shut down
843  *      @o_tty: pair tty for pty/tty pairs
844  *
845  *      Called during the final close of a tty/pty pair in order to shut down
846  *      the line discpline layer. On exit the ldisc assigned is N_TTY and the
847  *      ldisc has not been opened.
848  */
849
850 void tty_ldisc_release(struct tty_struct *tty, struct tty_struct *o_tty)
851 {
852         /*
853          * Prevent flush_to_ldisc() from rescheduling the work for later.  Then
854          * kill any delayed work. As this is the final close it does not
855          * race with the set_ldisc code path.
856          */
857
858         tty_ldisc_halt(tty);
859         flush_scheduled_work();
860
861         /*
862          * Wait for any short term users (we know they are just driver
863          * side waiters as the file is closing so user count on the file
864          * side is zero.
865          */
866
867         tty_ldisc_wait_idle(tty);
868
869         mutex_lock(&tty->ldisc_mutex);
870         /*
871          * Now kill off the ldisc
872          */
873         tty_ldisc_close(tty, tty->ldisc);
874         tty_ldisc_put(tty->ldisc);
875         /* Force an oops if we mess this up */
876         tty->ldisc = NULL;
877
878         /* Ensure the next open requests the N_TTY ldisc */
879         tty_set_termios_ldisc(tty, N_TTY);
880         mutex_unlock(&tty->ldisc_mutex);
881
882         /* This will need doing differently if we need to lock */
883         if (o_tty)
884                 tty_ldisc_release(o_tty, NULL);
885
886         /* And the memory resources remaining (buffers, termios) will be
887            disposed of when the kref hits zero */
888 }
889
890 /**
891  *      tty_ldisc_init          -       ldisc setup for new tty
892  *      @tty: tty being allocated
893  *
894  *      Set up the line discipline objects for a newly allocated tty. Note that
895  *      the tty structure is not completely set up when this call is made.
896  */
897
898 void tty_ldisc_init(struct tty_struct *tty)
899 {
900         struct tty_ldisc *ld = tty_ldisc_get(N_TTY);
901         if (IS_ERR(ld))
902                 panic("n_tty: init_tty");
903         tty_ldisc_assign(tty, ld);
904 }
905
906 void tty_ldisc_begin(void)
907 {
908         /* Setup the default TTY line discipline. */
909         (void) tty_register_ldisc(N_TTY, &tty_ldisc_N_TTY);
910 }