|
@@ -1235,27 +1235,20 @@ struct tty_struct *tty_driver_lookup_tty(struct tty_driver *driver,
|
|
|
|
|
|
int tty_init_termios(struct tty_struct *tty)
|
|
int tty_init_termios(struct tty_struct *tty)
|
|
{
|
|
{
|
|
- struct ktermios *tp, *ltp;
|
|
|
|
|
|
+ struct ktermios *tp;
|
|
int idx = tty->index;
|
|
int idx = tty->index;
|
|
|
|
|
|
tp = tty->driver->termios[idx];
|
|
tp = tty->driver->termios[idx];
|
|
- ltp = tty->driver->termios_locked[idx];
|
|
|
|
if (tp == NULL) {
|
|
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;
|
|
return -ENOMEM;
|
|
- }
|
|
|
|
memcpy(tp, &tty->driver->init_termios,
|
|
memcpy(tp, &tty->driver->init_termios,
|
|
sizeof(struct ktermios));
|
|
sizeof(struct ktermios));
|
|
tty->driver->termios[idx] = tp;
|
|
tty->driver->termios[idx] = tp;
|
|
- tty->driver->termios_locked[idx] = ltp;
|
|
|
|
}
|
|
}
|
|
tty->termios = tp;
|
|
tty->termios = tp;
|
|
- tty->termios_locked = ltp;
|
|
|
|
|
|
+ tty->termios_locked = tp + 1;
|
|
|
|
|
|
/* Compatibility until drivers always set this */
|
|
/* Compatibility until drivers always set this */
|
|
tty->termios->c_ispeed = tty_termios_input_baud_rate(tty->termios);
|
|
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;
|
|
tp = tty->termios;
|
|
tty->driver->termios[idx] = NULL;
|
|
tty->driver->termios[idx] = NULL;
|
|
kfree(tp);
|
|
kfree(tp);
|
|
-
|
|
|
|
- tp = tty->termios_locked;
|
|
|
|
- tty->driver->termios_locked[idx] = NULL;
|
|
|
|
- kfree(tp);
|
|
|
|
}
|
|
}
|
|
}
|
|
}
|
|
EXPORT_SYMBOL(tty_free_termios);
|
|
EXPORT_SYMBOL(tty_free_termios);
|
|
@@ -1575,12 +1564,6 @@ void tty_release_dev(struct file *filp)
|
|
idx, tty->name);
|
|
idx, tty->name);
|
|
return;
|
|
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
|
|
#endif
|
|
|
|
|
|
@@ -1604,13 +1587,6 @@ void tty_release_dev(struct file *filp)
|
|
idx, tty->name);
|
|
idx, tty->name);
|
|
return;
|
|
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) {
|
|
if (o_tty->link != tty) {
|
|
printk(KERN_DEBUG "tty_release_dev: bad pty pointers\n");
|
|
printk(KERN_DEBUG "tty_release_dev: bad pty pointers\n");
|
|
return;
|
|
return;
|
|
@@ -2930,18 +2906,13 @@ static void destruct_tty_driver(struct kref *kref)
|
|
driver->termios[i] = NULL;
|
|
driver->termios[i] = NULL;
|
|
kfree(tp);
|
|
kfree(tp);
|
|
}
|
|
}
|
|
- tp = driver->termios_locked[i];
|
|
|
|
- if (tp) {
|
|
|
|
- driver->termios_locked[i] = NULL;
|
|
|
|
- kfree(tp);
|
|
|
|
- }
|
|
|
|
if (!(driver->flags & TTY_DRIVER_DYNAMIC_DEV))
|
|
if (!(driver->flags & TTY_DRIVER_DYNAMIC_DEV))
|
|
tty_unregister_device(driver, i);
|
|
tty_unregister_device(driver, i);
|
|
}
|
|
}
|
|
p = driver->ttys;
|
|
p = driver->ttys;
|
|
proc_tty_unregister_driver(driver);
|
|
proc_tty_unregister_driver(driver);
|
|
driver->ttys = NULL;
|
|
driver->ttys = NULL;
|
|
- driver->termios = driver->termios_locked = NULL;
|
|
|
|
|
|
+ driver->termios = NULL;
|
|
kfree(p);
|
|
kfree(p);
|
|
cdev_del(&driver->cdev);
|
|
cdev_del(&driver->cdev);
|
|
}
|
|
}
|
|
@@ -2978,7 +2949,7 @@ int tty_register_driver(struct tty_driver *driver)
|
|
void **p = NULL;
|
|
void **p = NULL;
|
|
|
|
|
|
if (!(driver->flags & TTY_DRIVER_DEVPTS_MEM) && driver->num) {
|
|
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)
|
|
if (!p)
|
|
return -ENOMEM;
|
|
return -ENOMEM;
|
|
}
|
|
}
|
|
@@ -3002,12 +2973,9 @@ int tty_register_driver(struct tty_driver *driver)
|
|
if (p) {
|
|
if (p) {
|
|
driver->ttys = (struct tty_struct **)p;
|
|
driver->ttys = (struct tty_struct **)p;
|
|
driver->termios = (struct ktermios **)(p + driver->num);
|
|
driver->termios = (struct ktermios **)(p + driver->num);
|
|
- driver->termios_locked = (struct ktermios **)
|
|
|
|
- (p + driver->num * 2);
|
|
|
|
} else {
|
|
} else {
|
|
driver->ttys = NULL;
|
|
driver->ttys = NULL;
|
|
driver->termios = NULL;
|
|
driver->termios = NULL;
|
|
- driver->termios_locked = NULL;
|
|
|
|
}
|
|
}
|
|
|
|
|
|
cdev_init(&driver->cdev, &tty_fops);
|
|
cdev_init(&driver->cdev, &tty_fops);
|
|
@@ -3016,7 +2984,7 @@ int tty_register_driver(struct tty_driver *driver)
|
|
if (error) {
|
|
if (error) {
|
|
unregister_chrdev_region(dev, driver->num);
|
|
unregister_chrdev_region(dev, driver->num);
|
|
driver->ttys = NULL;
|
|
driver->ttys = NULL;
|
|
- driver->termios = driver->termios_locked = NULL;
|
|
|
|
|
|
+ driver->termios = NULL;
|
|
kfree(p);
|
|
kfree(p);
|
|
return error;
|
|
return error;
|
|
}
|
|
}
|