#include <linux/cdev.h>
#include <linux/jiffies.h>
#include <linux/percpu.h>
-#include <linux/idr.h>
#include <linux/bsg.h>
#include <linux/slab.h>
+#include <linux/xarray.h>
#include <scsi/scsi.h>
#include <scsi/scsi_ioctl.h>
#define BSG_MAX_DEVS 32768
static DEFINE_MUTEX(bsg_mutex);
-static DEFINE_IDR(bsg_minor_idr);
+static DEFINE_XARRAY_ALLOC(bsg_classes);
#define BSG_LIST_ARRAY_SIZE 8
static struct hlist_head bsg_device_list[BSG_LIST_ARRAY_SIZE];
* find the class device
*/
mutex_lock(&bsg_mutex);
- bcd = idr_find(&bsg_minor_idr, iminor(inode));
+ bcd = xa_load(&bsg_classes, iminor(inode));
if (!bcd) {
bd = ERR_PTR(-ENODEV);
return;
mutex_lock(&bsg_mutex);
- idr_remove(&bsg_minor_idr, bcd->minor);
+ xa_erase(&bsg_classes, bcd->minor);
if (q->kobj.sd)
sysfs_remove_link(&q->kobj, "bsg");
device_unregister(bcd->class_dev);
mutex_lock(&bsg_mutex);
- ret = idr_alloc(&bsg_minor_idr, bcd, 0, BSG_MAX_DEVS, GFP_KERNEL);
+ ret = xa_alloc(&bsg_classes, &bcd->minor, bcd,
+ XA_LIMIT(0, BSG_MAX_DEVS - 1), GFP_KERNEL);
if (ret < 0) {
- if (ret == -ENOSPC) {
+ if (ret == -EBUSY) {
printk(KERN_ERR "bsg: too many bsg devices\n");
ret = -EINVAL;
}
goto unlock;
}
- bcd->minor = ret;
bcd->queue = q;
bcd->ops = ops;
dev = MKDEV(bsg_major, bcd->minor);
class_dev = device_create(bsg_class, parent, dev, NULL, "%s", name);
if (IS_ERR(class_dev)) {
ret = PTR_ERR(class_dev);
- goto idr_remove;
+ goto remove;
}
bcd->class_dev = class_dev;
unregister_class_dev:
device_unregister(class_dev);
-idr_remove:
- idr_remove(&bsg_minor_idr, bcd->minor);
+remove:
+ xa_erase(&bsg_classes, bcd->minor);
unlock:
mutex_unlock(&bsg_mutex);
return ret;