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];
 
                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;
  *       - 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;
        tty_driver_kref_put(driver);
        return tty;
 }
+EXPORT_SYMBOL_GPL(tty_open_by_driver);
 
 /**
  *     tty_open                -       open a tty device
 
 /* 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 tty_kref_put(struct tty_struct *tty)
 { }