aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndy Lutomirski <luto@kernel.org>2016-05-24 18:13:02 -0400
committerAndy Lutomirski <luto@kernel.org>2016-06-10 18:11:14 -0400
commita44323e2a8f342848bb77e8e04fcd85fcb91b3b4 (patch)
treea33e238e6b93d6117d3751adb5f11a4c598b91ec
parentaf8c34ce6ae32addda3788d54a7e340cad22516b (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.c39
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,
1408static long uvc_v4l2_compat_ioctl32(struct file *file, 1408static 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