Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 191c5f10 authored by Jiri Slaby's avatar Jiri Slaby Committed by Greg Kroah-Hartman
Browse files

TTY: call tty_port_destroy in the rest of drivers



After commit "TTY: move tty buffers to tty_port", the tty buffers are
not freed in some drivers. This is because tty_port_destructor is not
called whenever a tty_port is freed. This was an assumption I counted
with but was unfortunately untrue. So fix the drivers to fulfil this
assumption.

To be sure, the TTY buffers (and later some stuff) are gone along with
the tty_port, we have to call tty_port_destroy at tear-down places.
This is mostly where the structure containing a tty_port is freed.
This patch does exactly that -- put tty_port_destroy at those places.

Signed-off-by: default avatarJiri Slaby <jslaby@suse.cz>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent d0f59141
Loading
Loading
Loading
Loading
+4 −1
Original line number Original line Diff line number Diff line
@@ -205,7 +205,6 @@ static const struct tty_operations srmcons_ops = {
static int __init
static int __init
srmcons_init(void)
srmcons_init(void)
{
{
	tty_port_init(&srmcons_singleton.port);
	setup_timer(&srmcons_singleton.timer, srmcons_receive_chars,
	setup_timer(&srmcons_singleton.timer, srmcons_receive_chars,
			(unsigned long)&srmcons_singleton);
			(unsigned long)&srmcons_singleton);
	if (srm_is_registered_console) {
	if (srm_is_registered_console) {
@@ -215,6 +214,9 @@ srmcons_init(void)
		driver = alloc_tty_driver(MAX_SRM_CONSOLE_DEVICES);
		driver = alloc_tty_driver(MAX_SRM_CONSOLE_DEVICES);
		if (!driver)
		if (!driver)
			return -ENOMEM;
			return -ENOMEM;

		tty_port_init(&srmcons_singleton.port);

		driver->driver_name = "srm";
		driver->driver_name = "srm";
		driver->name = "srm";
		driver->name = "srm";
		driver->major = 0; 	/* dynamic */
		driver->major = 0; 	/* dynamic */
@@ -227,6 +229,7 @@ srmcons_init(void)
		err = tty_register_driver(driver);
		err = tty_register_driver(driver);
		if (err) {
		if (err) {
			put_tty_driver(driver);
			put_tty_driver(driver);
			tty_port_destroy(&srmcons_singleton.port);
			return err;
			return err;
		}
		}
		srmcons_driver = driver;
		srmcons_driver = driver;
+1 −0
Original line number Original line Diff line number Diff line
@@ -555,6 +555,7 @@ static int __init simrs_init(void)
	return 0;
	return 0;
err_free_tty:
err_free_tty:
	put_tty_driver(hp_simserial_driver);
	put_tty_driver(hp_simserial_driver);
	tty_port_destroy(&state->port);
	return retval;
	return retval;
}
}


+4 −2
Original line number Original line Diff line number Diff line
@@ -120,8 +120,6 @@ static int __init nfcon_init(void)
{
{
	int res;
	int res;


	tty_port_init(&nfcon_tty_port);

	stderr_id = nf_get_id("NF_STDERR");
	stderr_id = nf_get_id("NF_STDERR");
	if (!stderr_id)
	if (!stderr_id)
		return -ENODEV;
		return -ENODEV;
@@ -130,6 +128,8 @@ static int __init nfcon_init(void)
	if (!nfcon_tty_driver)
	if (!nfcon_tty_driver)
		return -ENOMEM;
		return -ENOMEM;


	tty_port_init(&nfcon_tty_port);

	nfcon_tty_driver->driver_name = "nfcon";
	nfcon_tty_driver->driver_name = "nfcon";
	nfcon_tty_driver->name = "nfcon";
	nfcon_tty_driver->name = "nfcon";
	nfcon_tty_driver->type = TTY_DRIVER_TYPE_SYSTEM;
	nfcon_tty_driver->type = TTY_DRIVER_TYPE_SYSTEM;
@@ -143,6 +143,7 @@ static int __init nfcon_init(void)
	if (res) {
	if (res) {
		pr_err("failed to register nfcon tty driver\n");
		pr_err("failed to register nfcon tty driver\n");
		put_tty_driver(nfcon_tty_driver);
		put_tty_driver(nfcon_tty_driver);
		tty_port_destroy(&nfcon_tty_port);
		return res;
		return res;
	}
	}


@@ -157,6 +158,7 @@ static void __exit nfcon_exit(void)
	unregister_console(&nf_console);
	unregister_console(&nf_console);
	tty_unregister_driver(nfcon_tty_driver);
	tty_unregister_driver(nfcon_tty_driver);
	put_tty_driver(nfcon_tty_driver);
	put_tty_driver(nfcon_tty_driver);
	tty_port_destroy(&nfcon_tty_port);
}
}


module_init(nfcon_init);
module_init(nfcon_init);
+3 −2
Original line number Original line Diff line number Diff line
@@ -186,13 +186,13 @@ static int __init pdc_console_tty_driver_init(void)
	printk(KERN_INFO "The PDC console driver is still registered, removing CON_BOOT flag\n");
	printk(KERN_INFO "The PDC console driver is still registered, removing CON_BOOT flag\n");
	pdc_cons.flags &= ~CON_BOOT;
	pdc_cons.flags &= ~CON_BOOT;


	tty_port_init(&tty_port);

	pdc_console_tty_driver = alloc_tty_driver(1);
	pdc_console_tty_driver = alloc_tty_driver(1);


	if (!pdc_console_tty_driver)
	if (!pdc_console_tty_driver)
		return -ENOMEM;
		return -ENOMEM;


	tty_port_init(&tty_port);

	pdc_console_tty_driver->driver_name = "pdc_cons";
	pdc_console_tty_driver->driver_name = "pdc_cons";
	pdc_console_tty_driver->name = "ttyB";
	pdc_console_tty_driver->name = "ttyB";
	pdc_console_tty_driver->major = MUX_MAJOR;
	pdc_console_tty_driver->major = MUX_MAJOR;
@@ -207,6 +207,7 @@ static int __init pdc_console_tty_driver_init(void)
	err = tty_register_driver(pdc_console_tty_driver);
	err = tty_register_driver(pdc_console_tty_driver);
	if (err) {
	if (err) {
		printk(KERN_ERR "Unable to register the PDC console TTY driver\n");
		printk(KERN_ERR "Unable to register the PDC console TTY driver\n");
		tty_port_destroy(&tty_port);
		return err;
		return err;
	}
	}


+2 −0
Original line number Original line Diff line number Diff line
@@ -584,6 +584,8 @@ int register_lines(struct line_driver *line_driver,
		printk(KERN_ERR "register_lines : can't register %s driver\n",
		printk(KERN_ERR "register_lines : can't register %s driver\n",
		       line_driver->name);
		       line_driver->name);
		put_tty_driver(driver);
		put_tty_driver(driver);
		for (i = 0; i < nlines; i++)
			tty_port_destroy(&lines[i].port);
		return err;
		return err;
	}
	}


Loading