From: Matthew Wilcox Date: Mon, 18 Feb 2019 22:29:10 +0000 (-0500) Subject: pi433: Convert pi433_idr to XArray X-Git-Url: https://www.infradead.org/git/?a=commitdiff_plain;h=19010b309fbd560e7b172878619eeb927824546d;p=users%2Fwilly%2Fxarray.git pi433: Convert pi433_idr to XArray Signed-off-by: Matthew Wilcox --- diff --git a/drivers/staging/pi433/pi433_if.c b/drivers/staging/pi433/pi433_if.c index 40c6f4e7632f..a34e684b7445 100644 --- a/drivers/staging/pi433/pi433_if.c +++ b/drivers/staging/pi433/pi433_if.c @@ -20,7 +20,6 @@ #include #include -#include #include #include #include @@ -37,6 +36,7 @@ #include #include #include +#include #include #ifdef CONFIG_COMPAT #include @@ -51,8 +51,7 @@ #define NUM_DIO 2 static dev_t pi433_dev; -static DEFINE_IDR(pi433_idr); -static DEFINE_MUTEX(minor_lock); /* Protect idr accesses */ +static DEFINE_XARRAY_ALLOC(pi433_devs); static struct class *pi433_class; /* mainly for udev to create /dev/pi433 */ @@ -945,9 +944,7 @@ static int pi433_open(struct inode *inode, struct file *filp) struct pi433_device *device; struct pi433_instance *instance; - mutex_lock(&minor_lock); - device = idr_find(&pi433_idr, iminor(inode)); - mutex_unlock(&minor_lock); + device = xa_load(&pi433_devs, iminor(inode)); if (!device) { pr_debug("device: minor %d unknown.\n", iminor(inode)); return -ENODEV; @@ -1060,26 +1057,21 @@ static void free_gpio(struct pi433_device *device) static int pi433_get_minor(struct pi433_device *device) { - int retval = -ENOMEM; - - mutex_lock(&minor_lock); - retval = idr_alloc(&pi433_idr, device, 0, N_PI433_MINORS, GFP_KERNEL); - if (retval >= 0) { - device->minor = retval; - retval = 0; - } else if (retval == -ENOSPC) { + int err; + + err = xa_alloc(&pi433_devs, &device->minor, device, + XA_LIMIT(0, N_PI433_MINORS - 1), GFP_KERNEL); + if (err == -EBUSY) { dev_err(&device->spi->dev, "too many pi433 devices\n"); - retval = -EINVAL; + err = -EINVAL; } - mutex_unlock(&minor_lock); - return retval; + + return err; } static void pi433_free_minor(struct pi433_device *dev) { - mutex_lock(&minor_lock); - idr_remove(&pi433_idr, dev->minor); - mutex_unlock(&minor_lock); + xa_erase(&pi433_devs, dev->minor); } /*-------------------------------------------------------------------------*/