Skip to content

Commit

Permalink
tty: Export redirect release
Browse files Browse the repository at this point in the history
This will be required by the pty code when it removes tty_vhangup() on
master close.

Signed-off-by: Corey Minyard <[email protected]>
Link: https://lore.kernel.org/r/[email protected]
Signed-off-by: Greg Kroah-Hartman <[email protected]>
  • Loading branch information
cminyard authored and gregkh committed Jan 7, 2021
1 parent c31c3ea commit f446776
Show file tree
Hide file tree
Showing 2 changed files with 25 additions and 8 deletions.
32 changes: 24 additions & 8 deletions drivers/tty/tty_io.c
Original file line number Diff line number Diff line change
Expand Up @@ -540,6 +540,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
Expand All @@ -566,21 +588,15 @@ 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;

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);

Expand Down
1 change: 1 addition & 0 deletions include/linux/tty.h
Original file line number Diff line number Diff line change
Expand Up @@ -421,6 +421,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)
{ }
Expand Down

0 comments on commit f446776

Please sign in to comment.