Commit 191c5f10275cfbb36802edadbdb10c73537327b4
Committed by
Greg Kroah-Hartman
1 parent
d0f59141ca
Exists in
smarc-l5.0.0_1.0.0-ga
and in
5 other branches
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: Jiri Slaby <jslaby@suse.cz> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Showing 41 changed files with 139 additions and 40 deletions Side-by-side Diff
- arch/alpha/kernel/srmcons.c
- arch/ia64/hp/sim/simserial.c
- arch/m68k/emu/nfcon.c
- arch/parisc/kernel/pdc_cons.c
- arch/um/drivers/line.c
- arch/xtensa/platforms/iss/console.c
- drivers/char/pcmcia/synclink_cs.c
- drivers/char/ttyprintk.c
- drivers/isdn/gigaset/common.c
- drivers/isdn/i4l/isdn_tty.c
- drivers/misc/pti.c
- drivers/net/usb/hso.c
- drivers/s390/char/con3215.c
- drivers/s390/char/sclp_tty.c
- drivers/s390/char/sclp_vt220.c
- drivers/s390/char/tty3270.c
- drivers/staging/ccg/u_serial.c
- drivers/staging/dgrp/dgrp_specproc.c
- drivers/staging/dgrp/dgrp_tty.c
- drivers/staging/ipack/devices/ipoctal.c
- drivers/tty/amiserial.c
- drivers/tty/bfin_jtag_comm.c
- drivers/tty/cyclades.c
- drivers/tty/ehv_bytechan.c
- drivers/tty/hvc/hvsi.c
- drivers/tty/ipwireless/tty.c
- drivers/tty/moxa.c
- drivers/tty/mxser.c
- drivers/tty/nozomi.c
- drivers/tty/rocket.c
- drivers/tty/serial/68328serial.c
- drivers/tty/serial/ifx6x60.c
- drivers/tty/serial/kgdb_nmi.c
- drivers/tty/serial/serial_core.c
- drivers/tty/synclink.c
- drivers/tty/synclink_gt.c
- drivers/tty/synclinkmp.c
- drivers/tty/vt/vt.c
- drivers/usb/gadget/u_serial.c
- drivers/usb/serial/usb-serial.c
- net/irda/ircomm/ircomm_tty.c
arch/alpha/kernel/srmcons.c
... | ... | @@ -205,7 +205,6 @@ |
205 | 205 | static int __init |
206 | 206 | srmcons_init(void) |
207 | 207 | { |
208 | - tty_port_init(&srmcons_singleton.port); | |
209 | 208 | setup_timer(&srmcons_singleton.timer, srmcons_receive_chars, |
210 | 209 | (unsigned long)&srmcons_singleton); |
211 | 210 | if (srm_is_registered_console) { |
... | ... | @@ -215,6 +214,9 @@ |
215 | 214 | driver = alloc_tty_driver(MAX_SRM_CONSOLE_DEVICES); |
216 | 215 | if (!driver) |
217 | 216 | return -ENOMEM; |
217 | + | |
218 | + tty_port_init(&srmcons_singleton.port); | |
219 | + | |
218 | 220 | driver->driver_name = "srm"; |
219 | 221 | driver->name = "srm"; |
220 | 222 | driver->major = 0; /* dynamic */ |
... | ... | @@ -227,6 +229,7 @@ |
227 | 229 | err = tty_register_driver(driver); |
228 | 230 | if (err) { |
229 | 231 | put_tty_driver(driver); |
232 | + tty_port_destroy(&srmcons_singleton.port); | |
230 | 233 | return err; |
231 | 234 | } |
232 | 235 | srmcons_driver = driver; |
arch/ia64/hp/sim/simserial.c
arch/m68k/emu/nfcon.c
... | ... | @@ -120,8 +120,6 @@ |
120 | 120 | { |
121 | 121 | int res; |
122 | 122 | |
123 | - tty_port_init(&nfcon_tty_port); | |
124 | - | |
125 | 123 | stderr_id = nf_get_id("NF_STDERR"); |
126 | 124 | if (!stderr_id) |
127 | 125 | return -ENODEV; |
... | ... | @@ -130,6 +128,8 @@ |
130 | 128 | if (!nfcon_tty_driver) |
131 | 129 | return -ENOMEM; |
132 | 130 | |
131 | + tty_port_init(&nfcon_tty_port); | |
132 | + | |
133 | 133 | nfcon_tty_driver->driver_name = "nfcon"; |
134 | 134 | nfcon_tty_driver->name = "nfcon"; |
135 | 135 | nfcon_tty_driver->type = TTY_DRIVER_TYPE_SYSTEM; |
... | ... | @@ -143,6 +143,7 @@ |
143 | 143 | if (res) { |
144 | 144 | pr_err("failed to register nfcon tty driver\n"); |
145 | 145 | put_tty_driver(nfcon_tty_driver); |
146 | + tty_port_destroy(&nfcon_tty_port); | |
146 | 147 | return res; |
147 | 148 | } |
148 | 149 | |
... | ... | @@ -157,6 +158,7 @@ |
157 | 158 | unregister_console(&nf_console); |
158 | 159 | tty_unregister_driver(nfcon_tty_driver); |
159 | 160 | put_tty_driver(nfcon_tty_driver); |
161 | + tty_port_destroy(&nfcon_tty_port); | |
160 | 162 | } |
161 | 163 | |
162 | 164 | module_init(nfcon_init); |
arch/parisc/kernel/pdc_cons.c
... | ... | @@ -186,13 +186,13 @@ |
186 | 186 | printk(KERN_INFO "The PDC console driver is still registered, removing CON_BOOT flag\n"); |
187 | 187 | pdc_cons.flags &= ~CON_BOOT; |
188 | 188 | |
189 | - tty_port_init(&tty_port); | |
190 | - | |
191 | 189 | pdc_console_tty_driver = alloc_tty_driver(1); |
192 | 190 | |
193 | 191 | if (!pdc_console_tty_driver) |
194 | 192 | return -ENOMEM; |
195 | 193 | |
194 | + tty_port_init(&tty_port); | |
195 | + | |
196 | 196 | pdc_console_tty_driver->driver_name = "pdc_cons"; |
197 | 197 | pdc_console_tty_driver->name = "ttyB"; |
198 | 198 | pdc_console_tty_driver->major = MUX_MAJOR; |
... | ... | @@ -207,6 +207,7 @@ |
207 | 207 | err = tty_register_driver(pdc_console_tty_driver); |
208 | 208 | if (err) { |
209 | 209 | printk(KERN_ERR "Unable to register the PDC console TTY driver\n"); |
210 | + tty_port_destroy(&tty_port); | |
210 | 211 | return err; |
211 | 212 | } |
212 | 213 |
arch/um/drivers/line.c
arch/xtensa/platforms/iss/console.c
drivers/char/pcmcia/synclink_cs.c
... | ... | @@ -549,8 +549,10 @@ |
549 | 549 | /* Initialize the struct pcmcia_device structure */ |
550 | 550 | |
551 | 551 | ret = mgslpc_config(link); |
552 | - if (ret) | |
552 | + if (ret) { | |
553 | + tty_port_destroy(&info->port); | |
553 | 554 | return ret; |
555 | + } | |
554 | 556 | |
555 | 557 | mgslpc_add_device(info); |
556 | 558 | |
... | ... | @@ -2757,6 +2759,7 @@ |
2757 | 2759 | hdlcdev_exit(info); |
2758 | 2760 | #endif |
2759 | 2761 | release_resources(info); |
2762 | + tty_port_destroy(&info->port); | |
2760 | 2763 | kfree(info); |
2761 | 2764 | mgslpc_device_count--; |
2762 | 2765 | return; |
drivers/char/ttyprintk.c
... | ... | @@ -179,7 +179,6 @@ |
179 | 179 | { |
180 | 180 | int ret = -ENOMEM; |
181 | 181 | |
182 | - tty_port_init(&tpk_port.port); | |
183 | 182 | tpk_port.port.ops = &null_ops; |
184 | 183 | mutex_init(&tpk_port.port_write_mutex); |
185 | 184 | |
... | ... | @@ -190,6 +189,8 @@ |
190 | 189 | if (IS_ERR(ttyprintk_driver)) |
191 | 190 | return PTR_ERR(ttyprintk_driver); |
192 | 191 | |
192 | + tty_port_init(&tpk_port.port); | |
193 | + | |
193 | 194 | ttyprintk_driver->driver_name = "ttyprintk"; |
194 | 195 | ttyprintk_driver->name = "ttyprintk"; |
195 | 196 | ttyprintk_driver->major = TTYAUX_MAJOR; |
... | ... | @@ -211,6 +212,7 @@ |
211 | 212 | error: |
212 | 213 | tty_unregister_driver(ttyprintk_driver); |
213 | 214 | put_tty_driver(ttyprintk_driver); |
215 | + tty_port_destroy(&tpk_port.port); | |
214 | 216 | ttyprintk_driver = NULL; |
215 | 217 | return ret; |
216 | 218 | } |
drivers/isdn/gigaset/common.c
... | ... | @@ -518,6 +518,7 @@ |
518 | 518 | kfree(cs->bcs); |
519 | 519 | f_cs: gig_dbg(DEBUG_INIT, "freeing cs"); |
520 | 520 | mutex_unlock(&cs->mutex); |
521 | + tty_port_destroy(&cs->port); | |
521 | 522 | free_cs(cs); |
522 | 523 | } |
523 | 524 | EXPORT_SYMBOL_GPL(gigaset_freecs); |
524 | 525 | |
... | ... | @@ -751,14 +752,14 @@ |
751 | 752 | gig_dbg(DEBUG_INIT, "setting up iif"); |
752 | 753 | if (gigaset_isdn_regdev(cs, modulename) < 0) { |
753 | 754 | pr_err("error registering ISDN device\n"); |
754 | - goto error; | |
755 | + goto error_port; | |
755 | 756 | } |
756 | 757 | |
757 | 758 | make_valid(cs, VALID_ID); |
758 | 759 | ++cs->cs_init; |
759 | 760 | gig_dbg(DEBUG_INIT, "setting up hw"); |
760 | 761 | if (cs->ops->initcshw(cs) < 0) |
761 | - goto error; | |
762 | + goto error_port; | |
762 | 763 | |
763 | 764 | ++cs->cs_init; |
764 | 765 | |
... | ... | @@ -773,7 +774,7 @@ |
773 | 774 | gig_dbg(DEBUG_INIT, "setting up bcs[%d]", i); |
774 | 775 | if (gigaset_initbcs(cs->bcs + i, cs, i) < 0) { |
775 | 776 | pr_err("could not allocate channel %d data\n", i); |
776 | - goto error; | |
777 | + goto error_port; | |
777 | 778 | } |
778 | 779 | } |
779 | 780 | |
... | ... | @@ -786,7 +787,8 @@ |
786 | 787 | |
787 | 788 | gig_dbg(DEBUG_INIT, "cs initialized"); |
788 | 789 | return cs; |
789 | - | |
790 | +error_port: | |
791 | + tty_port_destroy(&cs->port); | |
790 | 792 | error: |
791 | 793 | gig_dbg(DEBUG_INIT, "failed"); |
792 | 794 | gigaset_freecs(cs); |
drivers/isdn/i4l/isdn_tty.c
... | ... | @@ -1849,6 +1849,8 @@ |
1849 | 1849 | kfree(info->fax); |
1850 | 1850 | #endif |
1851 | 1851 | kfree(info->port.xmit_buf - 4); |
1852 | + info->port.xmit_buf = NULL; | |
1853 | + tty_port_destroy(&info->port); | |
1852 | 1854 | } |
1853 | 1855 | tty_unregister_driver(m->tty_modem); |
1854 | 1856 | err: |
... | ... | @@ -1870,6 +1872,8 @@ |
1870 | 1872 | kfree(info->fax); |
1871 | 1873 | #endif |
1872 | 1874 | kfree(info->port.xmit_buf - 4); |
1875 | + info->port.xmit_buf = NULL; | |
1876 | + tty_port_destroy(&info->port); | |
1873 | 1877 | } |
1874 | 1878 | tty_unregister_driver(dev->mdm.tty_modem); |
1875 | 1879 | put_tty_driver(dev->mdm.tty_modem); |
drivers/misc/pti.c
... | ... | @@ -882,11 +882,14 @@ |
882 | 882 | static void __devexit pti_pci_remove(struct pci_dev *pdev) |
883 | 883 | { |
884 | 884 | struct pti_dev *drv_data = pci_get_drvdata(pdev); |
885 | + unsigned int a; | |
885 | 886 | |
886 | 887 | unregister_console(&pti_console); |
887 | 888 | |
888 | - tty_unregister_device(pti_tty_driver, 0); | |
889 | - tty_unregister_device(pti_tty_driver, 1); | |
889 | + for (a = 0; a < PTITTY_MINOR_NUM; a++) { | |
890 | + tty_unregister_device(pti_tty_driver, a); | |
891 | + tty_port_destroy(&drv_data->port[a]); | |
892 | + } | |
890 | 893 | |
891 | 894 | iounmap(drv_data->pti_ioaddr); |
892 | 895 | pci_set_drvdata(pdev, NULL); |
drivers/net/usb/hso.c
... | ... | @@ -2274,6 +2274,7 @@ |
2274 | 2274 | /* unlink and free TX URB */ |
2275 | 2275 | usb_free_urb(serial->tx_urb); |
2276 | 2276 | kfree(serial->tx_data); |
2277 | + tty_port_destroy(&serial->port); | |
2277 | 2278 | } |
2278 | 2279 | |
2279 | 2280 | static int hso_serial_common_create(struct hso_serial *serial, int num_urbs, |
2280 | 2281 | |
... | ... | @@ -2283,11 +2284,11 @@ |
2283 | 2284 | int minor; |
2284 | 2285 | int i; |
2285 | 2286 | |
2287 | + tty_port_init(&serial->port); | |
2288 | + | |
2286 | 2289 | minor = get_free_serial_index(); |
2287 | 2290 | if (minor < 0) |
2288 | 2291 | goto exit; |
2289 | - | |
2290 | - tty_port_init(&serial->port); | |
2291 | 2292 | |
2292 | 2293 | /* register our minor number */ |
2293 | 2294 | serial->parent->dev = tty_port_register_device(&serial->port, tty_drv, |
drivers/s390/char/con3215.c
drivers/s390/char/sclp_tty.c
... | ... | @@ -547,7 +547,6 @@ |
547 | 547 | sclp_tty_tolower = 1; |
548 | 548 | } |
549 | 549 | sclp_tty_chars_count = 0; |
550 | - tty_port_init(&sclp_port); | |
551 | 550 | |
552 | 551 | rc = sclp_register(&sclp_input_event); |
553 | 552 | if (rc) { |
... | ... | @@ -555,6 +554,8 @@ |
555 | 554 | return rc; |
556 | 555 | } |
557 | 556 | |
557 | + tty_port_init(&sclp_port); | |
558 | + | |
558 | 559 | driver->driver_name = "sclp_line"; |
559 | 560 | driver->name = "sclp_line"; |
560 | 561 | driver->major = TTY_MAJOR; |
... | ... | @@ -571,6 +572,7 @@ |
571 | 572 | rc = tty_register_driver(driver); |
572 | 573 | if (rc) { |
573 | 574 | put_tty_driver(driver); |
575 | + tty_port_destroy(&sclp_port); | |
574 | 576 | return rc; |
575 | 577 | } |
576 | 578 | sclp_tty_driver = driver; |
drivers/s390/char/sclp_vt220.c
... | ... | @@ -615,6 +615,7 @@ |
615 | 615 | return; |
616 | 616 | sclp_unregister(&sclp_vt220_register); |
617 | 617 | __sclp_vt220_free_pages(); |
618 | + tty_port_destroy(&sclp_vt220_port); | |
618 | 619 | } |
619 | 620 | |
620 | 621 | /* Allocate buffer pages and register with sclp core. Controlled by init |
... | ... | @@ -650,6 +651,7 @@ |
650 | 651 | if (rc) { |
651 | 652 | __sclp_vt220_free_pages(); |
652 | 653 | sclp_vt220_init_count--; |
654 | + tty_port_destroy(&sclp_vt220_port); | |
653 | 655 | } |
654 | 656 | return rc; |
655 | 657 | } |
drivers/s390/char/tty3270.c
... | ... | @@ -722,6 +722,7 @@ |
722 | 722 | while (pages--) |
723 | 723 | free_pages((unsigned long) tp->freemem_pages[pages], 0); |
724 | 724 | kfree(tp->freemem_pages); |
725 | + tty_port_destroy(&tp->port); | |
725 | 726 | out_tp: |
726 | 727 | kfree(tp); |
727 | 728 | out_err: |
... | ... | @@ -744,6 +745,7 @@ |
744 | 745 | for (pages = 0; pages < TTY3270_STRING_PAGES; pages++) |
745 | 746 | free_pages((unsigned long) tp->freemem_pages[pages], 0); |
746 | 747 | kfree(tp->freemem_pages); |
748 | + tty_port_destroy(&tp->port); | |
747 | 749 | kfree(tp); |
748 | 750 | } |
749 | 751 |
drivers/staging/ccg/u_serial.c
... | ... | @@ -1140,8 +1140,10 @@ |
1140 | 1140 | |
1141 | 1141 | return status; |
1142 | 1142 | fail: |
1143 | - while (count--) | |
1143 | + while (count--) { | |
1144 | + tty_port_destroy(&ports[count].port->port); | |
1144 | 1145 | kfree(ports[count].port); |
1146 | + } | |
1145 | 1147 | put_tty_driver(gs_tty_driver); |
1146 | 1148 | gs_tty_driver = NULL; |
1147 | 1149 | return status; |
... | ... | @@ -1195,6 +1197,7 @@ |
1195 | 1197 | |
1196 | 1198 | WARN_ON(port->port_usb != NULL); |
1197 | 1199 | |
1200 | + tty_port_destroy(&port->port); | |
1198 | 1201 | kfree(port); |
1199 | 1202 | } |
1200 | 1203 | n_ports = 0; |
drivers/staging/dgrp/dgrp_specproc.c
drivers/staging/dgrp/dgrp_tty.c
... | ... | @@ -3119,6 +3119,7 @@ |
3119 | 3119 | void |
3120 | 3120 | dgrp_tty_uninit(struct nd_struct *nd) |
3121 | 3121 | { |
3122 | + unsigned int i; | |
3122 | 3123 | char id[3]; |
3123 | 3124 | |
3124 | 3125 | ID_TO_CHAR(nd->nd_ID, id); |
... | ... | @@ -3152,6 +3153,8 @@ |
3152 | 3153 | put_tty_driver(nd->nd_xprint_ttdriver); |
3153 | 3154 | nd->nd_ttdriver_flags &= ~XPRINT_TTDRV_REG; |
3154 | 3155 | } |
3156 | + for (i = 0; i < CHAN_MAX; i++) | |
3157 | + tty_port_destroy(&nd->nd_chan[i].port); | |
3155 | 3158 | } |
3156 | 3159 | |
3157 | 3160 | |
... | ... | @@ -3334,7 +3337,6 @@ |
3334 | 3337 | |
3335 | 3338 | init_waitqueue_head(&(ch->ch_pun.un_open_wait)); |
3336 | 3339 | init_waitqueue_head(&(ch->ch_pun.un_close_wait)); |
3337 | - tty_port_init(&ch->port); | |
3338 | 3340 | tty_port_init(&ch->port); |
3339 | 3341 | } |
3340 | 3342 | return 0; |
drivers/staging/ipack/devices/ipoctal.c
... | ... | @@ -446,6 +446,7 @@ |
446 | 446 | tty_dev = tty_port_register_device(&channel->tty_port, tty, i, NULL); |
447 | 447 | if (IS_ERR(tty_dev)) { |
448 | 448 | dev_err(&ipoctal->dev->dev, "Failed to register tty device.\n"); |
449 | + tty_port_destroy(&channel->tty_port); | |
449 | 450 | continue; |
450 | 451 | } |
451 | 452 | dev_set_drvdata(tty_dev, channel); |
... | ... | @@ -741,6 +742,7 @@ |
741 | 742 | struct ipoctal_channel *channel = &ipoctal->channel[i]; |
742 | 743 | tty_unregister_device(ipoctal->tty_drv, i); |
743 | 744 | tty_port_free_xmit_buf(&channel->tty_port); |
745 | + tty_port_destroy(&channel->tty_port); | |
744 | 746 | } |
745 | 747 | |
746 | 748 | tty_unregister_driver(ipoctal->tty_drv); |
drivers/tty/amiserial.c
... | ... | @@ -1771,6 +1771,7 @@ |
1771 | 1771 | fail_unregister: |
1772 | 1772 | tty_unregister_driver(serial_driver); |
1773 | 1773 | fail_put_tty_driver: |
1774 | + tty_port_destroy(&state->tport); | |
1774 | 1775 | put_tty_driver(serial_driver); |
1775 | 1776 | return error; |
1776 | 1777 | } |
... | ... | @@ -1785,6 +1786,7 @@ |
1785 | 1786 | printk("SERIAL: failed to unregister serial driver (%d)\n", |
1786 | 1787 | error); |
1787 | 1788 | put_tty_driver(serial_driver); |
1789 | + tty_port_destroy(&state->tport); | |
1788 | 1790 | |
1789 | 1791 | free_irq(IRQ_AMIGA_TBE, state); |
1790 | 1792 | free_irq(IRQ_AMIGA_RBF, state); |
drivers/tty/bfin_jtag_comm.c
... | ... | @@ -240,8 +240,6 @@ |
240 | 240 | { |
241 | 241 | int ret; |
242 | 242 | |
243 | - tty_port_init(&port); | |
244 | - | |
245 | 243 | bfin_jc_kthread = kthread_create(bfin_jc_emudat_manager, NULL, DRV_NAME); |
246 | 244 | if (IS_ERR(bfin_jc_kthread)) |
247 | 245 | return PTR_ERR(bfin_jc_kthread); |
... | ... | @@ -257,6 +255,8 @@ |
257 | 255 | if (!bfin_jc_driver) |
258 | 256 | goto err_driver; |
259 | 257 | |
258 | + tty_port_init(&port); | |
259 | + | |
260 | 260 | bfin_jc_driver->driver_name = DRV_NAME; |
261 | 261 | bfin_jc_driver->name = DEV_NAME; |
262 | 262 | bfin_jc_driver->type = TTY_DRIVER_TYPE_SERIAL; |
... | ... | @@ -274,6 +274,7 @@ |
274 | 274 | return 0; |
275 | 275 | |
276 | 276 | err: |
277 | + tty_port_destroy(&port); | |
277 | 278 | put_tty_driver(bfin_jc_driver); |
278 | 279 | err_driver: |
279 | 280 | kfree(bfin_jc_write_buf.buf); |
... | ... | @@ -289,6 +290,7 @@ |
289 | 290 | kfree(bfin_jc_write_buf.buf); |
290 | 291 | tty_unregister_driver(bfin_jc_driver); |
291 | 292 | put_tty_driver(bfin_jc_driver); |
293 | + tty_port_destroy(&port); | |
292 | 294 | } |
293 | 295 | module_exit(bfin_jc_exit); |
294 | 296 |
drivers/tty/cyclades.c
... | ... | @@ -3934,7 +3934,7 @@ |
3934 | 3934 | static void __devexit cy_pci_remove(struct pci_dev *pdev) |
3935 | 3935 | { |
3936 | 3936 | struct cyclades_card *cinfo = pci_get_drvdata(pdev); |
3937 | - unsigned int i; | |
3937 | + unsigned int i, channel; | |
3938 | 3938 | |
3939 | 3939 | /* non-Z with old PLX */ |
3940 | 3940 | if (!cy_is_Z(cinfo) && (readb(cinfo->base_addr + CyPLX_VER) & 0x0f) == |
3941 | 3941 | |
... | ... | @@ -3960,9 +3960,11 @@ |
3960 | 3960 | pci_release_regions(pdev); |
3961 | 3961 | |
3962 | 3962 | cinfo->base_addr = NULL; |
3963 | - for (i = cinfo->first_line; i < cinfo->first_line + | |
3964 | - cinfo->nports; i++) | |
3963 | + for (channel = 0, i = cinfo->first_line; i < cinfo->first_line + | |
3964 | + cinfo->nports; i++, channel++) { | |
3965 | 3965 | tty_unregister_device(cy_serial_driver, i); |
3966 | + tty_port_destroy(&cinfo->ports[channel].port); | |
3967 | + } | |
3966 | 3968 | cinfo->nports = 0; |
3967 | 3969 | kfree(cinfo->ports); |
3968 | 3970 | } |
drivers/tty/ehv_bytechan.c
... | ... | @@ -757,6 +757,7 @@ |
757 | 757 | return 0; |
758 | 758 | |
759 | 759 | error: |
760 | + tty_port_destroy(&bc->port); | |
760 | 761 | irq_dispose_mapping(bc->tx_irq); |
761 | 762 | irq_dispose_mapping(bc->rx_irq); |
762 | 763 | |
... | ... | @@ -770,6 +771,7 @@ |
770 | 771 | |
771 | 772 | tty_unregister_device(ehv_bc_driver, bc - bcs); |
772 | 773 | |
774 | + tty_port_destroy(&bc->port); | |
773 | 775 | irq_dispose_mapping(bc->tx_irq); |
774 | 776 | irq_dispose_mapping(bc->rx_irq); |
775 | 777 |
drivers/tty/hvc/hvsi.c
drivers/tty/ipwireless/tty.c
drivers/tty/moxa.c
... | ... | @@ -895,6 +895,8 @@ |
895 | 895 | |
896 | 896 | return 0; |
897 | 897 | err_free: |
898 | + for (i = 0; i < MAX_PORTS_PER_BOARD; i++) | |
899 | + tty_port_destroy(&brd->ports[i].port); | |
898 | 900 | kfree(brd->ports); |
899 | 901 | err: |
900 | 902 | return ret; |
... | ... | @@ -919,6 +921,8 @@ |
919 | 921 | tty_kref_put(tty); |
920 | 922 | } |
921 | 923 | } |
924 | + for (a = 0; a < MAX_PORTS_PER_BOARD; a++) | |
925 | + tty_port_destroy(&brd->ports[a].port); | |
922 | 926 | while (1) { |
923 | 927 | opened = 0; |
924 | 928 | for (a = 0; a < brd->numPorts; a++) |
drivers/tty/mxser.c
... | ... | @@ -2411,14 +2411,27 @@ |
2411 | 2411 | |
2412 | 2412 | retval = request_irq(brd->irq, mxser_interrupt, IRQF_SHARED, "mxser", |
2413 | 2413 | brd); |
2414 | - if (retval) | |
2414 | + if (retval) { | |
2415 | + for (i = 0; i < brd->info->nports; i++) | |
2416 | + tty_port_destroy(&brd->ports[i].port); | |
2415 | 2417 | printk(KERN_ERR "Board %s: Request irq failed, IRQ (%d) may " |
2416 | 2418 | "conflict with another device.\n", |
2417 | 2419 | brd->info->name, brd->irq); |
2420 | + } | |
2418 | 2421 | |
2419 | 2422 | return retval; |
2420 | 2423 | } |
2421 | 2424 | |
2425 | +static void mxser_board_remove(struct mxser_board *brd) | |
2426 | +{ | |
2427 | + unsigned int i; | |
2428 | + | |
2429 | + for (i = 0; i < brd->info->nports; i++) { | |
2430 | + tty_unregister_device(mxvar_sdriver, brd->idx + i); | |
2431 | + tty_port_destroy(&brd->ports[i].port); | |
2432 | + } | |
2433 | +} | |
2434 | + | |
2422 | 2435 | static int __init mxser_get_ISA_conf(int cap, struct mxser_board *brd) |
2423 | 2436 | { |
2424 | 2437 | int id, i, bits, ret; |
2425 | 2438 | |
... | ... | @@ -2649,10 +2662,8 @@ |
2649 | 2662 | { |
2650 | 2663 | #ifdef CONFIG_PCI |
2651 | 2664 | struct mxser_board *brd = pci_get_drvdata(pdev); |
2652 | - unsigned int i; | |
2653 | 2665 | |
2654 | - for (i = 0; i < brd->info->nports; i++) | |
2655 | - tty_unregister_device(mxvar_sdriver, brd->idx + i); | |
2666 | + mxser_board_remove(brd); | |
2656 | 2667 | |
2657 | 2668 | free_irq(pdev->irq, brd); |
2658 | 2669 | pci_release_region(pdev, 2); |
2659 | 2670 | |
... | ... | @@ -2748,15 +2759,13 @@ |
2748 | 2759 | |
2749 | 2760 | static void __exit mxser_module_exit(void) |
2750 | 2761 | { |
2751 | - unsigned int i, j; | |
2762 | + unsigned int i; | |
2752 | 2763 | |
2753 | 2764 | pci_unregister_driver(&mxser_driver); |
2754 | 2765 | |
2755 | 2766 | for (i = 0; i < MXSER_BOARDS; i++) /* ISA remains */ |
2756 | 2767 | if (mxser_boards[i].info != NULL) |
2757 | - for (j = 0; j < mxser_boards[i].info->nports; j++) | |
2758 | - tty_unregister_device(mxvar_sdriver, | |
2759 | - mxser_boards[i].idx + j); | |
2768 | + mxser_board_remove(&mxser_boards[i]); | |
2760 | 2769 | tty_unregister_driver(mxvar_sdriver); |
2761 | 2770 | put_tty_driver(mxvar_sdriver); |
2762 | 2771 |
drivers/tty/nozomi.c
... | ... | @@ -1479,6 +1479,7 @@ |
1479 | 1479 | if (IS_ERR(tty_dev)) { |
1480 | 1480 | ret = PTR_ERR(tty_dev); |
1481 | 1481 | dev_err(&pdev->dev, "Could not allocate tty?\n"); |
1482 | + tty_port_destroy(&port->port); | |
1482 | 1483 | goto err_free_tty; |
1483 | 1484 | } |
1484 | 1485 | } |
... | ... | @@ -1486,8 +1487,10 @@ |
1486 | 1487 | return 0; |
1487 | 1488 | |
1488 | 1489 | err_free_tty: |
1489 | - for (i = dc->index_start; i < dc->index_start + MAX_PORT; ++i) | |
1490 | - tty_unregister_device(ntty_driver, i); | |
1490 | + for (i = 0; i < MAX_PORT; ++i) { | |
1491 | + tty_unregister_device(ntty_driver, dc->index_start + i); | |
1492 | + tty_port_destroy(&dc->port[i].port); | |
1493 | + } | |
1491 | 1494 | err_free_kfifo: |
1492 | 1495 | for (i = 0; i < MAX_PORT; i++) |
1493 | 1496 | kfifo_free(&dc->port[i].fifo_ul); |
... | ... | @@ -1520,8 +1523,10 @@ |
1520 | 1523 | complete off a hangup method ? */ |
1521 | 1524 | while (dc->open_ttys) |
1522 | 1525 | msleep(1); |
1523 | - for (i = dc->index_start; i < dc->index_start + MAX_PORT; ++i) | |
1524 | - tty_unregister_device(ntty_driver, i); | |
1526 | + for (i = 0; i < MAX_PORT; ++i) { | |
1527 | + tty_unregister_device(ntty_driver, dc->index_start + i); | |
1528 | + tty_port_destroy(&dc->port[i].port); | |
1529 | + } | |
1525 | 1530 | } |
1526 | 1531 | |
1527 | 1532 | /* Deallocate memory for one device */ |
drivers/tty/rocket.c
... | ... | @@ -673,6 +673,7 @@ |
673 | 673 | if (sInitChan(ctlp, &info->channel, aiop, chan) == 0) { |
674 | 674 | printk(KERN_ERR "RocketPort sInitChan(%d, %d, %d) failed!\n", |
675 | 675 | board, aiop, chan); |
676 | + tty_port_destroy(&info->port); | |
676 | 677 | kfree(info); |
677 | 678 | return; |
678 | 679 | } |
... | ... | @@ -2357,6 +2358,7 @@ |
2357 | 2358 | for (i = 0; i < MAX_RP_PORTS; i++) |
2358 | 2359 | if (rp_table[i]) { |
2359 | 2360 | tty_unregister_device(rocket_driver, i); |
2361 | + tty_port_destroy(&rp_table[i]->port); | |
2360 | 2362 | kfree(rp_table[i]); |
2361 | 2363 | } |
2362 | 2364 |
drivers/tty/serial/68328serial.c
... | ... | @@ -1225,6 +1225,8 @@ |
1225 | 1225 | |
1226 | 1226 | if (tty_register_driver(serial_driver)) { |
1227 | 1227 | put_tty_driver(serial_driver); |
1228 | + for (i = 0; i < NR_PORTS; i++) | |
1229 | + tty_port_destroy(&m68k_soft[i].tport); | |
1228 | 1230 | printk(KERN_ERR "Couldn't register serial driver\n"); |
1229 | 1231 | return -ENOMEM; |
1230 | 1232 | } |
drivers/tty/serial/ifx6x60.c
... | ... | @@ -829,6 +829,7 @@ |
829 | 829 | { |
830 | 830 | if (ifx_dev->tty_dev) |
831 | 831 | tty_unregister_device(tty_drv, ifx_dev->minor); |
832 | + tty_port_destroy(&ifx_dev->tty_port); | |
832 | 833 | kfifo_free(&ifx_dev->tx_fifo); |
833 | 834 | } |
834 | 835 | |
835 | 836 | |
... | ... | @@ -862,10 +863,12 @@ |
862 | 863 | dev_dbg(&ifx_dev->spi_dev->dev, |
863 | 864 | "%s: registering tty device failed", __func__); |
864 | 865 | ret = PTR_ERR(ifx_dev->tty_dev); |
865 | - goto error_ret; | |
866 | + goto error_port; | |
866 | 867 | } |
867 | 868 | return 0; |
868 | 869 | |
870 | +error_port: | |
871 | + tty_port_destroy(pport); | |
869 | 872 | error_ret: |
870 | 873 | ifx_spi_free_port(ifx_dev); |
871 | 874 | return ret; |
drivers/tty/serial/kgdb_nmi.c
... | ... | @@ -266,6 +266,7 @@ |
266 | 266 | } |
267 | 267 | return 0; |
268 | 268 | err: |
269 | + tty_port_destroy(&priv->port); | |
269 | 270 | kfree(priv); |
270 | 271 | return ret; |
271 | 272 | } |
... | ... | @@ -275,6 +276,7 @@ |
275 | 276 | struct kgdb_nmi_tty_priv *priv = tty->driver_data; |
276 | 277 | |
277 | 278 | tty->driver_data = NULL; |
279 | + tty_port_destroy(&priv->port); | |
278 | 280 | kfree(priv); |
279 | 281 | } |
280 | 282 |
drivers/tty/serial/serial_core.c
... | ... | @@ -2297,6 +2297,8 @@ |
2297 | 2297 | if (retval >= 0) |
2298 | 2298 | return retval; |
2299 | 2299 | |
2300 | + for (i = 0; i < drv->nr; i++) | |
2301 | + tty_port_destroy(&drv->state[i].port); | |
2300 | 2302 | put_tty_driver(normal); |
2301 | 2303 | out_kfree: |
2302 | 2304 | kfree(drv->state); |
2303 | 2305 | |
... | ... | @@ -2316,8 +2318,12 @@ |
2316 | 2318 | void uart_unregister_driver(struct uart_driver *drv) |
2317 | 2319 | { |
2318 | 2320 | struct tty_driver *p = drv->tty_driver; |
2321 | + unsigned int i; | |
2322 | + | |
2319 | 2323 | tty_unregister_driver(p); |
2320 | 2324 | put_tty_driver(p); |
2325 | + for (i = 0; i < drv->nr; i++) | |
2326 | + tty_port_destroy(&drv->state[i].port); | |
2321 | 2327 | kfree(drv->state); |
2322 | 2328 | drv->state = NULL; |
2323 | 2329 | drv->tty_driver = NULL; |
drivers/tty/synclink.c
drivers/tty/synclink_gt.c
... | ... | @@ -3645,8 +3645,10 @@ |
3645 | 3645 | for (i=0; i < port_count; ++i) { |
3646 | 3646 | port_array[i] = alloc_dev(adapter_num, i, pdev); |
3647 | 3647 | if (port_array[i] == NULL) { |
3648 | - for (--i; i >= 0; --i) | |
3648 | + for (--i; i >= 0; --i) { | |
3649 | + tty_port_destroy(&port_array[i]->port); | |
3649 | 3650 | kfree(port_array[i]); |
3651 | + } | |
3650 | 3652 | return; |
3651 | 3653 | } |
3652 | 3654 | } |
... | ... | @@ -3773,6 +3775,7 @@ |
3773 | 3775 | release_resources(info); |
3774 | 3776 | tmp = info; |
3775 | 3777 | info = info->next_device; |
3778 | + tty_port_destroy(&tmp->port); | |
3776 | 3779 | kfree(tmp); |
3777 | 3780 | } |
3778 | 3781 |
drivers/tty/synclinkmp.c
... | ... | @@ -3843,8 +3843,10 @@ |
3843 | 3843 | for ( port = 0; port < SCA_MAX_PORTS; ++port ) { |
3844 | 3844 | port_array[port] = alloc_dev(adapter_num,port,pdev); |
3845 | 3845 | if( port_array[port] == NULL ) { |
3846 | - for ( --port; port >= 0; --port ) | |
3846 | + for (--port; port >= 0; --port) { | |
3847 | + tty_port_destroy(&port_array[port]->port); | |
3847 | 3848 | kfree(port_array[port]); |
3849 | + } | |
3848 | 3850 | return; |
3849 | 3851 | } |
3850 | 3852 | } |
... | ... | @@ -3953,6 +3955,7 @@ |
3953 | 3955 | } |
3954 | 3956 | tmp = info; |
3955 | 3957 | info = info->next_device; |
3958 | + tty_port_destroy(&tmp->port); | |
3956 | 3959 | kfree(tmp); |
3957 | 3960 | } |
3958 | 3961 |
drivers/tty/vt/vt.c
... | ... | @@ -779,6 +779,7 @@ |
779 | 779 | con_set_default_unimap(vc); |
780 | 780 | vc->vc_screenbuf = kmalloc(vc->vc_screenbuf_size, GFP_KERNEL); |
781 | 781 | if (!vc->vc_screenbuf) { |
782 | + tty_port_destroy(&vc->port); | |
782 | 783 | kfree(vc); |
783 | 784 | vc_cons[currcons].d = NULL; |
784 | 785 | return -ENOMEM; |
785 | 786 | |
... | ... | @@ -999,8 +1000,10 @@ |
999 | 1000 | put_pid(vc->vt_pid); |
1000 | 1001 | module_put(vc->vc_sw->owner); |
1001 | 1002 | kfree(vc->vc_screenbuf); |
1002 | - if (currcons >= MIN_NR_CONSOLES) | |
1003 | + if (currcons >= MIN_NR_CONSOLES) { | |
1004 | + tty_port_destroy(&vc->port); | |
1003 | 1005 | kfree(vc); |
1006 | + } | |
1004 | 1007 | vc_cons[currcons].d = NULL; |
1005 | 1008 | } |
1006 | 1009 | } |
drivers/usb/gadget/u_serial.c
... | ... | @@ -1145,8 +1145,10 @@ |
1145 | 1145 | |
1146 | 1146 | return status; |
1147 | 1147 | fail: |
1148 | - while (count--) | |
1148 | + while (count--) { | |
1149 | + tty_port_destroy(&ports[count].port->port); | |
1149 | 1150 | kfree(ports[count].port); |
1151 | + } | |
1150 | 1152 | put_tty_driver(gs_tty_driver); |
1151 | 1153 | gs_tty_driver = NULL; |
1152 | 1154 | return status; |
... | ... | @@ -1200,6 +1202,7 @@ |
1200 | 1202 | |
1201 | 1203 | WARN_ON(port->port_usb != NULL); |
1202 | 1204 | |
1205 | + tty_port_destroy(&port->port); | |
1203 | 1206 | kfree(port); |
1204 | 1207 | } |
1205 | 1208 | n_ports = 0; |
drivers/usb/serial/usb-serial.c