From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by befuddled.reisers.ca (Postfix, from userid 65534) id 4075C1F0432; Mon, 13 Mar 2017 18:09:32 -0400 (EDT) Received: from mail-wm0-x22d.google.com (mail-wm0-x22d.google.com [IPv6:2a00:1450:400c:c09::22d]) by befuddled.reisers.ca (Postfix) with ESMTPS id 1743B1F0380 for ; Mon, 13 Mar 2017 18:09:29 -0400 (EDT) Received: by mail-wm0-x22d.google.com with SMTP id t189so50822211wmt.1 for ; Mon, 13 Mar 2017 15:09:29 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=message-id:user-agent:date:from:to:cc:subject:references :mime-version:content-disposition; bh=kZEOs+GVzedDvU9PAVxtP4EZdbKZuq+WTYrszHdofNI=; b=XtqeuRuFOJmSMORoWFduAUSS0FlaomdvEIGBKE3yrrKcHX55A5r6pacHyVrpka5eGA id/7F61bEQQvNK0j3GcL3GCg3y7IjrRQmN3W77QPMo6mZ55ss7+cF/eEV1dspdIAtd5J woy3GTCLn+K+QtrVNN52eNgiiZoAmFNQ6gLkkofJPbsTPOrV0DI5RVyuoS0mLncFPO+i FinAo/vXlmxsXtKm6LA0GCSyEGTVMb8Ze50xUFF0L/2YkQWV3ljj1eXbS08k9Vmo32dR rcFmeRNqQBC63DYEmqB/he1ajQHL6J+WQqIKdAV9TrnneAJxHirJ9l+5dOpHSol9k17K 4HYA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:message-id:user-agent:date:from:to:cc:subject :references:mime-version:content-disposition; bh=kZEOs+GVzedDvU9PAVxtP4EZdbKZuq+WTYrszHdofNI=; b=keGws8Ef0QhIEv/+KzgZS8wqUgiMMyJ90SvuI/Reov5D9agzCUb6Dky6G30qWjC9U0 MYA5R52hUIkFI7Y9j2/2/hiN2M9jOwG4NC94i/HEtduo+nl0yp7H0TQDk4bU4iT4tz18 /rIVtAy6mUZQYrnIQUf4oKIgx2a4ZwGsjnchQv7zakNln/IpHtX2ukr8j4y6grYDMgQl t4ULHsjRW6QTZoR0ljIx3IVI6espvzUVmj+tunXJ8QhEsEBVe9Bhvy7UGwkO3YVUIyX0 TfNDHhfNaAU9ly5aA01Hi7+U5mykWd6j9LAEROHotLDtvZQ1mNyQhseCaUr//BzmDfEN L8eQ== X-Gm-Message-State: AFeK/H3REcUuyH4OJPRiEXjIHRCz9PtXV0M9WZnpyDewxTLtnW+As5Gtrqb4/o92zo/4fA== X-Received: by 10.28.178.142 with SMTP id b136mr11464034wmf.57.1489442968140; Mon, 13 Mar 2017 15:09:28 -0700 (PDT) Received: from sanghar ([2a02:8011:4009:2:6e2f:2cff:fe3b:a5ff]) by smtp.gmail.com with ESMTPSA id w97sm26533762wrc.20.2017.03.13.15.09.26 (version=TLS1 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Mon, 13 Mar 2017 15:09:27 -0700 (PDT) Message-Id: <20170313220926.390471547@gmail.com> User-Agent: quilt/0.63-1 Date: Mon, 13 Mar 2017 22:05:52 +0000 From: okash.khawaja@gmail.com To: Greg Kroah-Hartman , Jiri Slaby , Samuel Thibault , linux-kernel@vger.kernel.org Cc: William Hubbs , Chris Brannon , Kirk Reiser , speakup@linux-speakup.org, devel@driverdev.osuosl.org, alan@linux.intel.com, Okash Khawaja Subject: [patch 1/7] tty_port: allow a port to be opened with a tty that has no file handle References: <20170313220551.312820470@gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-15 Content-Disposition: inline; filename=01_enable_kernel_access_to_tty_device 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: Mon, 13 Mar 2017 22:09:38 -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 Reviewed-by: Samuel Thibault Index: linux-4.10.1/drivers/tty/tty_io.c =================================================================== --- linux-4.10.1.orig/drivers/tty/tty_io.c +++ linux-4.10.1/drivers/tty/tty_io.c @@ -855,7 +855,7 @@ 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 @@ 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 @@ 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 @@ * - 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 @@ tty_driver_kref_put(driver); return tty; } +EXPORT_SYMBOL(tty_open_by_driver); /** * tty_open - open a tty device Index: linux-4.10.1/drivers/tty/tty_port.c =================================================================== --- linux-4.10.1.orig/drivers/tty/tty_port.c +++ linux-4.10.1/drivers/tty/tty_port.c @@ -335,7 +335,7 @@ * 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 @@ 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-4.10.1/include/linux/tty.h =================================================================== --- linux-4.10.1.orig/include/linux/tty.h +++ linux-4.10.1/include/linux/tty.h @@ -394,6 +394,8 @@ /* 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) { }