]> www.pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - drivers/char/tty_io.c
tty: simplify ktermios allocation
[linux-2.6-omap-h63xx.git] / drivers / char / tty_io.c
index 959083961024727039a05d8a56fdbb198b4c50b6..502cad68f83c8c306fdff00e825eda9c048720ba 100644 (file)
@@ -1235,27 +1235,20 @@ struct tty_struct *tty_driver_lookup_tty(struct tty_driver *driver,
 
 int tty_init_termios(struct tty_struct *tty)
 {
-       struct ktermios *tp, *ltp;
+       struct ktermios *tp;
        int idx = tty->index;
 
        tp = tty->driver->termios[idx];
-       ltp = tty->driver->termios_locked[idx];
        if (tp == NULL) {
-               WARN_ON(ltp != NULL);
-               tp = kmalloc(sizeof(struct ktermios), GFP_KERNEL);
-               ltp = kzalloc(sizeof(struct ktermios), GFP_KERNEL);
-               if (tp == NULL || ltp == NULL) {
-                       kfree(tp);
-                       kfree(ltp);
+               tp = kzalloc(sizeof(struct ktermios[2]), GFP_KERNEL);
+               if (tp == NULL)
                        return -ENOMEM;
-               }
                memcpy(tp, &tty->driver->init_termios,
                                                sizeof(struct ktermios));
                tty->driver->termios[idx] = tp;
-               tty->driver->termios_locked[idx] = ltp;
        }
        tty->termios = tp;
-       tty->termios_locked = ltp;
+       tty->termios_locked = tp + 1;
 
        /* Compatibility until drivers always set this */
        tty->termios->c_ispeed = tty_termios_input_baud_rate(tty->termios);
@@ -1439,10 +1432,6 @@ void tty_free_termios(struct tty_struct *tty)
                tp = tty->termios;
                tty->driver->termios[idx] = NULL;
                kfree(tp);
-
-               tp = tty->termios_locked;
-               tty->driver->termios_locked[idx] = NULL;
-               kfree(tp);
        }
 }
 EXPORT_SYMBOL(tty_free_termios);
@@ -1575,12 +1564,6 @@ void tty_release_dev(struct file *filp)
                               idx, tty->name);
                        return;
                }
-               if (tty->termios_locked != tty->driver->termios_locked[idx]) {
-                       printk(KERN_DEBUG "tty_release_dev: driver.termios_locked[%d] not "
-                              "termios_locked for (%s)\n",
-                              idx, tty->name);
-                       return;
-               }
        }
 #endif
 
@@ -1604,13 +1587,6 @@ void tty_release_dev(struct file *filp)
                               idx, tty->name);
                        return;
                }
-               if (o_tty->termios_locked !=
-                     tty->driver->other->termios_locked[idx]) {
-                       printk(KERN_DEBUG "tty_release_dev: other->termios_locked["
-                                         "%d] not o_termios_locked for (%s)\n",
-                              idx, tty->name);
-                       return;
-               }
                if (o_tty->link != tty) {
                        printk(KERN_DEBUG "tty_release_dev: bad pty pointers\n");
                        return;
@@ -2930,18 +2906,13 @@ static void destruct_tty_driver(struct kref *kref)
                                driver->termios[i] = NULL;
                                kfree(tp);
                        }
-                       tp = driver->termios_locked[i];
-                       if (tp) {
-                               driver->termios_locked[i] = NULL;
-                               kfree(tp);
-                       }
                        if (!(driver->flags & TTY_DRIVER_DYNAMIC_DEV))
                                tty_unregister_device(driver, i);
                }
                p = driver->ttys;
                proc_tty_unregister_driver(driver);
                driver->ttys = NULL;
-               driver->termios = driver->termios_locked = NULL;
+               driver->termios = NULL;
                kfree(p);
                cdev_del(&driver->cdev);
        }
@@ -2978,7 +2949,7 @@ int tty_register_driver(struct tty_driver *driver)
        void **p = NULL;
 
        if (!(driver->flags & TTY_DRIVER_DEVPTS_MEM) && driver->num) {
-               p = kzalloc(driver->num * 3 * sizeof(void *), GFP_KERNEL);
+               p = kzalloc(driver->num * 2 * sizeof(void *), GFP_KERNEL);
                if (!p)
                        return -ENOMEM;
        }
@@ -3002,12 +2973,9 @@ int tty_register_driver(struct tty_driver *driver)
        if (p) {
                driver->ttys = (struct tty_struct **)p;
                driver->termios = (struct ktermios **)(p + driver->num);
-               driver->termios_locked = (struct ktermios **)
-                                                       (p + driver->num * 2);
        } else {
                driver->ttys = NULL;
                driver->termios = NULL;
-               driver->termios_locked = NULL;
        }
 
        cdev_init(&driver->cdev, &tty_fops);
@@ -3016,7 +2984,7 @@ int tty_register_driver(struct tty_driver *driver)
        if (error) {
                unregister_chrdev_region(dev, driver->num);
                driver->ttys = NULL;
-               driver->termios = driver->termios_locked = NULL;
+               driver->termios = NULL;
                kfree(p);
                return error;
        }