lkml.org 
[lkml]   [2020]   [Nov]   [23]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 1/2] tty: Export redirect release
    Date
    From: Corey Minyard <cminyard@mvista.com>

    This will be required by the pty code when it removes tty_vhangup() on
    master close.

    Signed-off-by: Corey Minyard <cminyard@mvista.com>
    ---
    drivers/tty/tty_io.c | 32 ++++++++++++++++++++++++--------
    include/linux/tty.h | 1 +
    2 files changed, 25 insertions(+), 8 deletions(-)

    diff --git a/drivers/tty/tty_io.c b/drivers/tty/tty_io.c
    index 7a4c02548fb3..571b1d7d4d5a 100644
    --- a/drivers/tty/tty_io.c
    +++ b/drivers/tty/tty_io.c
    @@ -542,6 +542,28 @@ void tty_wakeup(struct tty_struct *tty)

    EXPORT_SYMBOL_GPL(tty_wakeup);

    +/**
    + * tty_release_redirect - Release a redirect on a pty if present
    + * @tty: tty device
    + *
    + * This is available to the pty code so if the master closes, if the
    + * slave is a redirect it can release the redirect.
    + */
    +struct file *tty_release_redirect(struct tty_struct *tty)
    +{
    + struct file *f = NULL;
    +
    + spin_lock(&redirect_lock);
    + if (redirect && file_tty(redirect) == tty) {
    + f = redirect;
    + redirect = NULL;
    + }
    + spin_unlock(&redirect_lock);
    +
    + return f;
    +}
    +EXPORT_SYMBOL_GPL(tty_release_redirect);
    +
    /**
    * __tty_hangup - actual handler for hangup events
    * @tty: tty device
    @@ -567,7 +589,7 @@ EXPORT_SYMBOL_GPL(tty_wakeup);
    static void __tty_hangup(struct tty_struct *tty, int exit_session)
    {
    struct file *cons_filp = NULL;
    - struct file *filp, *f = NULL;
    + struct file *filp, *f;
    struct tty_file_private *priv;
    int closecount = 0, n;
    int refs;
    @@ -575,13 +597,7 @@ static void __tty_hangup(struct tty_struct *tty, int exit_session)
    if (!tty)
    return;

    -
    - spin_lock(&redirect_lock);
    - if (redirect && file_tty(redirect) == tty) {
    - f = redirect;
    - redirect = NULL;
    - }
    - spin_unlock(&redirect_lock);
    + f = tty_release_redirect(tty);

    tty_lock(tty);

    diff --git a/include/linux/tty.h b/include/linux/tty.h
    index a99e9b8e4e31..d98319c5d195 100644
    --- a/include/linux/tty.h
    +++ b/include/linux/tty.h
    @@ -418,6 +418,7 @@ extern void tty_kclose(struct tty_struct *tty);
    extern int tty_dev_name_to_number(const char *name, dev_t *number);
    extern int tty_ldisc_lock(struct tty_struct *tty, unsigned long timeout);
    extern void tty_ldisc_unlock(struct tty_struct *tty);
    +extern struct file *tty_release_redirect(struct tty_struct *tty);
    #else
    static inline void tty_kref_put(struct tty_struct *tty)
    { }
    --
    2.25.1
    \
     
     \ /
      Last update: 2020-11-24 01:51    [W:2.309 / U:0.136 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site