|
@@ -411,7 +411,7 @@ static int blk_mangle_minor(int minor)
|
|
|
int blk_alloc_devt(struct hd_struct *part, dev_t *devt)
|
|
|
{
|
|
|
struct gendisk *disk = part_to_disk(part);
|
|
|
- int idx, rc;
|
|
|
+ int idx;
|
|
|
|
|
|
/* in consecutive minor range? */
|
|
|
if (part->partno < disk->minors) {
|
|
@@ -420,20 +420,11 @@ int blk_alloc_devt(struct hd_struct *part, dev_t *devt)
|
|
|
}
|
|
|
|
|
|
/* allocate ext devt */
|
|
|
- do {
|
|
|
- if (!idr_pre_get(&ext_devt_idr, GFP_KERNEL))
|
|
|
- return -ENOMEM;
|
|
|
- mutex_lock(&ext_devt_mutex);
|
|
|
- rc = idr_get_new(&ext_devt_idr, part, &idx);
|
|
|
- if (!rc && idx >= NR_EXT_DEVT) {
|
|
|
- idr_remove(&ext_devt_idr, idx);
|
|
|
- rc = -EBUSY;
|
|
|
- }
|
|
|
- mutex_unlock(&ext_devt_mutex);
|
|
|
- } while (rc == -EAGAIN);
|
|
|
-
|
|
|
- if (rc)
|
|
|
- return rc;
|
|
|
+ mutex_lock(&ext_devt_mutex);
|
|
|
+ idx = idr_alloc(&ext_devt_idr, part, 0, NR_EXT_DEVT, GFP_KERNEL);
|
|
|
+ mutex_unlock(&ext_devt_mutex);
|
|
|
+ if (idx < 0)
|
|
|
+ return idx == -ENOSPC ? -EBUSY : idx;
|
|
|
|
|
|
*devt = MKDEV(BLOCK_EXT_MAJOR, blk_mangle_minor(idx));
|
|
|
return 0;
|