diff options
author | Tejun Heo <tj@kernel.org> | 2013-02-28 02:03:57 +0100 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2013-02-28 04:10:15 +0100 |
commit | bab998d62f12db12b3ddf1e06b2ecd4ed9e7ae45 (patch) | |
tree | 4fdd87842d72efb147ce12e513ccaccabebae4fb /block/genhd.c | |
parent | block: fix synchronization and limit check in blk_alloc_devt() (diff) | |
download | linux-bab998d62f12db12b3ddf1e06b2ecd4ed9e7ae45.tar.xz linux-bab998d62f12db12b3ddf1e06b2ecd4ed9e7ae45.zip |
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>
Diffstat (limited to 'block/genhd.c')
-rw-r--r-- | block/genhd.c | 21 |
1 files changed, 6 insertions, 15 deletions
diff --git a/block/genhd.c b/block/genhd.c index 841b3037d866..3c001fba80c7 100644 --- a/block/genhd.c +++ b/block/genhd.c @@ -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; |