]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
block/loop: convert to idr_alloc()
authorTejun Heo <tj@kernel.org>
Wed, 20 Feb 2013 02:16:10 +0000 (13:16 +1100)
committerStephen Rothwell <sfr@canb.auug.org.au>
Wed, 20 Feb 2013 05:53:43 +0000 (16:53 +1100)
Convert to the much saner new idr interface.

Signed-off-by: Tejun Heo <tj@kernel.org>
Acked-by: Jens Axboe <axboe@kernel.dk>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
drivers/block/loop.c

index dc3891e6b5e8fcecd069da2c9671a3676007e52b..56a3963f8a5747d0e959f6fa6284559028752f71 100644 (file)
@@ -1611,30 +1611,17 @@ static int loop_add(struct loop_device **l, int i)
        if (!lo)
                goto out;
 
-       if (!idr_pre_get(&loop_index_idr, GFP_KERNEL))
-               goto out_free_dev;
-
+       /* allocate id, if @id >= 0, we're requesting that specific id */
        if (i >= 0) {
-               int m;
-
-               /* create specific i in the index */
-               err = idr_get_new_above(&loop_index_idr, lo, i, &m);
-               if (err >= 0 && i != m) {
-                       idr_remove(&loop_index_idr, m);
+               err = idr_alloc(&loop_index_idr, lo, i, i + 1, GFP_KERNEL);
+               if (err == -ENOSPC)
                        err = -EEXIST;
-               }
-       } else if (i == -1) {
-               int m;
-
-               /* get next free nr */
-               err = idr_get_new(&loop_index_idr, lo, &m);
-               if (err >= 0)
-                       i = m;
        } else {
-               err = -EINVAL;
+               err = idr_alloc(&loop_index_idr, lo, 0, 0, GFP_KERNEL);
        }
        if (err < 0)
                goto out_free_dev;
+       i = err;
 
        lo->lo_queue = blk_alloc_queue(GFP_KERNEL);
        if (!lo->lo_queue)