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