| From a44323e2a8f342848bb77e8e04fcd85fcb91b3b4 Mon Sep 17 00:00:00 2001 |
| From: Andy Lutomirski <luto@kernel.org> |
| Date: Tue, 24 May 2016 15:13:02 -0700 |
| Subject: uvc: Forward compat ioctls to their handlers directly |
| |
| From: Andy Lutomirski <luto@kernel.org> |
| |
| commit a44323e2a8f342848bb77e8e04fcd85fcb91b3b4 upstream. |
| |
| The current code goes through a lot of indirection just to call a |
| known handler. Simplify it: just call the handlers directly. |
| |
| Signed-off-by: Andy Lutomirski <luto@kernel.org> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| drivers/media/usb/uvc/uvc_v4l2.c | 39 ++++++++++++++++++--------------------- |
| 1 file changed, 18 insertions(+), 21 deletions(-) |
| |
| --- a/drivers/media/usb/uvc/uvc_v4l2.c |
| +++ b/drivers/media/usb/uvc/uvc_v4l2.c |
| @@ -1388,47 +1388,44 @@ static int uvc_v4l2_put_xu_query(const s |
| static long uvc_v4l2_compat_ioctl32(struct file *file, |
| unsigned int cmd, unsigned long arg) |
| { |
| + struct uvc_fh *handle = file->private_data; |
| union { |
| struct uvc_xu_control_mapping xmap; |
| struct uvc_xu_control_query xqry; |
| } karg; |
| void __user *up = compat_ptr(arg); |
| - mm_segment_t old_fs; |
| long ret; |
| |
| switch (cmd) { |
| case UVCIOC_CTRL_MAP32: |
| - cmd = UVCIOC_CTRL_MAP; |
| ret = uvc_v4l2_get_xu_mapping(&karg.xmap, up); |
| + if (ret) |
| + return ret; |
| + ret = uvc_ioctl_ctrl_map(handle->chain, &karg.xmap); |
| + if (ret) |
| + return ret; |
| + ret = uvc_v4l2_put_xu_mapping(&karg.xmap, up); |
| + if (ret) |
| + return ret; |
| + |
| break; |
| |
| case UVCIOC_CTRL_QUERY32: |
| - cmd = UVCIOC_CTRL_QUERY; |
| ret = uvc_v4l2_get_xu_query(&karg.xqry, up); |
| + if (ret) |
| + return ret; |
| + ret = uvc_xu_ctrl_query(handle->chain, &karg.xqry); |
| + if (ret) |
| + return ret; |
| + ret = uvc_v4l2_put_xu_query(&karg.xqry, up); |
| + if (ret) |
| + return ret; |
| break; |
| |
| default: |
| return -ENOIOCTLCMD; |
| } |
| |
| - old_fs = get_fs(); |
| - set_fs(KERNEL_DS); |
| - ret = video_ioctl2(file, cmd, (unsigned long)&karg); |
| - set_fs(old_fs); |
| - |
| - if (ret < 0) |
| - return ret; |
| - |
| - switch (cmd) { |
| - case UVCIOC_CTRL_MAP: |
| - ret = uvc_v4l2_put_xu_mapping(&karg.xmap, up); |
| - break; |
| - |
| - case UVCIOC_CTRL_QUERY: |
| - ret = uvc_v4l2_put_xu_query(&karg.xqry, up); |
| - break; |
| - } |
| - |
| return ret; |
| } |
| #endif |