Commit 191c5f10275cfbb36802edadbdb10c73537327b4

Authored by Jiri Slaby
Committed by Greg Kroah-Hartman
1 parent d0f59141ca

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
... ... @@ -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
... ... @@ -555,6 +555,7 @@
555 555 return 0;
556 556 err_free_tty:
557 557 put_tty_driver(hp_simserial_driver);
  558 + tty_port_destroy(&state->port);
558 559 return retval;
559 560 }
560 561  
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
... ... @@ -584,6 +584,8 @@
584 584 printk(KERN_ERR "register_lines : can't register %s driver\n",
585 585 line_driver->name);
586 586 put_tty_driver(driver);
  587 + for (i = 0; i < nlines; i++)
  588 + tty_port_destroy(&lines[i].port);
587 589 return err;
588 590 }
589 591  
arch/xtensa/platforms/iss/console.c
... ... @@ -221,6 +221,7 @@
221 221 printk("ISS_SERIAL: failed to unregister serial driver (%d)\n",
222 222 error);
223 223 put_tty_driver(serial_driver);
  224 + tty_port_destroy(&serial_port);
224 225 }
225 226  
226 227  
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);
... ... @@ -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
... ... @@ -677,6 +677,7 @@
677 677 {
678 678 kfree(raw->inbuf);
679 679 kfree(raw->buffer);
  680 + tty_port_destroy(&raw->port);
680 681 kfree(raw);
681 682 }
682 683  
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
... ... @@ -752,6 +752,8 @@
752 752  
753 753 return 0;
754 754  
  755 + /* FIXME this guy should free the tty driver stored in nd and destroy
  756 + * all channel ports */
755 757 error_out:
756 758 kfree(nd);
757 759 return ret;
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
... ... @@ -1218,6 +1218,7 @@
1218 1218 if (hp->virq == 0) {
1219 1219 printk(KERN_ERR "%s: couldn't create irq mapping for 0x%x\n",
1220 1220 __func__, irq[0]);
  1221 + tty_port_destroy(&hp->port);
1221 1222 continue;
1222 1223 }
1223 1224  
drivers/tty/ipwireless/tty.c
... ... @@ -566,6 +566,7 @@
566 566 ipwireless_disassociate_network_ttys(network,
567 567 ttyj->channel_idx);
568 568 tty_unregister_device(ipw_tty_driver, j);
  569 + tty_port_destroy(&ttyj->port);
569 570 ttys[j] = NULL;
570 571 mutex_unlock(&ttyj->ipw_tty_mutex);
571 572 kfree(ttyj);
... ... @@ -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++)
... ... @@ -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
... ... @@ -4425,6 +4425,7 @@
4425 4425 mgsl_release_resources(info);
4426 4426 tmp = info;
4427 4427 info = info->next_device;
  4428 + tty_port_destroy(&tmp->port);
4428 4429 kfree(tmp);
4429 4430 }
4430 4431  
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  
... ... @@ -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
... ... @@ -597,6 +597,7 @@
597 597 kfifo_free(&port->write_fifo);
598 598 kfree(port->interrupt_in_buffer);
599 599 kfree(port->interrupt_out_buffer);
  600 + tty_port_destroy(&port->port);
600 601 kfree(port);
601 602 }
602 603  
net/irda/ircomm/ircomm_tty.c
... ... @@ -183,6 +183,7 @@
183 183 ircomm_tty_shutdown(self);
184 184  
185 185 self->magic = 0;
  186 + tty_port_destroy(&self->port);
186 187 kfree(self);
187 188 }
188 189