lkml.org 
[lkml]   [2020]   [Oct]   [27]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.19 084/264] tty: hvcs: Dont NULL tty->driver_data until hvcs_cleanup()
    Date
    From: Tyrel Datwyler <tyreld@linux.ibm.com>

    [ Upstream commit 63ffcbdad738e3d1c857027789a2273df3337624 ]

    The code currently NULLs tty->driver_data in hvcs_close() with the
    intent of informing the next call to hvcs_open() that device needs to be
    reconfigured. However, when hvcs_cleanup() is called we copy hvcsd from
    tty->driver_data which was previoulsy NULLed by hvcs_close() and our
    call to tty_port_put(&hvcsd->port) doesn't actually do anything since
    &hvcsd->port ends up translating to NULL by chance. This has the side
    effect that when hvcs_remove() is called we have one too many port
    references preventing hvcs_destuct_port() from ever being called. This
    also prevents us from reusing the /dev/hvcsX node in a future
    hvcs_probe() and we can eventually run out of /dev/hvcsX devices.

    Fix this by waiting to NULL tty->driver_data in hvcs_cleanup().

    Fixes: 27bf7c43a19c ("TTY: hvcs, add tty install")
    Signed-off-by: Tyrel Datwyler <tyreld@linux.ibm.com>
    Link: https://lore.kernel.org/r/20200820234643.70412-1-tyreld@linux.ibm.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    drivers/tty/hvc/hvcs.c | 14 +++++++-------
    1 file changed, 7 insertions(+), 7 deletions(-)

    diff --git a/drivers/tty/hvc/hvcs.c b/drivers/tty/hvc/hvcs.c
    index cb4db1b3ca3c0..7853c6375325d 100644
    --- a/drivers/tty/hvc/hvcs.c
    +++ b/drivers/tty/hvc/hvcs.c
    @@ -1218,13 +1218,6 @@ static void hvcs_close(struct tty_struct *tty, struct file *filp)

    tty_wait_until_sent(tty, HVCS_CLOSE_WAIT);

    - /*
    - * This line is important because it tells hvcs_open that this
    - * device needs to be re-configured the next time hvcs_open is
    - * called.
    - */
    - tty->driver_data = NULL;
    -
    free_irq(irq, hvcsd);
    return;
    } else if (hvcsd->port.count < 0) {
    @@ -1239,6 +1232,13 @@ static void hvcs_cleanup(struct tty_struct * tty)
    {
    struct hvcs_struct *hvcsd = tty->driver_data;

    + /*
    + * This line is important because it tells hvcs_open that this
    + * device needs to be re-configured the next time hvcs_open is
    + * called.
    + */
    + tty->driver_data = NULL;
    +
    tty_port_put(&hvcsd->port);
    }

    --
    2.25.1


    \
     
     \ /
      Last update: 2020-10-27 19:02    [W:4.100 / U:0.352 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site