• Amit Shah's avatar
    hvc_console: Fix race between hvc_close and hvc_remove · e74d098c
    Amit Shah authored
    Alan pointed out a race in the code where hvc_remove is invoked. The
    recent virtio_console work is the first user of hvc_remove().
    
    Alan describes it thus:
    
    The hvc_console assumes that a close and remove call can't occur at the
    same time.
    
    In addition tty_hangup(tty) is problematic as tty_hangup is asynchronous
    itself....
    
    So this can happen
    
            hvc_close                               hvc_remove
            hung up ? - no
                                                    lock
                                                    tty = hp->tty
                                                    unlock
            lock
            hp->tty = NULL
            unlock
            notify del
            kref_put the hvc struct
            close completes
            tty is destroyed
                                                    tty_hangup dead tty
                                                    tty->ops will be NULL
                                                    NULL->...
    
    This patch adds some tty krefs and also converts to using tty_vhangup().
    Reported-by: default avatarAlan Cox <alan@lxorguk.ukuu.org.uk>
    Signed-off-by: default avatarAmit Shah <amit.shah@redhat.com>
    CC: Alan Cox <alan@lxorguk.ukuu.org.uk>
    CC: linuxppc-dev@ozlabs.org
    CC: Rusty Russell <rusty@rustcorp.com.au>
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
    e74d098c
hvc_console.c 21.9 KB