TTY: add ports array to tty_driver
authorJiri Slaby <jslaby@suse.cz>
Mon, 4 Jun 2012 11:35:36 +0000 (13:35 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 14 Jun 2012 00:30:54 +0000 (17:30 -0700)
It will hold tty_port structures for all drivers which do not want to
define tty->ops->install hook.

We ignore PTY here because it wants 1 million lines and it installs
tty_port in ->install anyway.

Signed-off-by: Jiri Slaby <jslaby@suse.cz>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/tty/tty_io.c
include/linux/tty_driver.h

index d6e045b7079a3ee92d4551fe0d84389698355a07..ac96f74573d0e8c9bd5225285002abe364f8a84f 100644 (file)
@@ -1407,6 +1407,9 @@ struct tty_struct *tty_init_dev(struct tty_driver *driver, int idx)
        if (retval < 0)
                goto err_deinit_tty;
 
+       if (!tty->port)
+               tty->port = driver->ports[idx];
+
        /*
         * Structures all installed ... call the ldisc open routines.
         * If we fail here just call release_tty to clean up.  No need
@@ -3094,6 +3097,7 @@ static void destruct_tty_driver(struct kref *kref)
                kfree(p);
                cdev_del(&driver->cdev);
        }
+       kfree(driver->ports);
        kfree(driver);
 }
 
@@ -3132,6 +3136,18 @@ int tty_register_driver(struct tty_driver *driver)
                if (!p)
                        return -ENOMEM;
        }
+       /*
+        * There is too many lines in PTY and we won't need the array there
+        * since it has an ->install hook where it assigns ports properly.
+        */
+       if (driver->type != TTY_DRIVER_TYPE_PTY) {
+               driver->ports = kcalloc(driver->num, sizeof(struct tty_port *),
+                               GFP_KERNEL);
+               if (!driver->ports) {
+                       error = -ENOMEM;
+                       goto err_free_p;
+               }
+       }
 
        if (!driver->major) {
                error = alloc_chrdev_region(&dev, driver->minor_start,
@@ -3190,7 +3206,7 @@ err_unreg_char:
        unregister_chrdev_region(dev, driver->num);
        driver->ttys = NULL;
        driver->termios = NULL;
-err_free_p:
+err_free_p: /* destruct_tty_driver will free driver->ports */
        kfree(p);
        return error;
 }
index 6e6dbb7447b6e76beec4a4115d049e6dd00c4735..04419c141b006d802185c209b506527488205020 100644 (file)
@@ -313,6 +313,7 @@ struct tty_driver {
         * Pointer to the tty data structures
         */
        struct tty_struct **ttys;
+       struct tty_port **ports;
        struct ktermios **termios;
        void *driver_state;