drbd: convert to idr_alloc()
authorTejun Heo <tj@kernel.org>
Thu, 28 Feb 2013 01:04:01 +0000 (17:04 -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.

Signed-off-by: Tejun Heo <tj@kernel.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
drivers/block/drbd/drbd_main.c

index 8c13eeb..e98da67 100644 (file)
@@ -2660,25 +2660,24 @@ enum drbd_ret_code conn_new_minor(struct drbd_tconn *tconn, unsigned int minor,
        mdev->read_requests = RB_ROOT;
        mdev->write_requests = RB_ROOT;
 
-       if (!idr_pre_get(&minors, GFP_KERNEL))
-               goto out_no_minor_idr;
-       if (idr_get_new_above(&minors, mdev, minor, &minor_got))
+       minor_got = idr_alloc(&minors, mdev, minor, minor + 1, GFP_KERNEL);
+       if (minor_got < 0) {
+               if (minor_got == -ENOSPC) {
+                       err = ERR_MINOR_EXISTS;
+                       drbd_msg_put_info("requested minor exists already");
+               }
                goto out_no_minor_idr;
-       if (minor_got != minor) {
-               err = ERR_MINOR_EXISTS;
-               drbd_msg_put_info("requested minor exists already");
-               goto out_idr_remove_minor;
        }
 
-       if (!idr_pre_get(&tconn->volumes, GFP_KERNEL))
-               goto out_idr_remove_minor;
-       if (idr_get_new_above(&tconn->volumes, mdev, vnr, &vnr_got))
+       vnr_got = idr_alloc(&tconn->volumes, mdev, vnr, vnr + 1, GFP_KERNEL);
+       if (vnr_got < 0) {
+               if (vnr_got == -ENOSPC) {
+                       err = ERR_INVALID_REQUEST;
+                       drbd_msg_put_info("requested volume exists already");
+               }
                goto out_idr_remove_minor;
-       if (vnr_got != vnr) {
-               err = ERR_INVALID_REQUEST;
-               drbd_msg_put_info("requested volume exists already");
-               goto out_idr_remove_vol;
        }
+
        add_disk(disk);
        kref_init(&mdev->kref); /* one ref for both idrs and the the add_disk */
 
@@ -2689,8 +2688,6 @@ enum drbd_ret_code conn_new_minor(struct drbd_tconn *tconn, unsigned int minor,
 
        return NO_ERROR;
 
-out_idr_remove_vol:
-       idr_remove(&tconn->volumes, vnr_got);
 out_idr_remove_minor:
        idr_remove(&minors, minor_got);
        synchronize_rcu();