aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/char/misc.c
diff options
context:
space:
mode:
authorThadeu Lima de Souza Cascardo <cascardo@holoscopio.com>2009-12-14 21:00:30 -0500
committerLinus Torvalds <torvalds@linux-foundation.org>2009-12-15 11:53:27 -0500
commit4ae717da8d18839487485f6ae608b8542790fdd3 (patch)
tree9db3390a593c0335f6944fd094c8fd8f52455be8 /drivers/char/misc.c
parent603c4ba96be998a8dd7a6f9b23681c49acdf4b64 (diff)
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/misc.c')
-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)
214 misc->this_device = device_create(misc_class, misc->parent, dev, 214 misc->this_device = device_create(misc_class, misc->parent, dev,
215 misc, "%s", misc->name); 215 misc, "%s", misc->name);
216 if (IS_ERR(misc->this_device)) { 216 if (IS_ERR(misc->this_device)) {
217 int i = misc->minor;
218 if (i < DYNAMIC_MINORS && i >= 0)
219 misc_minors[i>>3] &= ~(1 << (i & 7));
217 err = PTR_ERR(misc->this_device); 220 err = PTR_ERR(misc->this_device);
218 goto out; 221 goto out;
219 } 222 }
@@ -248,9 +251,8 @@ int misc_deregister(struct miscdevice *misc)
248 mutex_lock(&misc_mtx); 251 mutex_lock(&misc_mtx);
249 list_del(&misc->list); 252 list_del(&misc->list);
250 device_destroy(misc_class, MKDEV(MISC_MAJOR, misc->minor)); 253 device_destroy(misc_class, MKDEV(MISC_MAJOR, misc->minor));
251 if (i < DYNAMIC_MINORS && i>0) { 254 if (i < DYNAMIC_MINORS && i >= 0)
252 misc_minors[i>>3] &= ~(1 << (misc->minor & 7)); 255 misc_minors[i>>3] &= ~(1 << (i & 7));
253 }
254 mutex_unlock(&misc_mtx); 256 mutex_unlock(&misc_mtx);
255 return 0; 257 return 0;
256} 258}