[patch 1/7] tty_port: allow a port to be opened with a tty that has no file handle
Samuel Thibault
samuel.thibault at ens-lyon.org
Sat Mar 11 21:09:17 EST 2017
okash.khawaja at gmail.com, on sam. 11 mars 2017 13:05:25 +0000, wrote:
> 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 <okash.khawaja at gmail.com>
Reviewed-by: Samuel Thibault <samuel.thibault at ens-lyon.org>
> 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)
> { }
>
--
Samuel
> et sinon, quand on s'interesse a un media que l'on ne maitrise pas,
> on essaye de le comprendre d'abord.
(Suivi par l'intégralité du message initial de 45 lignes.)
-+-BM in : GNU - La maîtrise est un long apprentissage petit scarabé -+-
More information about the Speakup
mailing list