From 86f1d0a3db4ca6e55eab79e698ad6f97a80acf5c Mon Sep 17 00:00:00 2001 From: Alan Cox Date: Mon, 8 Feb 2010 10:07:04 +0000 Subject: [PATCH] --- yaml --- r: 185201 b: refs/heads/master c: e8c65d143a9903cb553c0d80c819428c5b839a02 h: refs/heads/master i: 185199: 84b4c9ea135fd03cc4318f93c5ab0825f96e39e1 v: v3 --- [refs] | 2 +- trunk/drivers/char/nozomi.c | 34 ++++++++++++---------------------- 2 files changed, 13 insertions(+), 23 deletions(-) diff --git a/[refs] b/[refs] index 39d3fb84efd7..5cf6ec320c40 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 266794eb71cfee65b38371954b9db2f6dbda207c +refs/heads/master: e8c65d143a9903cb553c0d80c819428c5b839a02 diff --git a/trunk/drivers/char/nozomi.c b/trunk/drivers/char/nozomi.c index cd405bcf53a6..fac9157a0ec0 100644 --- a/trunk/drivers/char/nozomi.c +++ b/trunk/drivers/char/nozomi.c @@ -1693,15 +1693,7 @@ static int ntty_write(struct tty_struct *tty, const unsigned char *buffer, if (!dc || !port) return -ENODEV; - if (unlikely(!mutex_trylock(&port->tty_sem))) { - /* - * must test lock as tty layer wraps calls - * to this function with BKL - */ - dev_err(&dc->pdev->dev, "Would have deadlocked - " - "return EAGAIN\n"); - return -EAGAIN; - } + mutex_lock(&port->tty_sem); if (unlikely(!port->port.count)) { DBG1(" "); @@ -1741,25 +1733,23 @@ static int ntty_write(struct tty_struct *tty, const unsigned char *buffer, * This method is called by the upper tty layer. * #according to sources N_TTY.c it expects a value >= 0 and * does not check for negative values. + * + * If the port is unplugged report lots of room and let the bits + * dribble away so we don't block anything. */ static int ntty_write_room(struct tty_struct *tty) { struct port *port = tty->driver_data; - int room = 0; + int room = 4096; const struct nozomi *dc = get_dc_by_tty(tty); - if (!dc || !port) - return 0; - if (!mutex_trylock(&port->tty_sem)) - return 0; - - if (!port->port.count) - goto exit; - - room = port->fifo_ul.size - kfifo_len(&port->fifo_ul); - -exit: - mutex_unlock(&port->tty_sem); + if (dc) { + mutex_lock(&port->tty_sem); + if (port->port.count) + room = port->fifo_ul.size - + kfifo_len(&port->fifo_ul); + mutex_unlock(&port->tty_sem); + } return room; }