From: Jonathan Cameron Date: Wed, 24 Aug 2011 23:46:33 +0000 (+1000) Subject: This does involve additional use of the spin lock in idr.c. Is this an X-Git-Tag: next-20110905~1^2~108 X-Git-Url: https://git.karo-electronics.de/?a=commitdiff_plain;h=0441a6ac700cfc138c3f16e8417abab3c8856248;p=karo-tx-linux.git 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 --- 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; }