Oliver and Jiri:

Why is there duplicated code in
drivers/hid/usbhid/hiddev.c:hiddev_open()?

Line 267:
        /*
         * no need for locking because the USB major number
         * is shared which usbcore guards against disconnect
         */
        if (list->hiddev->exist) {
                if (!list->hiddev->open++) {
                        res = hid_hw_open(hiddev->hid);
                        if (res < 0)
                                goto bail;
                }
        } else {
                res = -ENODEV;
                goto bail;
        }

Line 286:
        mutex_lock(&hiddev->existancelock);
        if (!list->hiddev->open++)
                if (list->hiddev->exist) {
                        struct hid_device *hid = hiddev->hid;
                        res = hid_hw_power(hid, PM_HINT_FULLON);
                        if (res < 0)
                                goto bail_unlock;
                        res = hid_hw_open(hid);
                        if (res < 0)
                                goto bail_normal_power;
                }
        mutex_unlock(&hiddev->existancelock);

The second part can never execute, because the first part ensures that 
list->hiddev->open > 0 by the time the second part runs.

Even more disturbing, why is one of these code sections protected by a 
mutex and the other not?

Note: The second section was added in commit 0361a28d3f9a ("HID: 
autosuspend support for USB HID") over ten years ago!

Alan Stern

Reply via email to