diff options
author | Andy Lutomirski <luto@kernel.org> | 2016-05-24 18:13:02 -0400 |
---|---|---|
committer | Andy Lutomirski <luto@kernel.org> | 2016-06-10 18:11:14 -0400 |
commit | a44323e2a8f342848bb77e8e04fcd85fcb91b3b4 (patch) | |
tree | a33e238e6b93d6117d3751adb5f11a4c598b91ec | |
parent | af8c34ce6ae32addda3788d54a7e340cad22516b (diff) |
uvc: Forward compat ioctls to their handlers directly
The current code goes through a lot of indirection just to call a
known handler. Simplify it: just call the handlers directly.
Cc: stable@vger.kernel.org
Signed-off-by: Andy Lutomirski <luto@kernel.org>
-rw-r--r-- | drivers/media/usb/uvc/uvc_v4l2.c | 39 |
1 files changed, 18 insertions, 21 deletions
diff --git a/drivers/media/usb/uvc/uvc_v4l2.c b/drivers/media/usb/uvc/uvc_v4l2.c index d7723ce772b3..12690c1ea8f8 100644 --- a/drivers/media/usb/uvc/uvc_v4l2.c +++ b/drivers/media/usb/uvc/uvc_v4l2.c | |||
@@ -1408,47 +1408,44 @@ static int uvc_v4l2_put_xu_query(const struct uvc_xu_control_query *kp, | |||
1408 | static long uvc_v4l2_compat_ioctl32(struct file *file, | 1408 | static long uvc_v4l2_compat_ioctl32(struct file *file, |
1409 | unsigned int cmd, unsigned long arg) | 1409 | unsigned int cmd, unsigned long arg) |
1410 | { | 1410 | { |
1411 | struct uvc_fh *handle = file->private_data; | ||
1411 | union { | 1412 | union { |
1412 | struct uvc_xu_control_mapping xmap; | 1413 | struct uvc_xu_control_mapping xmap; |
1413 | struct uvc_xu_control_query xqry; | 1414 | struct uvc_xu_control_query xqry; |
1414 | } karg; | 1415 | } karg; |
1415 | void __user *up = compat_ptr(arg); | 1416 | void __user *up = compat_ptr(arg); |
1416 | mm_segment_t old_fs; | ||
1417 | long ret; | 1417 | long ret; |
1418 | 1418 | ||
1419 | switch (cmd) { | 1419 | switch (cmd) { |
1420 | case UVCIOC_CTRL_MAP32: | 1420 | case UVCIOC_CTRL_MAP32: |
1421 | cmd = UVCIOC_CTRL_MAP; | ||
1422 | ret = uvc_v4l2_get_xu_mapping(&karg.xmap, up); | 1421 | ret = uvc_v4l2_get_xu_mapping(&karg.xmap, up); |
1422 | if (ret) | ||
1423 | return ret; | ||
1424 | ret = uvc_ioctl_ctrl_map(handle->chain, &karg.xmap); | ||
1425 | if (ret) | ||
1426 | return ret; | ||
1427 | ret = uvc_v4l2_put_xu_mapping(&karg.xmap, up); | ||
1428 | if (ret) | ||
1429 | return ret; | ||
1430 | |||
1423 | break; | 1431 | break; |
1424 | 1432 | ||
1425 | case UVCIOC_CTRL_QUERY32: | 1433 | case UVCIOC_CTRL_QUERY32: |
1426 | cmd = UVCIOC_CTRL_QUERY; | ||
1427 | ret = uvc_v4l2_get_xu_query(&karg.xqry, up); | 1434 | ret = uvc_v4l2_get_xu_query(&karg.xqry, up); |
1435 | if (ret) | ||
1436 | return ret; | ||
1437 | ret = uvc_xu_ctrl_query(handle->chain, &karg.xqry); | ||
1438 | if (ret) | ||
1439 | return ret; | ||
1440 | ret = uvc_v4l2_put_xu_query(&karg.xqry, up); | ||
1441 | if (ret) | ||
1442 | return ret; | ||
1428 | break; | 1443 | break; |
1429 | 1444 | ||
1430 | default: | 1445 | default: |
1431 | return -ENOIOCTLCMD; | 1446 | return -ENOIOCTLCMD; |
1432 | } | 1447 | } |
1433 | 1448 | ||
1434 | old_fs = get_fs(); | ||
1435 | set_fs(KERNEL_DS); | ||
1436 | ret = video_ioctl2(file, cmd, (unsigned long)&karg); | ||
1437 | set_fs(old_fs); | ||
1438 | |||
1439 | if (ret < 0) | ||
1440 | return ret; | ||
1441 | |||
1442 | switch (cmd) { | ||
1443 | case UVCIOC_CTRL_MAP: | ||
1444 | ret = uvc_v4l2_put_xu_mapping(&karg.xmap, up); | ||
1445 | break; | ||
1446 | |||
1447 | case UVCIOC_CTRL_QUERY: | ||
1448 | ret = uvc_v4l2_put_xu_query(&karg.xqry, up); | ||
1449 | break; | ||
1450 | } | ||
1451 | |||
1452 | return ret; | 1449 | return ret; |
1453 | } | 1450 | } |
1454 | #endif | 1451 | #endif |