|
@@ -60,7 +60,7 @@ static DEFINE_MUTEX(misc_mtx);
|
|
|
* Assigned numbers, used for dynamic minors
|
|
|
*/
|
|
|
#define DYNAMIC_MINORS 64 /* like dynamic majors */
|
|
|
-static unsigned char misc_minors[DYNAMIC_MINORS / 8];
|
|
|
+static DECLARE_BITMAP(misc_minors, DYNAMIC_MINORS);
|
|
|
|
|
|
#ifdef CONFIG_PROC_FS
|
|
|
static void *misc_seq_start(struct seq_file *seq, loff_t *pos)
|
|
@@ -196,27 +196,23 @@ int misc_register(struct miscdevice * misc)
|
|
|
}
|
|
|
|
|
|
if (misc->minor == MISC_DYNAMIC_MINOR) {
|
|
|
- int i = DYNAMIC_MINORS;
|
|
|
- while (--i >= 0)
|
|
|
- if ( (misc_minors[i>>3] & (1 << (i&7))) == 0)
|
|
|
- break;
|
|
|
- if (i<0) {
|
|
|
+ int i = find_first_zero_bit(misc_minors, DYNAMIC_MINORS);
|
|
|
+ if (i >= DYNAMIC_MINORS) {
|
|
|
mutex_unlock(&misc_mtx);
|
|
|
return -EBUSY;
|
|
|
}
|
|
|
- misc->minor = i;
|
|
|
+ misc->minor = DYNAMIC_MINORS - i - 1;
|
|
|
+ set_bit(i, misc_minors);
|
|
|
}
|
|
|
|
|
|
- if (misc->minor < DYNAMIC_MINORS)
|
|
|
- misc_minors[misc->minor >> 3] |= 1 << (misc->minor & 7);
|
|
|
dev = MKDEV(MISC_MAJOR, misc->minor);
|
|
|
|
|
|
misc->this_device = device_create(misc_class, misc->parent, dev,
|
|
|
misc, "%s", misc->name);
|
|
|
if (IS_ERR(misc->this_device)) {
|
|
|
- int i = misc->minor;
|
|
|
+ int i = DYNAMIC_MINORS - misc->minor - 1;
|
|
|
if (i < DYNAMIC_MINORS && i >= 0)
|
|
|
- misc_minors[i>>3] &= ~(1 << (i & 7));
|
|
|
+ clear_bit(i, misc_minors);
|
|
|
err = PTR_ERR(misc->this_device);
|
|
|
goto out;
|
|
|
}
|
|
@@ -243,7 +239,7 @@ int misc_register(struct miscdevice * misc)
|
|
|
|
|
|
int misc_deregister(struct miscdevice *misc)
|
|
|
{
|
|
|
- int i = misc->minor;
|
|
|
+ int i = DYNAMIC_MINORS - misc->minor - 1;
|
|
|
|
|
|
if (list_empty(&misc->list))
|
|
|
return -EINVAL;
|
|
@@ -252,7 +248,7 @@ int misc_deregister(struct miscdevice *misc)
|
|
|
list_del(&misc->list);
|
|
|
device_destroy(misc_class, MKDEV(MISC_MAJOR, misc->minor));
|
|
|
if (i < DYNAMIC_MINORS && i >= 0)
|
|
|
- misc_minors[i>>3] &= ~(1 << (i & 7));
|
|
|
+ clear_bit(i, misc_minors);
|
|
|
mutex_unlock(&misc_mtx);
|
|
|
return 0;
|
|
|
}
|