HID: remove BKL from hiddev_ioctl_usage()
Jiri Kosina [Thu, 5 Nov 2009 15:01:13 +0000 (16:01 +0100)]
The race between ioctl and disconnect is guarded by low level
hiddev device mutex (existancelock) since the commit
07903407 ("HID: hiddev cleanup -- handle all error conditions
properly"), therefore we can remove the lock_kernel() from
hiddev_ioctl_usage().

Acked-by: Oliver Neukum <oliver@neukum.org>
Signed-off-by: Jiri Kosina <jkosina@suse.cz>

drivers/hid/usbhid/hiddev.c

index 8b6ee24..867e084 100644 (file)
@@ -450,7 +450,6 @@ static noinline int hiddev_ioctl_usage(struct hiddev *hiddev, unsigned int cmd,
        uref_multi = kmalloc(sizeof(struct hiddev_usage_ref_multi), GFP_KERNEL);
        if (!uref_multi)
                return -ENOMEM;
-       lock_kernel();
        uref = &uref_multi->uref;
        if (cmd == HIDIOCGUSAGES || cmd == HIDIOCSUSAGES) {
                if (copy_from_user(uref_multi, user_arg,
@@ -528,7 +527,6 @@ static noinline int hiddev_ioctl_usage(struct hiddev *hiddev, unsigned int cmd,
 
                case HIDIOCGCOLLECTIONINDEX:
                        i = field->usage[uref->usage_index].collection_index;
-                       unlock_kernel();
                        kfree(uref_multi);
                        return i;
                case HIDIOCGUSAGES:
@@ -547,15 +545,12 @@ static noinline int hiddev_ioctl_usage(struct hiddev *hiddev, unsigned int cmd,
                }
 
 goodreturn:
-               unlock_kernel();
                kfree(uref_multi);
                return 0;
 fault:
-               unlock_kernel();
                kfree(uref_multi);
                return -EFAULT;
 inval:
-               unlock_kernel();
                kfree(uref_multi);
                return -EINVAL;
        }