From d0b70bb190f1996858a52999e973a195d8bfebbc Mon Sep 17 00:00:00 2001 From: Jonathan Cameron Date: Wed, 3 Aug 2011 10:52:45 +1000 Subject: [PATCH] This does involve additional use of the spin lock in idr.c. Is this an issue? Also, some error mangling was needed to keep the interface the same. Does this matter or can we return -ENOSPC instead of -EBUSY? Signed-off-by: Jonathan Cameron Cc: Rusty Russell Cc: Tejun Heo Cc: James Bottomley Cc: Boaz Harrosh Cc: Benny Halevy Signed-off-by: Andrew Morton --- drivers/scsi/osd/osd_uld.c | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/drivers/scsi/osd/osd_uld.c b/drivers/scsi/osd/osd_uld.c index b31a8e3841d7..fa849bdd230f 100644 --- a/drivers/scsi/osd/osd_uld.c +++ b/drivers/scsi/osd/osd_uld.c @@ -387,7 +387,7 @@ static void __remove(struct device *dev) if (oud->disk) put_disk(oud->disk); - ida_remove(&osd_minor_ida, oud->minor); + ida_simple_remove(&osd_minor_ida, oud->minor); kfree(oud); } @@ -403,18 +403,12 @@ static int osd_probe(struct device *dev) if (scsi_device->type != TYPE_OSD) return -ENODEV; - do { - if (!ida_pre_get(&osd_minor_ida, GFP_KERNEL)) - return -ENODEV; - - error = ida_get_new(&osd_minor_ida, &minor); - } while (error == -EAGAIN); - - if (error) - return error; - if (minor >= SCSI_OSD_MAX_MINOR) { - error = -EBUSY; - goto err_retract_minor; + minor = ida_simple_get(&osd_minor_ida, 0, + SCSI_OSD_MAX_MINOR, GFP_KERNEL); + if (minor < 0) { + if (minor == -ENOSPC) + return -EBUSY; + return minor; } error = -ENOMEM; @@ -491,7 +485,7 @@ err_free_osd: dev_set_drvdata(dev, NULL); kfree(oud); err_retract_minor: - ida_remove(&osd_minor_ida, minor); + ida_simple_remove(&osd_minor_ida, minor); return error; } -- 2.39.5