tty: nozomi, fix tty refcounting bug

Don't forget to drop a tty refererence on fail paths in
receive_data().

Signed-off-by: Jiri Slaby <jirislaby@gmail.com>
Signed-off-by: Alan Cox <alan@linux.intel.com>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
Jiri Slaby 2009-07-16 16:06:18 +01:00 committed by Linus Torvalds
parent 5c9228f0cf
commit 9237a81a14

View File

@ -828,7 +828,7 @@ static int receive_data(enum port_type index, struct nozomi *dc)
struct port *port = &dc->port[index]; struct port *port = &dc->port[index];
void __iomem *addr = port->dl_addr[port->toggle_dl]; void __iomem *addr = port->dl_addr[port->toggle_dl];
struct tty_struct *tty = tty_port_tty_get(&port->port); struct tty_struct *tty = tty_port_tty_get(&port->port);
int i; int i, ret;
if (unlikely(!tty)) { if (unlikely(!tty)) {
DBG1("tty not open for port: %d?", index); DBG1("tty not open for port: %d?", index);
@ -844,12 +844,14 @@ static int receive_data(enum port_type index, struct nozomi *dc)
/* disable interrupt in downlink... */ /* disable interrupt in downlink... */
disable_transmit_dl(index, dc); disable_transmit_dl(index, dc);
return 0; ret = 0;
goto put;
} }
if (unlikely(size == 0)) { if (unlikely(size == 0)) {
dev_err(&dc->pdev->dev, "size == 0?\n"); dev_err(&dc->pdev->dev, "size == 0?\n");
return 1; ret = 1;
goto put;
} }
tty_buffer_request_room(tty, size); tty_buffer_request_room(tty, size);
@ -871,8 +873,10 @@ static int receive_data(enum port_type index, struct nozomi *dc)
} }
set_bit(index, &dc->flip); set_bit(index, &dc->flip);
ret = 1;
put:
tty_kref_put(tty); tty_kref_put(tty);
return 1; return ret;
} }
/* Debug for interrupts */ /* Debug for interrupts */