lkml.org 
[lkml]   [2016]   [Feb]   [14]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.4 074/117] tty: Wait interruptibly for tty lock on reopen
    Date
    4.4-stable review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Peter Hurley <peter@hurleysoftware.com>

    commit 0bfd464d3fdd5bb322f9cace4cc47f1796545cf7 upstream.

    Allow a signal to interrupt the wait for a tty reopen; eg., if
    the tty has starting final close and is waiting for the device to
    drain.

    Signed-off-by: Peter Hurley <peter@hurleysoftware.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

    ---
    drivers/tty/tty_io.c | 8 +++++++-
    drivers/tty/tty_mutex.c | 8 ++++++++
    include/linux/tty.h | 1 +
    3 files changed, 16 insertions(+), 1 deletion(-)

    --- a/drivers/tty/tty_io.c
    +++ b/drivers/tty/tty_io.c
    @@ -2069,7 +2069,12 @@ retry_open:

    if (tty) {
    mutex_unlock(&tty_mutex);
    - tty_lock(tty);
    + retval = tty_lock_interruptible(tty);
    + if (retval) {
    + if (retval == -EINTR)
    + retval = -ERESTARTSYS;
    + goto err_unref;
    + }
    /* safe to drop the kref from tty_driver_lookup_tty() */
    tty_kref_put(tty);
    retval = tty_reopen(tty);
    @@ -2156,6 +2161,7 @@ retry_open:
    return 0;
    err_unlock:
    mutex_unlock(&tty_mutex);
    +err_unref:
    /* after locks to avoid deadlock */
    if (!IS_ERR_OR_NULL(driver))
    tty_driver_kref_put(driver);
    --- a/drivers/tty/tty_mutex.c
    +++ b/drivers/tty/tty_mutex.c
    @@ -22,6 +22,14 @@ void __lockfunc tty_lock(struct tty_stru
    }
    EXPORT_SYMBOL(tty_lock);

    +int tty_lock_interruptible(struct tty_struct *tty)
    +{
    + if (WARN(tty->magic != TTY_MAGIC, "L Bad %p\n", tty))
    + return -EIO;
    + tty_kref_get(tty);
    + return mutex_lock_interruptible(&tty->legacy_mutex);
    +}
    +
    void __lockfunc tty_unlock(struct tty_struct *tty)
    {
    if (tty->magic != TTY_MAGIC) {
    --- a/include/linux/tty.h
    +++ b/include/linux/tty.h
    @@ -654,6 +654,7 @@ extern long vt_compat_ioctl(struct tty_s
    /* tty_mutex.c */
    /* functions for preparation of BKL removal */
    extern void __lockfunc tty_lock(struct tty_struct *tty);
    +extern int tty_lock_interruptible(struct tty_struct *tty);
    extern void __lockfunc tty_unlock(struct tty_struct *tty);
    extern void __lockfunc tty_lock_slave(struct tty_struct *tty);
    extern void __lockfunc tty_unlock_slave(struct tty_struct *tty);

    \
     
     \ /
      Last update: 2016-02-15 02:01    [W:4.059 / U:0.876 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site