mirror of
https://github.com/adulau/aha.git
synced 2024-12-27 19:26:25 +00:00
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>
This commit is contained in:
parent
603c4ba96b
commit
4ae717da8d
1 changed files with 5 additions and 3 deletions
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue