From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by befuddled.reisers.ca (Postfix, from userid 65534) id 72C9A1F088D; Sat, 25 Feb 2017 14:21:39 -0500 (EST) Received: from mail-wm0-x242.google.com (mail-wm0-x242.google.com [IPv6:2a00:1450:400c:c09::242]) by befuddled.reisers.ca (Postfix) with ESMTPS id 2510E1EFFD9 for ; Sat, 25 Feb 2017 14:21:37 -0500 (EST) Received: by mail-wm0-x242.google.com with SMTP id r18so7693037wmd.3 for ; Sat, 25 Feb 2017 11:21:37 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=date:from:to:cc:subject:message-id:mime-version:content-disposition :in-reply-to:user-agent; bh=Y8Ic+fBWz936MRBkqVCNzP3m3CZ5gbreSbQ8BkuQJXM=; b=s54v+4qnDNjqAWStNzqPdivZq7DIeVQaCMChEHUlt3RtkEkgraCCTfWWzBSupgsuxt eI4oX2X6qPwhW4Lu3Aro7lcdHBUjiC1OU6uraErSCRbiNvectIjbZGpmSAxjJd4c9krT evBb9XPyVx/b/JXsx0iHib+g6ujsvzsYnZDNVQNg+3hsiXT0/a3HB/eKtTVtfAwnsyAR 0WE8cBqSVsjWsqm5zHt9y7nJjVIeL65LBUT2Svvc+6CoG+5d4BVrRI3/EYKl9Y9pZgE8 QtZP1i74W93SDUqRGejxGX7MErLZgCU7eJW1wqtQIv+dOrAH2kSE+fJ6OMir3FIJXMOI RzTg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:from:to:cc:subject:message-id:mime-version :content-disposition:in-reply-to:user-agent; bh=Y8Ic+fBWz936MRBkqVCNzP3m3CZ5gbreSbQ8BkuQJXM=; b=tgfGI1ZFWElKEwsZBWh/n5jcKa4iuJZTPWfnxXA7jrniSnBpvbK1fgouxwyfWj1r7L H5vYxcS410CeZjqNraqA2Z1n0CxhyIGiTdAJi0xZftcIvw0bmSAD0vaGDV9Ei3btv/9Y Ra9gEvIn3mUBR3oJ4GHrnOQqEhLhYkrlSrNoxoOHi68yUGruantx22G1kHxyrb3AawGL IFbMU/w1n46m38ccBPI9pHRBrrZJYveAj0vT/kthpEi2xe1EcRPJpD3rewKMQOoZJZWM Jfd3NHJuMztxeMDKd6i8X2k90c7Q2S2iAWvn9Nxo9i8sQtDIc95HeXVpwZrxNDBXe8mM hcfw== X-Gm-Message-State: AMke39lNXGpX1rdBmVdAgj4Q+aHzS8pCzeGfZzTIY8TFxQQxqZmhj/E4Kpco8083SFqsMA== X-Received: by 10.28.84.88 with SMTP id p24mr7316584wmi.52.1488050493897; Sat, 25 Feb 2017 11:21:33 -0800 (PST) Received: from sanghar (cpc91372-watf11-2-0-cust614.15-2.cable.virginm.net. [86.14.2.103]) by smtp.gmail.com with ESMTPSA id v128sm7405584wmv.2.2017.02.25.11.21.33 (version=TLS1 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Sat, 25 Feb 2017 11:21:33 -0800 (PST) Date: Sat, 25 Feb 2017 19:21:32 +0000 From: Okash Khawaja To: samuel.thibault@ens-lyon.org Cc: speakup@linux-speakup.org Subject: [patch 1/6] tty_port: allow a port to be opened with a tty that has no file handle Message-ID: <20170225192132.GA4492@sanghar> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20170225191801.GA4482@sanghar> User-Agent: Mutt/1.7.2 (2016-11-26) X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 X-BeenThere: speakup@linux-speakup.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: "Speakup is a screen review system for Linux." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 25 Feb 2017 19:21:39 -0000 Allow access to TTY device from kernel. This is based on Alan Cox's patch (http://www.mail-archive.com/linux-kernel at vger.kernel.org/msg1215095.html), with description quoted below. "tty_port: allow a port to be opened with a tty that has no file handle Let us create tty objects entirely in kernel space. With this a kernel created non file backed tty object could be used to handle data, and set terminal modes. Not all ldiscs can cope with this as N_TTY in particular has to work back to the fs/tty layer. The tty_port code is however otherwise clean of file handles as far as I can tell as is the low level tty port write path used by the ldisc, the configuration low level interfaces and most of the ldiscs. Currently you don't have any exposure to see tty hangups because those are built around the file layer. However a) it's a fixed port so you probably don't care about that b) if you do we can add a callback and c) you almost certainly don't want the userspace tear down/rebuild behaviour anyway. This should however be sufficient if we wanted for example to enumerate all the bluetooth bound fixed ports via ACPI and make them directly available. It doesn't deal with the case of a user opening a port that's also kernel opened and that would need some locking out (so it returned EBUSY if bound to a kernel device of some kind). That needs resolving along with how you "up" or "down" your new bluetooth device, or enumerate it while providing the existing tty API to avoid regressions (and to debug)." Signed-off-by: Okash Khawaja Index: linux-stable/drivers/tty/tty_io.c =================================================================== --- linux-stable.orig/drivers/tty/tty_io.c +++ linux-stable/drivers/tty/tty_io.c @@ -855,7 +855,7 @@ static void tty_vhangup_session(struct t int tty_hung_up_p(struct file *filp) { - return (filp->f_op == &hung_up_tty_fops); + return (filp && filp->f_op == &hung_up_tty_fops); } EXPORT_SYMBOL(tty_hung_up_p); @@ -1368,7 +1368,10 @@ static struct tty_struct *tty_driver_loo struct tty_struct *tty; if (driver->ops->lookup) - tty = driver->ops->lookup(driver, file, idx); + if (!file) + tty = ERR_PTR(-EIO); + else + tty = driver->ops->lookup(driver, file, idx); else tty = driver->ttys[idx]; @@ -1986,7 +1989,7 @@ static struct tty_driver *tty_lookup_dri struct tty_driver *console_driver = console_device(index); if (console_driver) { driver = tty_driver_kref_get(console_driver); - if (driver) { + if (driver && filp) { /* Don't let /dev/console block */ filp->f_flags |= O_NONBLOCK; break; @@ -2019,7 +2022,7 @@ static struct tty_driver *tty_lookup_dri * - concurrent tty driver removal w/ lookup * - concurrent tty removal from driver table */ -static struct tty_struct *tty_open_by_driver(dev_t device, struct inode *inode, +struct tty_struct *tty_open_by_driver(dev_t device, struct inode *inode, struct file *filp) { struct tty_struct *tty; @@ -2064,6 +2067,7 @@ out: tty_driver_kref_put(driver); return tty; } +EXPORT_SYMBOL(tty_open_by_driver); /** * tty_open - open a tty device Index: linux-stable/drivers/tty/tty_port.c =================================================================== --- linux-stable.orig/drivers/tty/tty_port.c +++ linux-stable/drivers/tty/tty_port.c @@ -335,7 +335,7 @@ EXPORT_SYMBOL(tty_port_lower_dtr_rts); * tty_port_block_til_ready - Waiting logic for tty open * @port: the tty port being opened * @tty: the tty device being bound - * @filp: the file pointer of the opener + * @filp: the file pointer of the opener or NULL * * Implement the core POSIX/SuS tty behaviour when opening a tty device. * Handles: @@ -369,7 +369,7 @@ int tty_port_block_til_ready(struct tty_ tty_port_set_active(port, 1); return 0; } - if (filp->f_flags & O_NONBLOCK) { + if (filp == NULL || filp->f_flags & O_NONBLOCK) { /* Indicate we are open */ if (C_BAUD(tty)) tty_port_raise_dtr_rts(port); Index: linux-stable/include/linux/tty.h =================================================================== --- linux-stable.orig/include/linux/tty.h +++ linux-stable/include/linux/tty.h @@ -394,6 +394,8 @@ extern struct tty_struct *get_current_tt /* tty_io.c */ extern int __init tty_init(void); extern const char *tty_name(const struct tty_struct *tty); +extern struct tty_struct *tty_open_by_driver(dev_t device, struct inode *inode, + struct file *filp); #else static inline void console_init(void) { }