block: convert to idr_alloc()
authorTejun Heo <tj@kernel.org>
Thu, 28 Feb 2013 01:03:57 +0000 (17:03 -0800)
committerLinus Torvalds <torvalds@linux-foundation.org>
Thu, 28 Feb 2013 03:10:15 +0000 (19:10 -0800)
Convert to the much saner new idr interface.  Both bsg and genhd
protect idr w/ mutex making preloading unnecessary.

Signed-off-by: Tejun Heo <tj@kernel.org>
Acked-by: Jens Axboe <axboe@kernel.dk>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
block/bsg.c
block/genhd.c

index ff64ae3bacee90c7ad93cd4859772003f8079cb4..3ca92ebf6bbbbc5819fbd5a8d05d848cc7b02480 100644 (file)
@@ -997,7 +997,7 @@ int bsg_register_queue(struct request_queue *q, struct device *parent,
 {
        struct bsg_class_device *bcd;
        dev_t dev;
-       int ret, minor;
+       int ret;
        struct device *class_dev = NULL;
        const char *devname;
 
@@ -1017,23 +1017,16 @@ int bsg_register_queue(struct request_queue *q, struct device *parent,
 
        mutex_lock(&bsg_mutex);
 
-       ret = idr_pre_get(&bsg_minor_idr, GFP_KERNEL);
-       if (!ret) {
-               ret = -ENOMEM;
-               goto unlock;
-       }
-
-       ret = idr_get_new(&bsg_minor_idr, bcd, &minor);
-       if (ret < 0)
+       ret = idr_alloc(&bsg_minor_idr, bcd, 0, BSG_MAX_DEVS, GFP_KERNEL);
+       if (ret < 0) {
+               if (ret == -ENOSPC) {
+                       printk(KERN_ERR "bsg: too many bsg devices\n");
+                       ret = -EINVAL;
+               }
                goto unlock;
-
-       if (minor >= BSG_MAX_DEVS) {
-               printk(KERN_ERR "bsg: too many bsg devices\n");
-               ret = -EINVAL;
-               goto remove_idr;
        }
 
-       bcd->minor = minor;
+       bcd->minor = ret;
        bcd->queue = q;
        bcd->parent = get_device(parent);
        bcd->release = release;
@@ -1059,8 +1052,7 @@ unregister_class_dev:
        device_unregister(class_dev);
 put_dev:
        put_device(parent);
-remove_idr:
-       idr_remove(&bsg_minor_idr, minor);
+       idr_remove(&bsg_minor_idr, bcd->minor);
 unlock:
        mutex_unlock(&bsg_mutex);
        return ret;
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;