Merge branch 'x86-geode-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git...
[pandora-kernel.git] / drivers / hid / hidraw.c
index c79578b..cf7d6d5 100644 (file)
@@ -259,7 +259,6 @@ static int hidraw_open(struct inode *inode, struct file *file)
 
        mutex_lock(&minors_lock);
        if (!hidraw_table[minor]) {
-               kfree(list);
                err = -ENODEV;
                goto out_unlock;
        }
@@ -272,8 +271,10 @@ static int hidraw_open(struct inode *inode, struct file *file)
        dev = hidraw_table[minor];
        if (!dev->open++) {
                err = hid_hw_power(dev->hid, PM_HINT_FULLON);
-               if (err < 0)
+               if (err < 0) {
+                       dev->open--;
                        goto out_unlock;
+               }
 
                err = hid_hw_open(dev->hid);
                if (err < 0) {
@@ -285,6 +286,8 @@ static int hidraw_open(struct inode *inode, struct file *file)
 out_unlock:
        mutex_unlock(&minors_lock);
 out:
+       if (err < 0)
+               kfree(list);
        return err;
 
 }
@@ -510,13 +513,12 @@ void hidraw_disconnect(struct hid_device *hid)
 {
        struct hidraw *hidraw = hid->hidraw;
 
+       mutex_lock(&minors_lock);
        hidraw->exist = 0;
 
        device_destroy(hidraw_class, MKDEV(hidraw_major, hidraw->minor));
 
-       mutex_lock(&minors_lock);
        hidraw_table[hidraw->minor] = NULL;
-       mutex_unlock(&minors_lock);
 
        if (hidraw->open) {
                hid_hw_close(hid);
@@ -524,6 +526,7 @@ void hidraw_disconnect(struct hid_device *hid)
        } else {
                kfree(hidraw);
        }
+       mutex_unlock(&minors_lock);
 }
 EXPORT_SYMBOL_GPL(hidraw_disconnect);