TTY: extract driver lookup from tty_open
authorJiri Slaby <jslaby@suse.cz>
Wed, 9 Nov 2011 20:33:20 +0000 (21:33 +0100)
committerGreg Kroah-Hartman <gregkh@suse.de>
Tue, 15 Nov 2011 23:52:45 +0000 (15:52 -0800)
The error handling in tty_open became unbearable. There were many
errors fixed recently. Extract the tty driver lookup from tty_open to
a separate function. This reduces the fail paths significantly and
makes tty_open more readable.

In the next patch we will move the fail path handling to the end of
the function.

Signed-off-by: Jiri Slaby <jslaby@suse.cz>
Cc: Alan Cox <alan@linux.intel.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
drivers/tty/tty_io.c

index 1b90c986b1bfe764257f4c46b4106a70d208882d..00b84984308d97b81282a6eb71bdd3295e8e8b54 100644 (file)
@@ -1823,6 +1823,53 @@ static struct tty_struct *tty_open_current_tty(dev_t device, struct file *filp)
        return tty;
 }
 
+/**
+ *     tty_lookup_driver - lookup a tty driver for a given device file
+ *     @device: device number
+ *     @filp: file pointer to tty
+ *     @noctty: set if the device should not become a controlling tty
+ *     @index: index for the device in the @return driver
+ *     @return: driver for this inode (with increased refcount)
+ *
+ *     If @return is not erroneous, the caller is responsible to decrement the
+ *     refcount by tty_driver_kref_put.
+ *
+ *     Locking: tty_mutex protects get_tty_driver
+ */
+static struct tty_driver *tty_lookup_driver(dev_t device, struct file *filp,
+               int *noctty, int *index)
+{
+       struct tty_driver *driver;
+
+#ifdef CONFIG_VT
+       if (device == MKDEV(TTY_MAJOR, 0)) {
+               extern struct tty_driver *console_driver;
+               driver = tty_driver_kref_get(console_driver);
+               *index = fg_console;
+               *noctty = 1;
+               return driver;
+       }
+#endif
+       if (device == MKDEV(TTYAUX_MAJOR, 1)) {
+               struct tty_driver *console_driver = console_device(index);
+               if (console_driver) {
+                       driver = tty_driver_kref_get(console_driver);
+                       if (driver) {
+                               /* Don't let /dev/console block */
+                               filp->f_flags |= O_NONBLOCK;
+                               *noctty = 1;
+                               return driver;
+                       }
+               }
+               return ERR_PTR(-ENODEV);
+       }
+
+       driver = get_tty_driver(device, index);
+       if (!driver)
+               return ERR_PTR(-ENODEV);
+       return driver;
+}
+
 /**
  *     tty_open                -       open a tty device
  *     @inode: inode of device file
@@ -1839,7 +1886,7 @@ static struct tty_struct *tty_open_current_tty(dev_t device, struct file *filp)
  *     The termios state of a pty is reset on first open so that
  *     settings don't persist across reuse.
  *
- *     Locking: tty_mutex protects tty, get_tty_driver and tty_init_dev work.
+ *     Locking: tty_mutex protects tty, tty_lookup_driver and tty_init_dev.
  *              tty->count should protect the rest.
  *              ->siglock protects ->signal/->sighand
  */
@@ -1873,47 +1920,17 @@ retry_open:
                mutex_unlock(&tty_mutex);
                tty_free_file(filp);
                return PTR_ERR(tty);
-       } else if (tty)
-               goto got_driver;
-
-#ifdef CONFIG_VT
-       if (device == MKDEV(TTY_MAJOR, 0)) {
-               extern struct tty_driver *console_driver;
-               driver = tty_driver_kref_get(console_driver);
-               index = fg_console;
-               noctty = 1;
-               goto got_driver;
-       }
-#endif
-       if (device == MKDEV(TTYAUX_MAJOR, 1)) {
-               struct tty_driver *console_driver = console_device(&index);
-               if (console_driver) {
-                       driver = tty_driver_kref_get(console_driver);
-                       if (driver) {
-                               /* Don't let /dev/console block */
-                               filp->f_flags |= O_NONBLOCK;
-                               noctty = 1;
-                               goto got_driver;
-                       }
+       } else if (!tty) {
+               driver = tty_lookup_driver(device, filp, &noctty, &index);
+               if (IS_ERR(driver)) {
+                       tty_unlock();
+                       mutex_unlock(&tty_mutex);
+                       tty_free_file(filp);
+                       return PTR_ERR(driver);
                }
-               tty_unlock();
-               mutex_unlock(&tty_mutex);
-               tty_free_file(filp);
-               return -ENODEV;
-       }
 
-       driver = get_tty_driver(device, &index);
-       if (!driver) {
-               tty_unlock();
-               mutex_unlock(&tty_mutex);
-               tty_free_file(filp);
-               return -ENODEV;
-       }
-got_driver:
-       if (!tty) {
                /* check whether we're reopening an existing tty */
                tty = tty_driver_lookup_tty(driver, inode, index);
-
                if (IS_ERR(tty)) {
                        tty_unlock();
                        mutex_unlock(&tty_mutex);
This page took 0.030574 seconds and 5 git commands to generate.