summaryrefslogtreecommitdiffstats
path: root/drivers/char
diff options
context:
space:
mode:
authorThadeu Lima de Souza Cascardo <cascardo@holoscopio.com>2009-12-15 03:00:30 +0100
committerLinus Torvalds <torvalds@linux-foundation.org>2009-12-15 17:53:27 +0100
commit4ae717da8d18839487485f6ae608b8542790fdd3 (patch)
tree9db3390a593c0335f6944fd094c8fd8f52455be8 /drivers/char
parenterr.h: add helper function to simplify pointer error checking (diff)
downloadlinux-4ae717da8d18839487485f6ae608b8542790fdd3.tar.xz
linux-4ae717da8d18839487485f6ae608b8542790fdd3.zip
drivers/char/misc.c: clear allocation bit in minor bitmap when device register fails
If there's a failure creating the device (because there's already one with the same name, for example), the current implementation does not clear the bit for the allocated minor and that number is lost for future allocations. Second, the test currently in misc_deregister is broken, since it does not test for the 0 minor. Signed-off-by: Thadeu Lima de Souza Cascardo <cascardo@holoscopio.com> Cc: "H. Peter Anvin" <hpa@zytor.com> Cc: Alan Cox <alan@lxorguk.ukuu.org.uk> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'drivers/char')
-rw-r--r--drivers/char/misc.c8
1 files changed, 5 insertions, 3 deletions
diff --git a/drivers/char/misc.c b/drivers/char/misc.c
index 281edefffa0b..a3a02f6303c8 100644
--- a/drivers/char/misc.c
+++ b/drivers/char/misc.c
@@ -214,6 +214,9 @@ int misc_register(struct miscdevice * misc)
misc->this_device = device_create(misc_class, misc->parent, dev,
misc, "%s", misc->name);
if (IS_ERR(misc->this_device)) {
+ int i = misc->minor;
+ if (i < DYNAMIC_MINORS && i >= 0)
+ misc_minors[i>>3] &= ~(1 << (i & 7));
err = PTR_ERR(misc->this_device);
goto out;
}
@@ -248,9 +251,8 @@ int misc_deregister(struct miscdevice *misc)
mutex_lock(&misc_mtx);
list_del(&misc->list);
device_destroy(misc_class, MKDEV(MISC_MAJOR, misc->minor));
- if (i < DYNAMIC_MINORS && i>0) {
- misc_minors[i>>3] &= ~(1 << (misc->minor & 7));
- }
+ if (i < DYNAMIC_MINORS && i >= 0)
+ misc_minors[i>>3] &= ~(1 << (i & 7));
mutex_unlock(&misc_mtx);
return 0;
}