X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=fs%2Fchar_dev.c;fp=fs%2Fchar_dev.c;h=c1e3537909fc1ae78f829220700810b78f371480;hb=f7f1b0f1e2fbadeab12d24236000e778aa9b1ead;hp=cd42dc317a5bb9f4fa437be858323738cc1fad71;hpb=e3f6fb6212a7102bdb56ba38fa1e98fe72950475;p=linux-2.6.git diff --git a/fs/char_dev.c b/fs/char_dev.c index cd42dc317..c1e353790 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 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); }