diff options
| author | Jiri Slaby <jslaby@suse.cz> | 2012-06-04 13:35:36 +0200 | 
|---|---|---|
| committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2012-06-13 17:30:54 -0700 | 
| commit | 04831dc154df9b83c3e5fd54b18448da507871f7 (patch) | |
| tree | 45b7ea618adcb9a7e8a009d10d5c9910916d3a9e /drivers/tty/tty_io.c | |
| parent | 9bb8a3d4109f3b267cca9f6f071e2298eed4f593 (diff) | |
| download | olio-linux-3.10-04831dc154df9b83c3e5fd54b18448da507871f7.tar.xz olio-linux-3.10-04831dc154df9b83c3e5fd54b18448da507871f7.zip  | |
TTY: add ports array to tty_driver
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>
Diffstat (limited to 'drivers/tty/tty_io.c')
| -rw-r--r-- | drivers/tty/tty_io.c | 18 | 
1 files changed, 17 insertions, 1 deletions
diff --git a/drivers/tty/tty_io.c b/drivers/tty/tty_io.c index d6e045b7079..ac96f74573d 100644 --- a/drivers/tty/tty_io.c +++ b/drivers/tty/tty_io.c @@ -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;  }  |