X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=fs%2Fchar_dev.c;h=cd42dc317a5bb9f4fa437be858323738cc1fad71;hb=af20d436230b2df6d73a406b6f1b31ae000775cb;hp=a1fd846920d37d7308f5bb3ec01809afef059aaf;hpb=5273a3df6485dc2ad6aa7ddd441b9a21970f003b;p=linux-2.6.git diff --git a/fs/char_dev.c b/fs/char_dev.c index a1fd84692..cd42dc317 100644 --- a/fs/char_dev.c +++ b/fs/char_dev.c @@ -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);