Merge remote-tracking branch 'agust/next' into next
[firefly-linux-kernel-4.4.55.git] / block / genhd.c
index 841b3037d866be4153a9f45cc2f56976777c508a..3c001fba80c76f3f6a22296d07a9f94cc60044a1 100644 (file)
@@ -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;