This function gives a struct tty_struct for a given device number. Signed-off-by: Uwe Kleine-König <u.kleine-koenig@xxxxxxxxxxxxxx> --- drivers/tty/tty_io.c | 27 +++++++++++++++++++++++++++ include/linux/tty.h | 1 + 2 files changed, 28 insertions(+) diff --git a/drivers/tty/tty_io.c b/drivers/tty/tty_io.c index d9f54c7d94f2..584025117cd3 100644 --- a/drivers/tty/tty_io.c +++ b/drivers/tty/tty_io.c @@ -1925,6 +1925,33 @@ struct tty_struct *tty_kopen(dev_t device) } EXPORT_SYMBOL_GPL(tty_kopen); +/* + * Caller gets a reference on (non-error) ttys, that must be disposed using + * tty_kref_put(). + */ +struct tty_struct *tty_kopen_shared(dev_t device) +{ + struct tty_struct *tty; + struct tty_driver *driver; + int index = -1; + + mutex_lock(&tty_mutex); + driver = tty_lookup_driver(device, NULL, &index); + if (IS_ERR(driver)) { + tty = ERR_CAST(driver); + goto err_lookup_driver; + } + + tty = tty_driver_lookup_tty(driver, NULL, index); + + tty_driver_kref_put(driver); +err_lookup_driver: + + mutex_unlock(&tty_mutex); + return tty; +} +EXPORT_SYMBOL(tty_kopen_shared); + /** * tty_open_by_driver - open a tty device * @device: dev_t of device to open diff --git a/include/linux/tty.h b/include/linux/tty.h index bfa4e2ee94a9..616268eb1613 100644 --- a/include/linux/tty.h +++ b/include/linux/tty.h @@ -412,6 +412,7 @@ extern struct tty_struct *get_current_tty(void); extern int __init tty_init(void); extern const char *tty_name(const struct tty_struct *tty); extern struct tty_struct *tty_kopen(dev_t device); +extern struct tty_struct *tty_kopen_shared(dev_t device); extern void tty_kclose(struct tty_struct *tty); extern int tty_dev_name_to_number(const char *name, dev_t *number); extern int tty_ldisc_lock(struct tty_struct *tty, unsigned long timeout); -- 2.24.0