Merge branch 'slabh' of git://git.kernel.org/pub/scm/linux/kernel/git/tj/misc
[sfrench/cifs-2.6.git] / drivers / staging / iio / industrialio-core.c
index 768f44894d087ec2fd3bc2c9b7db93f727a06ce0..37f58f66e49127dfebd5e10d1c81dbd60349d37e 100644 (file)
@@ -21,6 +21,7 @@
 #include <linux/sched.h>
 #include <linux/wait.h>
 #include <linux/cdev.h>
+#include <linux/slab.h>
 #include "iio.h"
 #include "trigger_consumer.h"
 
@@ -79,11 +80,14 @@ EXPORT_SYMBOL(__iio_change_event);
        /* Does anyone care? */
        mutex_lock(&ev_int->event_list_lock);
        if (test_bit(IIO_BUSY_BIT_POS, &ev_int->handler.flags)) {
-               if (ev_int->current_events == ev_int->max_events)
+               if (ev_int->current_events == ev_int->max_events) {
+                       mutex_unlock(&ev_int->event_list_lock);
                        return 0;
+               }
                ev = kmalloc(sizeof(*ev), GFP_KERNEL);
                if (ev == NULL) {
                        ret = -ENOMEM;
+                       mutex_unlock(&ev_int->event_list_lock);
                        goto error_ret;
                }
                ev->ev.id = ev_code;
@@ -115,7 +119,7 @@ int iio_push_event(struct iio_dev *dev_info,
 EXPORT_SYMBOL(iio_push_event);
 
 /* Generic interrupt line interrupt handler */
-irqreturn_t iio_interrupt_handler(int irq, void *_int_info)
+static irqreturn_t iio_interrupt_handler(int irq, void *_int_info)
 {
        struct iio_interrupt *int_info = _int_info;
        struct iio_dev *dev_info = int_info->dev_info;
@@ -249,10 +253,10 @@ void iio_remove_event_from_list(struct iio_event_handler_list *el,
 }
 EXPORT_SYMBOL(iio_remove_event_from_list);
 
-ssize_t iio_event_chrdev_read(struct file *filep,
-                             char *buf,
-                             size_t count,
-                             loff_t *f_ps)
+static ssize_t iio_event_chrdev_read(struct file *filep,
+                                    char __user *buf,
+                                    size_t count,
+                                    loff_t *f_ps)
 {
        struct iio_event_interface *ev_int = filep->private_data;
        struct iio_detected_event_list *el;
@@ -289,16 +293,16 @@ ssize_t iio_event_chrdev_read(struct file *filep,
        mutex_unlock(&ev_int->event_list_lock);
        /*
         * Possible concurency issue if an update of this event is on its way
-        * through. May lead to new even being removed whilst the reported event
-        * was the unescalated event. In typical use case this is not a problem
-        * as userspace will say read half the buffer due to a 50% full event
-        * which would make the correct 100% full incorrect anyway.
+        * through. May lead to new event being removed whilst the reported
+        * event was the unescalated event. In typical use case this is not a
+        * problem as userspace will say read half the buffer due to a 50%
+        * full event which would make the correct 100% full incorrect anyway.
         */
-       spin_lock(&el->shared_pointer->lock);
-       if (el->shared_pointer)
+       if (el->shared_pointer) {
+               spin_lock(&el->shared_pointer->lock);
                (el->shared_pointer->ev_p) = NULL;
-       spin_unlock(&el->shared_pointer->lock);
-
+               spin_unlock(&el->shared_pointer->lock);
+       }
        kfree(el);
 
        return len;
@@ -310,7 +314,7 @@ error_ret:
        return ret;
 }
 
-int iio_event_chrdev_release(struct inode *inode, struct file *filep)
+static int iio_event_chrdev_release(struct inode *inode, struct file *filep)
 {
        struct iio_handler *hand = iio_cdev_to_handler(inode->i_cdev);
        struct iio_event_interface *ev_int = hand->private;
@@ -332,7 +336,7 @@ int iio_event_chrdev_release(struct inode *inode, struct file *filep)
        return 0;
 }
 
-int iio_event_chrdev_open(struct inode *inode, struct file *filep)
+static int iio_event_chrdev_open(struct inode *inode, struct file *filep)
 {
        struct iio_handler *hand = iio_cdev_to_handler(inode->i_cdev);
        struct iio_event_interface *ev_int = hand->private;