Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

block: convert to idr_alloc()

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>

authored by

Tejun Heo and committed by
Linus Torvalds
bab998d6 ce23bba8

+15 -32
+9 -17
block/bsg.c
··· 997 997 { 998 998 struct bsg_class_device *bcd; 999 999 dev_t dev; 1000 - int ret, minor; 1000 + int ret; 1001 1001 struct device *class_dev = NULL; 1002 1002 const char *devname; 1003 1003 ··· 1017 1017 1018 1018 mutex_lock(&bsg_mutex); 1019 1019 1020 - ret = idr_pre_get(&bsg_minor_idr, GFP_KERNEL); 1021 - if (!ret) { 1022 - ret = -ENOMEM; 1020 + ret = idr_alloc(&bsg_minor_idr, bcd, 0, BSG_MAX_DEVS, GFP_KERNEL); 1021 + if (ret < 0) { 1022 + if (ret == -ENOSPC) { 1023 + printk(KERN_ERR "bsg: too many bsg devices\n"); 1024 + ret = -EINVAL; 1025 + } 1023 1026 goto unlock; 1024 1027 } 1025 1028 1026 - ret = idr_get_new(&bsg_minor_idr, bcd, &minor); 1027 - if (ret < 0) 1028 - goto unlock; 1029 - 1030 - if (minor >= BSG_MAX_DEVS) { 1031 - printk(KERN_ERR "bsg: too many bsg devices\n"); 1032 - ret = -EINVAL; 1033 - goto remove_idr; 1034 - } 1035 - 1036 - bcd->minor = minor; 1029 + bcd->minor = ret; 1037 1030 bcd->queue = q; 1038 1031 bcd->parent = get_device(parent); 1039 1032 bcd->release = release; ··· 1052 1059 device_unregister(class_dev); 1053 1060 put_dev: 1054 1061 put_device(parent); 1055 - remove_idr: 1056 - idr_remove(&bsg_minor_idr, minor); 1062 + idr_remove(&bsg_minor_idr, bcd->minor); 1057 1063 unlock: 1058 1064 mutex_unlock(&bsg_mutex); 1059 1065 return ret;
+6 -15
block/genhd.c
··· 411 411 int blk_alloc_devt(struct hd_struct *part, dev_t *devt) 412 412 { 413 413 struct gendisk *disk = part_to_disk(part); 414 - int idx, rc; 414 + int idx; 415 415 416 416 /* in consecutive minor range? */ 417 417 if (part->partno < disk->minors) { ··· 420 420 } 421 421 422 422 /* allocate ext devt */ 423 - do { 424 - if (!idr_pre_get(&ext_devt_idr, GFP_KERNEL)) 425 - return -ENOMEM; 426 - mutex_lock(&ext_devt_mutex); 427 - rc = idr_get_new(&ext_devt_idr, part, &idx); 428 - if (!rc && idx >= NR_EXT_DEVT) { 429 - idr_remove(&ext_devt_idr, idx); 430 - rc = -EBUSY; 431 - } 432 - mutex_unlock(&ext_devt_mutex); 433 - } while (rc == -EAGAIN); 434 - 435 - if (rc) 436 - return rc; 423 + mutex_lock(&ext_devt_mutex); 424 + idx = idr_alloc(&ext_devt_idr, part, 0, NR_EXT_DEVT, GFP_KERNEL); 425 + mutex_unlock(&ext_devt_mutex); 426 + if (idx < 0) 427 + return idx == -ENOSPC ? -EBUSY : idx; 437 428 438 429 *devt = MKDEV(BLOCK_EXT_MAJOR, blk_mangle_minor(idx)); 439 430 return 0;