vserver 2.0 rc7
[linux-2.6.git] / fs / char_dev.c
index cd42dc3..c1e3537 100644 (file)
@@ -28,7 +28,7 @@ static struct kobj_map *cdev_map;
 
 #define MAX_PROBE_HASH 255     /* random */
 
-static DEFINE_RWLOCK(chrdevs_lock);
+static DECLARE_MUTEX(chrdevs_lock);
 
 static struct char_device_struct {
        struct char_device_struct *next;
@@ -54,13 +54,13 @@ int get_chrdev_list(char *page)
 
        len = sprintf(page, "Character devices:\n");
 
-       read_lock(&chrdevs_lock);
+       down(&chrdevs_lock);
        for (i = 0; i < ARRAY_SIZE(chrdevs) ; i++) {
                for (cd = chrdevs[i]; cd; cd = cd->next)
                        len += sprintf(page+len, "%3d %s\n",
                                       cd->major, cd->name);
        }
-       read_unlock(&chrdevs_lock);
+       up(&chrdevs_lock);
 
        return len;
 }
@@ -90,7 +90,7 @@ __register_chrdev_region(unsigned int major, unsigned int baseminor,
 
        memset(cd, 0, sizeof(struct char_device_struct));
 
-       write_lock_irq(&chrdevs_lock);
+       down(&chrdevs_lock);
 
        /* temporary */
        if (major == 0) {
@@ -125,10 +125,10 @@ __register_chrdev_region(unsigned int major, unsigned int baseminor,
        }
        cd->next = *cp;
        *cp = cd;
-       write_unlock_irq(&chrdevs_lock);
+       up(&chrdevs_lock);
        return cd;
 out:
-       write_unlock_irq(&chrdevs_lock);
+       up(&chrdevs_lock);
        kfree(cd);
        return ERR_PTR(ret);
 }
@@ -139,7 +139,7 @@ __unregister_chrdev_region(unsigned major, unsigned baseminor, int minorct)
        struct char_device_struct *cd = NULL, **cp;
        int i = major_to_index(major);
 
-       write_lock_irq(&chrdevs_lock);
+       up(&chrdevs_lock);
        for (cp = &chrdevs[i]; *cp; cp = &(*cp)->next)
                if ((*cp)->major == major &&
                    (*cp)->baseminor == baseminor &&
@@ -149,7 +149,7 @@ __unregister_chrdev_region(unsigned major, unsigned baseminor, int minorct)
                cd = *cp;
                *cp = cd->next;
        }
-       write_unlock_irq(&chrdevs_lock);
+       up(&chrdevs_lock);
        return cd;
 }
 
@@ -328,7 +328,7 @@ void cd_forget(struct inode *inode)
        spin_unlock(&cdev_lock);
 }
 
-void cdev_purge(struct cdev *cdev)
+static void cdev_purge(struct cdev *cdev)
 {
        spin_lock(&cdev_lock);
        while (!list_empty(&cdev->list)) {
@@ -380,8 +380,6 @@ void cdev_del(struct cdev *p)
 }
 
 
-static decl_subsys(cdev, NULL, NULL);
-
 static void cdev_default_release(struct kobject *kobj)
 {
        struct cdev *p = container_of(kobj, struct cdev, kobj);
@@ -434,13 +432,7 @@ static struct kobject *base_probe(dev_t dev, int *part, void *data)
 
 void __init chrdev_init(void)
 {
-/*
- * Keep cdev_subsys around because (and only because) the kobj_map code
- * depends on the rwsem it contains.  We don't make it public in sysfs,
- * however.
- */
-       subsystem_init(&cdev_subsys);
-       cdev_map = kobj_map_init(base_probe, &cdev_subsys);
+       cdev_map = kobj_map_init(base_probe, &chrdevs_lock);
 }