vserver 1.9.5.x5
[linux-2.6.git] / fs / char_dev.c
index a1fd846..cd42dc3 100644 (file)
@@ -28,7 +28,7 @@ static struct kobj_map *cdev_map;
 
 #define MAX_PROBE_HASH 255     /* random */
 
-static rwlock_t chrdevs_lock = RW_LOCK_UNLOCKED;
+static DEFINE_RWLOCK(chrdevs_lock);
 
 static struct char_device_struct {
        struct char_device_struct *next;
@@ -153,7 +153,7 @@ __unregister_chrdev_region(unsigned major, unsigned baseminor, int minorct)
        return cd;
 }
 
-int register_chrdev_region(dev_t from, unsigned count, char *name)
+int register_chrdev_region(dev_t from, unsigned count, const char *name)
 {
        struct char_device_struct *cd;
        dev_t to = from + count;
@@ -178,7 +178,8 @@ fail:
        return PTR_ERR(cd);
 }
 
-int alloc_chrdev_region(dev_t *dev, unsigned baseminor, unsigned count, char *name)
+int alloc_chrdev_region(dev_t *dev, unsigned baseminor, unsigned count,
+                       const char *name)
 {
        struct char_device_struct *cd;
        cd = __register_chrdev_region(0, baseminor, count, name);
@@ -206,8 +207,8 @@ int register_chrdev(unsigned int major, const char *name,
 
        cdev->owner = fops->owner;
        cdev->ops = fops;
-       strcpy(cdev->kobj.name, name);
-       for (s = strchr(cdev->kobj.name, '/'); s; s = strchr(s, '/'))
+       kobject_set_name(&cdev->kobj, "%s", name);
+       for (s = strchr(kobject_name(&cdev->kobj),'/'); s; s = strchr(s, '/'))
                *s = '!';
                
        err = cdev_add(cdev, MKDEV(cd->major, 0), 256);
@@ -247,7 +248,29 @@ int unregister_chrdev(unsigned int major, const char *name)
        return 0;
 }
 
-static spinlock_t cdev_lock = SPIN_LOCK_UNLOCKED;
+static DEFINE_SPINLOCK(cdev_lock);
+
+static struct kobject *cdev_get(struct cdev *p)
+{
+       struct module *owner = p->owner;
+       struct kobject *kobj;
+
+       if (owner && !try_module_get(owner))
+               return NULL;
+       kobj = kobject_get(&p->kobj);
+       if (!kobj)
+               module_put(owner);
+       return kobj;
+}
+
+void cdev_put(struct cdev *p)
+{
+       if (p) {
+               kobject_put(&p->kobj);
+               module_put(p->owner);
+       }
+}
+
 /*
  * Called every time a character special file is opened
  */
@@ -356,26 +379,6 @@ void cdev_del(struct cdev *p)
        kobject_put(&p->kobj);
 }
 
-struct kobject *cdev_get(struct cdev *p)
-{
-       struct module *owner = p->owner;
-       struct kobject *kobj;
-
-       if (owner && !try_module_get(owner))
-               return NULL;
-       kobj = kobject_get(&p->kobj);
-       if (!kobj)
-               module_put(owner);
-       return kobj;
-}
-
-void cdev_put(struct cdev *p)
-{
-       if (p) {
-               kobject_put(&p->kobj);
-               module_put(p->owner);
-       }
-}
 
 static decl_subsys(cdev, NULL, NULL);
 
@@ -414,6 +417,7 @@ struct cdev *cdev_alloc(void)
 
 void cdev_init(struct cdev *cdev, struct file_operations *fops)
 {
+       memset(cdev, 0, sizeof *cdev);
        INIT_LIST_HEAD(&cdev->list);
        cdev->kobj.ktype = &ktype_cdev_default;
        kobject_init(&cdev->kobj);
@@ -446,8 +450,6 @@ EXPORT_SYMBOL(unregister_chrdev_region);
 EXPORT_SYMBOL(alloc_chrdev_region);
 EXPORT_SYMBOL(cdev_init);
 EXPORT_SYMBOL(cdev_alloc);
-EXPORT_SYMBOL(cdev_get);
-EXPORT_SYMBOL(cdev_put);
 EXPORT_SYMBOL(cdev_del);
 EXPORT_SYMBOL(cdev_add);
 EXPORT_SYMBOL(register_chrdev);