linux/drivers/tty/pty.c
<<
>>
Prefs
   1/*
   2 *  Copyright (C) 1991, 1992  Linus Torvalds
   3 *
   4 *  Added support for a Unix98-style ptmx device.
   5 *    -- C. Scott Ananian <cananian@alumni.princeton.edu>, 14-Jan-1998
   6 *
   7 *  When reading this code see also fs/devpts. In particular note that the
   8 *  driver_data field is used by the devpts side as a binding to the devpts
   9 *  inode.
  10 */
  11
  12#include <linux/module.h>
  13
  14#include <linux/errno.h>
  15#include <linux/interrupt.h>
  16#include <linux/tty.h>
  17#include <linux/tty_flip.h>
  18#include <linux/fcntl.h>
  19#include <linux/sched.h>
  20#include <linux/string.h>
  21#include <linux/major.h>
  22#include <linux/mm.h>
  23#include <linux/init.h>
  24#include <linux/sysctl.h>
  25#include <linux/device.h>
  26#include <linux/uaccess.h>
  27#include <linux/bitops.h>
  28#include <linux/devpts_fs.h>
  29#include <linux/slab.h>
  30
  31#include <asm/system.h>
  32
  33#ifdef CONFIG_UNIX98_PTYS
  34static struct tty_driver *ptm_driver;
  35static struct tty_driver *pts_driver;
  36#endif
  37
  38static void pty_close(struct tty_struct *tty, struct file *filp)
  39{
  40        BUG_ON(!tty);
  41        if (tty->driver->subtype == PTY_TYPE_MASTER)
  42                WARN_ON(tty->count > 1);
  43        else {
  44                if (tty->count > 2)
  45                        return;
  46        }
  47        wake_up_interruptible(&tty->read_wait);
  48        wake_up_interruptible(&tty->write_wait);
  49        tty->packet = 0;
  50        if (!tty->link)
  51                return;
  52        tty->link->packet = 0;
  53        set_bit(TTY_OTHER_CLOSED, &tty->link->flags);
  54        wake_up_interruptible(&tty->link->read_wait);
  55        wake_up_interruptible(&tty->link->write_wait);
  56        if (tty->driver->subtype == PTY_TYPE_MASTER) {
  57                set_bit(TTY_OTHER_CLOSED, &tty->flags);
  58#ifdef CONFIG_UNIX98_PTYS
  59                if (tty->driver == ptm_driver)
  60                        devpts_pty_kill(tty->link);
  61#endif
  62                tty_unlock();
  63                tty_vhangup(tty->link);
  64                tty_lock();
  65        }
  66}
  67
  68/*
  69 * The unthrottle routine is called by the line discipline to signal
  70 * that it can receive more characters.  For PTY's, the TTY_THROTTLED
  71 * flag is always set, to force the line discipline to always call the
  72 * unthrottle routine when there are fewer than TTY_THRESHOLD_UNTHROTTLE
  73 * characters in the queue.  This is necessary since each time this
  74 * happens, we need to wake up any sleeping processes that could be
  75 * (1) trying to send data to the pty, or (2) waiting in wait_until_sent()
  76 * for the pty buffer to be drained.
  77 */
  78static void pty_unthrottle(struct tty_struct *tty)
  79{
  80        tty_wakeup(tty->link);
  81        set_bit(TTY_THROTTLED, &tty->flags);
  82}
  83
  84/**
  85 *      pty_space       -       report space left for writing
  86 *      @to: tty we are writing into
  87 *
  88 *      The tty buffers allow 64K but we sneak a peak and clip at 8K this
  89 *      allows a lot of overspill room for echo and other fun messes to
  90 *      be handled properly
  91 */
  92
  93static int pty_space(struct tty_struct *to)
  94{
  95        int n = 8192 - to->buf.memory_used;
  96        if (n < 0)
  97                return 0;
  98        return n;
  99}
 100
 101/**
 102 *      pty_write               -       write to a pty
 103 *      @tty: the tty we write from
 104 *      @buf: kernel buffer of data
 105 *      @count: bytes to write
 106 *
 107 *      Our "hardware" write method. Data is coming from the ldisc which
 108 *      may be in a non sleeping state. We simply throw this at the other
 109 *      end of the link as if we were an IRQ handler receiving stuff for
 110 *      the other side of the pty/tty pair.
 111 */
 112
 113static int pty_write(struct tty_struct *tty, const unsigned char *buf, int c)
 114{
 115        struct tty_struct *to = tty->link;
 116
 117        if (tty->stopped)
 118                return 0;
 119
 120        if (c > 0) {
 121                /* Stuff the data into the input queue of the other end */
 122                c = tty_insert_flip_string(to, buf, c);
 123                /* And shovel */
 124                if (c) {
 125                        tty_flip_buffer_push(to);
 126                        tty_wakeup(tty);
 127                }
 128        }
 129        return c;
 130}
 131
 132/**
 133 *      pty_write_room  -       write space
 134 *      @tty: tty we are writing from
 135 *
 136 *      Report how many bytes the ldisc can send into the queue for
 137 *      the other device.
 138 */
 139
 140static int pty_write_room(struct tty_struct *tty)
 141{
 142        if (tty->stopped)
 143                return 0;
 144        return pty_space(tty->link);
 145}
 146
 147/**
 148 *      pty_chars_in_buffer     -       characters currently in our tx queue
 149 *      @tty: our tty
 150 *
 151 *      Report how much we have in the transmit queue. As everything is
 152 *      instantly at the other end this is easy to implement.
 153 */
 154
 155static int pty_chars_in_buffer(struct tty_struct *tty)
 156{
 157        return 0;
 158}
 159
 160/* Set the lock flag on a pty */
 161static int pty_set_lock(struct tty_struct *tty, int __user *arg)
 162{
 163        int val;
 164        if (get_user(val, arg))
 165                return -EFAULT;
 166        if (val)
 167                set_bit(TTY_PTY_LOCK, &tty->flags);
 168        else
 169                clear_bit(TTY_PTY_LOCK, &tty->flags);
 170        return 0;
 171}
 172
 173/* Send a signal to the slave */
 174static int pty_signal(struct tty_struct *tty, int sig)
 175{
 176        unsigned long flags;
 177        struct pid *pgrp;
 178
 179        if (tty->link) {
 180                spin_lock_irqsave(&tty->link->ctrl_lock, flags);
 181                pgrp = get_pid(tty->link->pgrp);
 182                spin_unlock_irqrestore(&tty->link->ctrl_lock, flags);
 183
 184                kill_pgrp(pgrp, sig, 1);
 185                put_pid(pgrp);
 186        }
 187        return 0;
 188}
 189
 190static void pty_flush_buffer(struct tty_struct *tty)
 191{
 192        struct tty_struct *to = tty->link;
 193        unsigned long flags;
 194
 195        if (!to)
 196                return;
 197        /* tty_buffer_flush(to); FIXME */
 198        if (to->packet) {
 199                spin_lock_irqsave(&tty->ctrl_lock, flags);
 200                tty->ctrl_status |= TIOCPKT_FLUSHWRITE;
 201                wake_up_interruptible(&to->read_wait);
 202                spin_unlock_irqrestore(&tty->ctrl_lock, flags);
 203        }
 204}
 205
 206static int pty_open(struct tty_struct *tty, struct file *filp)
 207{
 208        int     retval = -ENODEV;
 209
 210        if (!tty || !tty->link)
 211                goto out;
 212
 213        retval = -EIO;
 214        if (test_bit(TTY_OTHER_CLOSED, &tty->flags))
 215                goto out;
 216        if (test_bit(TTY_PTY_LOCK, &tty->link->flags))
 217                goto out;
 218        if (tty->link->count != 1)
 219                goto out;
 220
 221        clear_bit(TTY_OTHER_CLOSED, &tty->link->flags);
 222        set_bit(TTY_THROTTLED, &tty->flags);
 223        retval = 0;
 224out:
 225        return retval;
 226}
 227
 228static void pty_set_termios(struct tty_struct *tty,
 229                                        struct ktermios *old_termios)
 230{
 231        tty->termios->c_cflag &= ~(CSIZE | PARENB);
 232        tty->termios->c_cflag |= (CS8 | CREAD);
 233}
 234
 235/**
 236 *      pty_do_resize           -       resize event
 237 *      @tty: tty being resized
 238 *      @ws: window size being set.
 239 *
 240 *      Update the termios variables and send the necessary signals to
 241 *      peform a terminal resize correctly
 242 */
 243
 244int pty_resize(struct tty_struct *tty,  struct winsize *ws)
 245{
 246        struct pid *pgrp, *rpgrp;
 247        unsigned long flags;
 248        struct tty_struct *pty = tty->link;
 249
 250        /* For a PTY we need to lock the tty side */
 251        mutex_lock(&tty->termios_mutex);
 252        if (!memcmp(ws, &tty->winsize, sizeof(*ws)))
 253                goto done;
 254
 255        /* Get the PID values and reference them so we can
 256           avoid holding the tty ctrl lock while sending signals.
 257           We need to lock these individually however. */
 258
 259        spin_lock_irqsave(&tty->ctrl_lock, flags);
 260        pgrp = get_pid(tty->pgrp);
 261        spin_unlock_irqrestore(&tty->ctrl_lock, flags);
 262
 263        spin_lock_irqsave(&pty->ctrl_lock, flags);
 264        rpgrp = get_pid(pty->pgrp);
 265        spin_unlock_irqrestore(&pty->ctrl_lock, flags);
 266
 267        if (pgrp)
 268                kill_pgrp(pgrp, SIGWINCH, 1);
 269        if (rpgrp != pgrp && rpgrp)
 270                kill_pgrp(rpgrp, SIGWINCH, 1);
 271
 272        put_pid(pgrp);
 273        put_pid(rpgrp);
 274
 275        tty->winsize = *ws;
 276        pty->winsize = *ws;     /* Never used so will go away soon */
 277done:
 278        mutex_unlock(&tty->termios_mutex);
 279        return 0;
 280}
 281
 282/* Traditional BSD devices */
 283#ifdef CONFIG_LEGACY_PTYS
 284
 285static int pty_install(struct tty_driver *driver, struct tty_struct *tty)
 286{
 287        struct tty_struct *o_tty;
 288        int idx = tty->index;
 289        int retval;
 290
 291        o_tty = alloc_tty_struct();
 292        if (!o_tty)
 293                return -ENOMEM;
 294        if (!try_module_get(driver->other->owner)) {
 295                /* This cannot in fact currently happen */
 296                retval = -ENOMEM;
 297                goto err_free_tty;
 298        }
 299        initialize_tty_struct(o_tty, driver->other, idx);
 300
 301        /* We always use new tty termios data so we can do this
 302           the easy way .. */
 303        retval = tty_init_termios(tty);
 304        if (retval)
 305                goto err_deinit_tty;
 306
 307        retval = tty_init_termios(o_tty);
 308        if (retval)
 309                goto err_free_termios;
 310
 311        /*
 312         * Everything allocated ... set up the o_tty structure.
 313         */
 314        driver->other->ttys[idx] = o_tty;
 315        tty_driver_kref_get(driver->other);
 316        if (driver->subtype == PTY_TYPE_MASTER)
 317                o_tty->count++;
 318        /* Establish the links in both directions */
 319        tty->link   = o_tty;
 320        o_tty->link = tty;
 321
 322        tty_driver_kref_get(driver);
 323        tty->count++;
 324        driver->ttys[idx] = tty;
 325        return 0;
 326err_free_termios:
 327        tty_free_termios(tty);
 328err_deinit_tty:
 329        deinitialize_tty_struct(o_tty);
 330        module_put(o_tty->driver->owner);
 331err_free_tty:
 332        free_tty_struct(o_tty);
 333        return retval;
 334}
 335
 336static int pty_bsd_ioctl(struct tty_struct *tty,
 337                         unsigned int cmd, unsigned long arg)
 338{
 339        switch (cmd) {
 340        case TIOCSPTLCK: /* Set PT Lock (disallow slave open) */
 341                return pty_set_lock(tty, (int __user *) arg);
 342        case TIOCSIG:    /* Send signal to other side of pty */
 343                return pty_signal(tty, (int) arg);
 344        }
 345        return -ENOIOCTLCMD;
 346}
 347
 348static int legacy_count = CONFIG_LEGACY_PTY_COUNT;
 349module_param(legacy_count, int, 0);
 350
 351/*
 352 * The master side of a pty can do TIOCSPTLCK and thus
 353 * has pty_bsd_ioctl.
 354 */
 355static const struct tty_operations master_pty_ops_bsd = {
 356        .install = pty_install,
 357        .open = pty_open,
 358        .close = pty_close,
 359        .write = pty_write,
 360        .write_room = pty_write_room,
 361        .flush_buffer = pty_flush_buffer,
 362        .chars_in_buffer = pty_chars_in_buffer,
 363        .unthrottle = pty_unthrottle,
 364        .set_termios = pty_set_termios,
 365        .ioctl = pty_bsd_ioctl,
 366        .resize = pty_resize
 367};
 368
 369static const struct tty_operations slave_pty_ops_bsd = {
 370        .install = pty_install,
 371        .open = pty_open,
 372        .close = pty_close,
 373        .write = pty_write,
 374        .write_room = pty_write_room,
 375        .flush_buffer = pty_flush_buffer,
 376        .chars_in_buffer = pty_chars_in_buffer,
 377        .unthrottle = pty_unthrottle,
 378        .set_termios = pty_set_termios,
 379        .resize = pty_resize
 380};
 381
 382static void __init legacy_pty_init(void)
 383{
 384        struct tty_driver *pty_driver, *pty_slave_driver;
 385
 386        if (legacy_count <= 0)
 387                return;
 388
 389        pty_driver = alloc_tty_driver(legacy_count);
 390        if (!pty_driver)
 391                panic("Couldn't allocate pty driver");
 392
 393        pty_slave_driver = alloc_tty_driver(legacy_count);
 394        if (!pty_slave_driver)
 395                panic("Couldn't allocate pty slave driver");
 396
 397        pty_driver->owner = THIS_MODULE;
 398        pty_driver->driver_name = "pty_master";
 399        pty_driver->name = "pty";
 400        pty_driver->major = PTY_MASTER_MAJOR;
 401        pty_driver->minor_start = 0;
 402        pty_driver->type = TTY_DRIVER_TYPE_PTY;
 403        pty_driver->subtype = PTY_TYPE_MASTER;
 404        pty_driver->init_termios = tty_std_termios;
 405        pty_driver->init_termios.c_iflag = 0;
 406        pty_driver->init_termios.c_oflag = 0;
 407        pty_driver->init_termios.c_cflag = B38400 | CS8 | CREAD;
 408        pty_driver->init_termios.c_lflag = 0;
 409        pty_driver->init_termios.c_ispeed = 38400;
 410        pty_driver->init_termios.c_ospeed = 38400;
 411        pty_driver->flags = TTY_DRIVER_RESET_TERMIOS | TTY_DRIVER_REAL_RAW;
 412        pty_driver->other = pty_slave_driver;
 413        tty_set_operations(pty_driver, &master_pty_ops_bsd);
 414
 415        pty_slave_driver->owner = THIS_MODULE;
 416        pty_slave_driver->driver_name = "pty_slave";
 417        pty_slave_driver->name = "ttyp";
 418        pty_slave_driver->major = PTY_SLAVE_MAJOR;
 419        pty_slave_driver->minor_start = 0;
 420        pty_slave_driver->type = TTY_DRIVER_TYPE_PTY;
 421        pty_slave_driver->subtype = PTY_TYPE_SLAVE;
 422        pty_slave_driver->init_termios = tty_std_termios;
 423        pty_slave_driver->init_termios.c_cflag = B38400 | CS8 | CREAD;
 424        pty_slave_driver->init_termios.c_ispeed = 38400;
 425        pty_slave_driver->init_termios.c_ospeed = 38400;
 426        pty_slave_driver->flags = TTY_DRIVER_RESET_TERMIOS |
 427                                        TTY_DRIVER_REAL_RAW;
 428        pty_slave_driver->other = pty_driver;
 429        tty_set_operations(pty_slave_driver, &slave_pty_ops_bsd);
 430
 431        if (tty_register_driver(pty_driver))
 432                panic("Couldn't register pty driver");
 433        if (tty_register_driver(pty_slave_driver))
 434                panic("Couldn't register pty slave driver");
 435}
 436#else
 437static inline void legacy_pty_init(void) { }
 438#endif
 439
 440/* Unix98 devices */
 441#ifdef CONFIG_UNIX98_PTYS
 442/*
 443 * sysctl support for setting limits on the number of Unix98 ptys allocated.
 444 * Otherwise one can eat up all kernel memory by opening /dev/ptmx repeatedly.
 445 */
 446int pty_limit = NR_UNIX98_PTY_DEFAULT;
 447static int pty_limit_min;
 448static int pty_limit_max = NR_UNIX98_PTY_MAX;
 449static int pty_count;
 450
 451static struct cdev ptmx_cdev;
 452
 453static struct ctl_table pty_table[] = {
 454        {
 455                .procname       = "max",
 456                .maxlen         = sizeof(int),
 457                .mode           = 0644,
 458                .data           = &pty_limit,
 459                .proc_handler   = proc_dointvec_minmax,
 460                .extra1         = &pty_limit_min,
 461                .extra2         = &pty_limit_max,
 462        }, {
 463                .procname       = "nr",
 464                .maxlen         = sizeof(int),
 465                .mode           = 0444,
 466                .data           = &pty_count,
 467                .proc_handler   = proc_dointvec,
 468        }, 
 469        {}
 470};
 471
 472static struct ctl_table pty_kern_table[] = {
 473        {
 474                .procname       = "pty",
 475                .mode           = 0555,
 476                .child          = pty_table,
 477        },
 478        {}
 479};
 480
 481static struct ctl_table pty_root_table[] = {
 482        {
 483                .procname       = "kernel",
 484                .mode           = 0555,
 485                .child          = pty_kern_table,
 486        },
 487        {}
 488};
 489
 490
 491static int pty_unix98_ioctl(struct tty_struct *tty,
 492                            unsigned int cmd, unsigned long arg)
 493{
 494        switch (cmd) {
 495        case TIOCSPTLCK: /* Set PT Lock (disallow slave open) */
 496                return pty_set_lock(tty, (int __user *)arg);
 497        case TIOCGPTN: /* Get PT Number */
 498                return put_user(tty->index, (unsigned int __user *)arg);
 499        case TIOCSIG:    /* Send signal to other side of pty */
 500                return pty_signal(tty, (int) arg);
 501        }
 502
 503        return -ENOIOCTLCMD;
 504}
 505
 506/**
 507 *      ptm_unix98_lookup       -       find a pty master
 508 *      @driver: ptm driver
 509 *      @idx: tty index
 510 *
 511 *      Look up a pty master device. Called under the tty_mutex for now.
 512 *      This provides our locking.
 513 */
 514
 515static struct tty_struct *ptm_unix98_lookup(struct tty_driver *driver,
 516                struct inode *ptm_inode, int idx)
 517{
 518        struct tty_struct *tty = devpts_get_tty(ptm_inode, idx);
 519        if (tty)
 520                tty = tty->link;
 521        return tty;
 522}
 523
 524/**
 525 *      pts_unix98_lookup       -       find a pty slave
 526 *      @driver: pts driver
 527 *      @idx: tty index
 528 *
 529 *      Look up a pty master device. Called under the tty_mutex for now.
 530 *      This provides our locking.
 531 */
 532
 533static struct tty_struct *pts_unix98_lookup(struct tty_driver *driver,
 534                struct inode *pts_inode, int idx)
 535{
 536        struct tty_struct *tty = devpts_get_tty(pts_inode, idx);
 537        /* Master must be open before slave */
 538        if (!tty)
 539                return ERR_PTR(-EIO);
 540        return tty;
 541}
 542
 543static void pty_unix98_shutdown(struct tty_struct *tty)
 544{
 545        /* We have our own method as we don't use the tty index */
 546        kfree(tty->termios);
 547}
 548
 549/* We have no need to install and remove our tty objects as devpts does all
 550   the work for us */
 551
 552static int pty_unix98_install(struct tty_driver *driver, struct tty_struct *tty)
 553{
 554        struct tty_struct *o_tty;
 555        int idx = tty->index;
 556
 557        o_tty = alloc_tty_struct();
 558        if (!o_tty)
 559                return -ENOMEM;
 560        if (!try_module_get(driver->other->owner)) {
 561                /* This cannot in fact currently happen */
 562                goto err_free_tty;
 563        }
 564        initialize_tty_struct(o_tty, driver->other, idx);
 565
 566        tty->termios = kzalloc(sizeof(struct ktermios[2]), GFP_KERNEL);
 567        if (tty->termios == NULL)
 568                goto err_free_mem;
 569        *tty->termios = driver->init_termios;
 570        tty->termios_locked = tty->termios + 1;
 571
 572        o_tty->termios = kzalloc(sizeof(struct ktermios[2]), GFP_KERNEL);
 573        if (o_tty->termios == NULL)
 574                goto err_free_mem;
 575        *o_tty->termios = driver->other->init_termios;
 576        o_tty->termios_locked = o_tty->termios + 1;
 577
 578        tty_driver_kref_get(driver->other);
 579        if (driver->subtype == PTY_TYPE_MASTER)
 580                o_tty->count++;
 581        /* Establish the links in both directions */
 582        tty->link   = o_tty;
 583        o_tty->link = tty;
 584        /*
 585         * All structures have been allocated, so now we install them.
 586         * Failures after this point use release_tty to clean up, so
 587         * there's no need to null out the local pointers.
 588         */
 589        tty_driver_kref_get(driver);
 590        tty->count++;
 591        pty_count++;
 592        return 0;
 593err_free_mem:
 594        deinitialize_tty_struct(o_tty);
 595        kfree(o_tty->termios);
 596        kfree(tty->termios);
 597        module_put(o_tty->driver->owner);
 598err_free_tty:
 599        free_tty_struct(o_tty);
 600        return -ENOMEM;
 601}
 602
 603static void pty_unix98_remove(struct tty_driver *driver, struct tty_struct *tty)
 604{
 605        pty_count--;
 606}
 607
 608static const struct tty_operations ptm_unix98_ops = {
 609        .lookup = ptm_unix98_lookup,
 610        .install = pty_unix98_install,
 611        .remove = pty_unix98_remove,
 612        .open = pty_open,
 613        .close = pty_close,
 614        .write = pty_write,
 615        .write_room = pty_write_room,
 616        .flush_buffer = pty_flush_buffer,
 617        .chars_in_buffer = pty_chars_in_buffer,
 618        .unthrottle = pty_unthrottle,
 619        .set_termios = pty_set_termios,
 620        .ioctl = pty_unix98_ioctl,
 621        .shutdown = pty_unix98_shutdown,
 622        .resize = pty_resize
 623};
 624
 625static const struct tty_operations pty_unix98_ops = {
 626        .lookup = pts_unix98_lookup,
 627        .install = pty_unix98_install,
 628        .remove = pty_unix98_remove,
 629        .open = pty_open,
 630        .close = pty_close,
 631        .write = pty_write,
 632        .write_room = pty_write_room,
 633        .flush_buffer = pty_flush_buffer,
 634        .chars_in_buffer = pty_chars_in_buffer,
 635        .unthrottle = pty_unthrottle,
 636        .set_termios = pty_set_termios,
 637        .shutdown = pty_unix98_shutdown
 638};
 639
 640/**
 641 *      ptmx_open               -       open a unix 98 pty master
 642 *      @inode: inode of device file
 643 *      @filp: file pointer to tty
 644 *
 645 *      Allocate a unix98 pty master device from the ptmx driver.
 646 *
 647 *      Locking: tty_mutex protects the init_dev work. tty->count should
 648 *              protect the rest.
 649 *              allocated_ptys_lock handles the list of free pty numbers
 650 */
 651
 652static int ptmx_open(struct inode *inode, struct file *filp)
 653{
 654        struct tty_struct *tty;
 655        int retval;
 656        int index;
 657
 658        nonseekable_open(inode, filp);
 659
 660        /* find a device that is not in use. */
 661        tty_lock();
 662        index = devpts_new_index(inode);
 663        tty_unlock();
 664        if (index < 0)
 665                return index;
 666
 667        mutex_lock(&tty_mutex);
 668        tty_lock();
 669        tty = tty_init_dev(ptm_driver, index, 1);
 670        mutex_unlock(&tty_mutex);
 671
 672        if (IS_ERR(tty)) {
 673                retval = PTR_ERR(tty);
 674                goto out;
 675        }
 676
 677        set_bit(TTY_PTY_LOCK, &tty->flags); /* LOCK THE SLAVE */
 678
 679        retval = tty_add_file(tty, filp);
 680        if (retval)
 681                goto out;
 682
 683        retval = devpts_pty_new(inode, tty->link);
 684        if (retval)
 685                goto out1;
 686
 687        retval = ptm_driver->ops->open(tty, filp);
 688        if (retval)
 689                goto out2;
 690out1:
 691        tty_unlock();
 692        return retval;
 693out2:
 694        tty_unlock();
 695        tty_release(inode, filp);
 696        return retval;
 697out:
 698        devpts_kill_index(inode, index);
 699        tty_unlock();
 700        return retval;
 701}
 702
 703static struct file_operations ptmx_fops;
 704
 705static void __init unix98_pty_init(void)
 706{
 707        ptm_driver = alloc_tty_driver(NR_UNIX98_PTY_MAX);
 708        if (!ptm_driver)
 709                panic("Couldn't allocate Unix98 ptm driver");
 710        pts_driver = alloc_tty_driver(NR_UNIX98_PTY_MAX);
 711        if (!pts_driver)
 712                panic("Couldn't allocate Unix98 pts driver");
 713
 714        ptm_driver->owner = THIS_MODULE;
 715        ptm_driver->driver_name = "pty_master";
 716        ptm_driver->name = "ptm";
 717        ptm_driver->major = UNIX98_PTY_MASTER_MAJOR;
 718        ptm_driver->minor_start = 0;
 719        ptm_driver->type = TTY_DRIVER_TYPE_PTY;
 720        ptm_driver->subtype = PTY_TYPE_MASTER;
 721        ptm_driver->init_termios = tty_std_termios;
 722        ptm_driver->init_termios.c_iflag = 0;
 723        ptm_driver->init_termios.c_oflag = 0;
 724        ptm_driver->init_termios.c_cflag = B38400 | CS8 | CREAD;
 725        ptm_driver->init_termios.c_lflag = 0;
 726        ptm_driver->init_termios.c_ispeed = 38400;
 727        ptm_driver->init_termios.c_ospeed = 38400;
 728        ptm_driver->flags = TTY_DRIVER_RESET_TERMIOS | TTY_DRIVER_REAL_RAW |
 729                TTY_DRIVER_DYNAMIC_DEV | TTY_DRIVER_DEVPTS_MEM;
 730        ptm_driver->other = pts_driver;
 731        tty_set_operations(ptm_driver, &ptm_unix98_ops);
 732
 733        pts_driver->owner = THIS_MODULE;
 734        pts_driver->driver_name = "pty_slave";
 735        pts_driver->name = "pts";
 736        pts_driver->major = UNIX98_PTY_SLAVE_MAJOR;
 737        pts_driver->minor_start = 0;
 738        pts_driver->type = TTY_DRIVER_TYPE_PTY;
 739        pts_driver->subtype = PTY_TYPE_SLAVE;
 740        pts_driver->init_termios = tty_std_termios;
 741        pts_driver->init_termios.c_cflag = B38400 | CS8 | CREAD;
 742        pts_driver->init_termios.c_ispeed = 38400;
 743        pts_driver->init_termios.c_ospeed = 38400;
 744        pts_driver->flags = TTY_DRIVER_RESET_TERMIOS | TTY_DRIVER_REAL_RAW |
 745                TTY_DRIVER_DYNAMIC_DEV | TTY_DRIVER_DEVPTS_MEM;
 746        pts_driver->other = ptm_driver;
 747        tty_set_operations(pts_driver, &pty_unix98_ops);
 748
 749        if (tty_register_driver(ptm_driver))
 750                panic("Couldn't register Unix98 ptm driver");
 751        if (tty_register_driver(pts_driver))
 752                panic("Couldn't register Unix98 pts driver");
 753
 754        register_sysctl_table(pty_root_table);
 755
 756        /* Now create the /dev/ptmx special device */
 757        tty_default_fops(&ptmx_fops);
 758        ptmx_fops.open = ptmx_open;
 759
 760        cdev_init(&ptmx_cdev, &ptmx_fops);
 761        if (cdev_add(&ptmx_cdev, MKDEV(TTYAUX_MAJOR, 2), 1) ||
 762            register_chrdev_region(MKDEV(TTYAUX_MAJOR, 2), 1, "/dev/ptmx") < 0)
 763                panic("Couldn't register /dev/ptmx driver\n");
 764        device_create(tty_class, NULL, MKDEV(TTYAUX_MAJOR, 2), NULL, "ptmx");
 765}
 766
 767#else
 768static inline void unix98_pty_init(void) { }
 769#endif
 770
 771static int __init pty_init(void)
 772{
 773        legacy_pty_init();
 774        unix98_pty_init();
 775        return 0;
 776}
 777module_init(pty_init);
 778