On Wed, Feb 19, 2020 at 02:21:13PM +0100, Johan Hovold wrote: > On Thu, Feb 13, 2020 at 10:15:58AM +0100, Uwe Kleine-König wrote: > > From: Uwe Kleine-König <u.kleine-koenig@xxxxxxxxxxxxxx> > > > > Introduce a new function tty_kopen_shared() that yields a struct > > tty_struct. The semantic difference to tty_kopen() is that the tty is > > expected to be used already. So rename tty_kopen() to > > tty_kopen_exclusive() for clearness, adapt the single user and put the > > common code in a new static helper function. > > > > tty_kopen_shared is to be used to implement an LED trigger for tty > > devices in one of the next patches. > > > > Signed-off-by: Uwe Kleine-König <u.kleine-koenig@xxxxxxxxxxxxxx> > > --- > > > -/** > > - * tty_kopen - open a tty device for kernel > > - * @device: dev_t of device to open > > - * > > - * Opens tty exclusively for kernel. Performs the driver lookup, > > - * makes sure it's not already opened and performs the first-time > > - * tty initialization. > > - * > > - * Returns the locked initialized &tty_struct > > - * > > - * Claims the global tty_mutex to serialize: > > - * - concurrent first-time tty initialization > > - * - concurrent tty driver removal w/ lookup > > - * - concurrent tty removal from driver table > > - */ > > -struct tty_struct *tty_kopen(dev_t device) > > +static struct tty_struct *tty_kopen(dev_t device, int shared) > > { > > struct tty_struct *tty; > > struct tty_driver *driver; > > @@ -1905,7 +1890,7 @@ struct tty_struct *tty_kopen(dev_t device) > > > > /* check whether we're reopening an existing tty */ > > tty = tty_driver_lookup_tty(driver, NULL, index); > > - if (IS_ERR(tty)) > > + if (IS_ERR(tty) || shared) > > So here you skip initialisation and return NULL if the tty isn't already > in use (e.g. is open) when shared is set. Which is good, right? If I remember my tests correctly this even works if the tty isn't opened but just "exists". > > goto out; > > > > if (tty) { > > @@ -1923,7 +1908,44 @@ struct tty_struct *tty_kopen(dev_t device) > > tty_driver_kref_put(driver); > > return tty; > > } > > -EXPORT_SYMBOL_GPL(tty_kopen); > > + > > +/** > > + * tty_kopen_exclusive - open a tty device for kernel > > + * @device: dev_t of device to open > > + * > > + * Opens tty exclusively for kernel. Performs the driver lookup, > > + * makes sure it's not already opened and performs the first-time > > + * tty initialization. > > + * > > + * Returns the locked initialized &tty_struct > > + * > > + * Claims the global tty_mutex to serialize: > > + * - concurrent first-time tty initialization > > + * - concurrent tty driver removal w/ lookup > > + * - concurrent tty removal from driver table > > + */ > > +struct tty_struct *tty_kopen_exclusive(dev_t device) > > +{ > > + return tty_kopen(device, 0); > > +} > > +EXPORT_SYMBOL_GPL(tty_kopen_exclusive); > > + > > +/** > > + * tty_kopen_shared - open a tty device for shared in-kernel use > > + * @device: dev_t of device to open > > + * > > + * Opens an already existing tty > > + * rnel. Performs the driver lookup, > > "rnel"? > > > + * makes sure it's not already opened and performs the first-time > > + * tty initialization. > > Yet, you claim to do initialisation here, which isn't the case. Yeah, wrong (and incomplete) copy of the tty_kopen_exclusive docstring. > > + * > > + * Locking is identical to tty_kopen() above. > > + */ > > +struct tty_struct *tty_kopen_shared(dev_t device) > > +{ > > + return tty_kopen(device, 1); > > +} > > +EXPORT_SYMBOL_GPL(tty_kopen_shared); > > This "kopen" naming is unfortunate as the tty isn't really opened by > either of these functions, but that's not something you introduced. Ack, will send a v7 with the doc string fixed. Thanks for taking the time to look over Uwe -- Pengutronix e.K. | Uwe Kleine-König | Industrial Linux Solutions | https://www.pengutronix.de/ |