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