]> www.infradead.org Git - users/willy/xarray.git/commitdiff
pi433: Convert pi433_idr to XArray
authorMatthew Wilcox <willy@infradead.org>
Mon, 18 Feb 2019 22:29:10 +0000 (17:29 -0500)
committerMatthew Wilcox (Oracle) <willy@infradead.org>
Fri, 9 Aug 2019 01:38:18 +0000 (21:38 -0400)
Signed-off-by: Matthew Wilcox <willy@infradead.org>
drivers/staging/pi433/pi433_if.c

index 40c6f4e7632f951c363a6833030232b8cef20743..a34e684b7445ca82949bf63022fc67ac8d288b3f 100644 (file)
@@ -20,7 +20,6 @@
 
 #include <linux/init.h>
 #include <linux/module.h>
-#include <linux/idr.h>
 #include <linux/ioctl.h>
 #include <linux/uaccess.h>
 #include <linux/fs.h>
@@ -37,6 +36,7 @@
 #include <linux/gpio/consumer.h>
 #include <linux/kthread.h>
 #include <linux/wait.h>
+#include <linux/xarray.h>
 #include <linux/spi/spi.h>
 #ifdef CONFIG_COMPAT
 #include <linux/compat.h>
@@ -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);
 }
 
 /*-------------------------------------------------------------------------*/