Hi, several resources are not freed if autoresume fails.
Regards Oliver Signed-off-by: Oliver Neukum <[EMAIL PROTECTED]> ---- --- a/drivers/hid/usbhid/hiddev.c 2007-10-05 15:42:45.000000000 +0200 +++ b/drivers/hid/usbhid/hiddev.c 2007-10-05 15:54:32.000000000 +0200 @@ -280,18 +280,21 @@ static int hiddev_open(struct inode *ino list->hiddev = hiddev_table[i]; - spin_lock_irqsave(&list->hiddev->list_lock, flags); - list_add_tail(&list->node, &hiddev_table[i]->list); - spin_unlock_irqrestore(&list->hiddev->list_lock, flags); - - file->private_data = list; - if (!list->hiddev->open++) if (list->hiddev->exist) { struct hid_device *hid = hiddev_table[i]->hid; res = usbhid_get_power(hid); - if (res < 0) + if (res < 0) { + hiddev_table[i]->open--; + kfree(list); return -EIO; + } else { + spin_lock_irqsave(&list->hiddev->list_lock, flags); + list_add_tail(&list->node, &hiddev_table[i]->list); + spin_unlock_irqrestore(&list->hiddev->list_lock, flags); + + file->private_data = list; + } usbhid_open(hid); }