Merge branch 'upstream' into for-linus
[firefly-linux-kernel-4.4.55.git] / drivers / hid / hidraw.c
index c841a8e77339b381bf8e0693c9779201377dfa06..cf7d6d58e79f25513dd0baedac00e3ddfd5f342f 100644 (file)
@@ -271,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) {
@@ -511,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);
@@ -525,6 +526,7 @@ void hidraw_disconnect(struct hid_device *hid)
        } else {
                kfree(hidraw);
        }
+       mutex_unlock(&minors_lock);
 }
 EXPORT_SYMBOL_GPL(hidraw_disconnect);