]> git.hungrycats.org Git - linux/commitdiff
[PATCH] tty_io cleanup
authorAndrew Morton <akpm@digeo.com>
Fri, 28 Mar 2003 11:19:51 +0000 (03:19 -0800)
committerDave Jones <davej@tetrachloride.(none)>
Fri, 28 Mar 2003 11:19:51 +0000 (03:19 -0800)
From: Andries.Brouwer@cwi.nl

Adding the unregister_chrdev_region call that is the counterpart to
register_chrdev_region, we get a nice cleanup of tty_io.c.

drivers/char/tty_io.c
fs/char_dev.c
include/linux/fs.h

index a771c4dbae56bfe706ef090041b544c88ac82277..bb238e830f5a1300a772b8d107e07ffa1e87dc3c 100644 (file)
@@ -2143,31 +2143,16 @@ int tty_register_driver(struct tty_driver *driver)
  */
 int tty_unregister_driver(struct tty_driver *driver)
 {
-       int     retval;
-       struct tty_driver *p;
-       int     i, found = 0;
+       int retval, i;
        struct termios *tp;
-       const char *othername = NULL;
-       
+
        if (*driver->refcount)
                return -EBUSY;
 
-       list_for_each_entry(p, &tty_drivers, tty_drivers) {
-               if (p == driver)
-                       found++;
-               else if (p->major == driver->major)
-                       othername = p->name;
-       }
-       
-       if (!found)
-               return -ENOENT;
-
-       if (othername == NULL) {
-               retval = unregister_chrdev(driver->major, driver->name);
-               if (retval)
-                       return retval;
-       } else
-               register_chrdev(driver->major, othername, &tty_fops);
+       retval = unregister_chrdev_region(driver->major, driver->minor_start,
+                                         driver->num, driver->name);
+       if (retval)
+               return retval;
 
        list_del(&driver->tty_drivers);
 
index f8187f71ae3ed4c53de0cc09debc723f9d264d54..cc0ff8d5c12ebc0817057cde2a0a6f5d8b71dec0 100644 (file)
@@ -174,7 +174,8 @@ int register_chrdev(unsigned int major, const char *name,
 }
 
 /* todo: make void - error printk here */
-int unregister_chrdev(unsigned int major, const char * name)
+int unregister_chrdev_region(unsigned int major, unsigned int baseminor,
+                            int minorct, const char *name)
 {
        struct char_device_struct *cd, **cp;
        int ret = 0;
@@ -184,7 +185,9 @@ int unregister_chrdev(unsigned int major, const char * name)
 
        write_lock(&chrdevs_lock);
        for (cp = &chrdevs[i]; *cp; cp = &(*cp)->next)
-               if ((*cp)->major == major)
+               if ((*cp)->major == major &&
+                   (*cp)->baseminor == baseminor &&
+                   (*cp)->minorct == minorct)
                        break;
        if (!*cp || strcmp((*cp)->name, name))
                ret = -EINVAL;
@@ -198,6 +201,11 @@ int unregister_chrdev(unsigned int major, const char * name)
        return ret;
 }
 
+int unregister_chrdev(unsigned int major, const char *name)
+{
+       return unregister_chrdev_region(major, 0, 256, name);
+}
+
 /*
  * Called every time a character special file is opened
  */
index 2b565674e470b1422c07070796fa1ec0fd8c680d..296ff121291791f986a03ec3cc51a8ba56e0941b 100644 (file)
@@ -1060,6 +1060,8 @@ extern int register_chrdev_region(unsigned int, unsigned int, int,
 extern int register_chrdev(unsigned int, const char *,
                           struct file_operations *);
 extern int unregister_chrdev(unsigned int, const char *);
+extern int unregister_chrdev_region(unsigned int, unsigned int, int,
+                                   const char *);
 extern int chrdev_open(struct inode *, struct file *);
 
 /* fs/block_dev.c */