On 18/03/2021 08:17, Ricardo Ribalda wrote: > Hi Hans > > Can I merge 1-3, but leave 4 as a separate one? It helps to tell a > story for 5 and 6. I really prefer it as a single patch. All four patches are basically a single big fix for v4l2-ioctl.c where the code for drivers that do not use the control framework had become very outdated. Fixing it in a single patch helps backporting to stable, and it is easier to review and see everything that had to be done to fix this. In this case I wondered when I was reviewing patch 1 why V4L2_CTRL_WHICH_DEF_VAL was just accepted without checking for S/TRY_EXT_CTRLS. Basically patch 1 is a broken fix w.r.t. DEF_VAL until patch 4, which really fixes it. Just do it all in a single patch, splitting it up doesn't work in this particular case. Regards, Hans > > Thanks > > On Thu, Mar 18, 2021 at 8:14 AM Hans Verkuil <hverkuil-cisco@xxxxxxxxx> wrote: >> >> Hi Ricardo, >> >> On 17/03/2021 17:44, Ricardo Ribalda wrote: >>> Drivers that do not use the ctrl-framework use this function instead. >>> >>> - Do not check for multiple classes when getting the DEF_VAL. >>> >>> Fixes v4l2-compliance: >>> Control ioctls (Input 0): >>> fail: v4l2-test-controls.cpp(813): doioctl(node, VIDIOC_G_EXT_CTRLS, &ctrls) >>> test VIDIOC_G/S/TRY_EXT_CTRLS: FAIL >> >> Can you merge patches 1-4 into a single patch? It's really one big fix since >> this code was never updated when new 'which' values were added. So keeping it >> together is, for once, actually preferred. >> >> You can add my: >> >> Reviewed-by: Hans Verkuil <hverkuil-cisco@xxxxxxxxx> >> >> after these 4 patches are merged. It looks much nicer now. >> >> Regards, >> >> Hans >> >>> >>> Cc: stable@xxxxxxxxxxxxxxx >>> Fixes: 6fa6f831f095 ("media: v4l2-ctrls: add core request support") >>> Suggested-by: Hans Verkuil <hverkuil-cisco@xxxxxxxxx> >>> Signed-off-by: Ricardo Ribalda <ribalda@xxxxxxxxxxxx> >>> Reviewed-by: Laurent Pinchart <laurent.pinchart@xxxxxxxxxxxxxxxx> >>> --- >>> drivers/media/v4l2-core/v4l2-ioctl.c | 47 ++++++++++++++++------------ >>> 1 file changed, 27 insertions(+), 20 deletions(-) >>> >>> diff --git a/drivers/media/v4l2-core/v4l2-ioctl.c b/drivers/media/v4l2-core/v4l2-ioctl.c >>> index 31d1342e61e8..403f957a1012 100644 >>> --- a/drivers/media/v4l2-core/v4l2-ioctl.c >>> +++ b/drivers/media/v4l2-core/v4l2-ioctl.c >>> @@ -908,7 +908,7 @@ static void v4l_print_default(const void *arg, bool write_only) >>> pr_cont("driver-specific ioctl\n"); >>> } >>> >>> -static int check_ext_ctrls(struct v4l2_ext_controls *c, int allow_priv) >>> +static bool check_ext_ctrls(struct v4l2_ext_controls *c, unsigned long ioctl) >>> { >>> __u32 i; >>> >>> @@ -917,23 +917,30 @@ static int check_ext_ctrls(struct v4l2_ext_controls *c, int allow_priv) >>> for (i = 0; i < c->count; i++) >>> c->controls[i].reserved2[0] = 0; >>> >>> - /* V4L2_CID_PRIVATE_BASE cannot be used as control class >>> - when using extended controls. >>> - Only when passed in through VIDIOC_G_CTRL and VIDIOC_S_CTRL >>> - is it allowed for backwards compatibility. >>> - */ >>> - if (!allow_priv && c->which == V4L2_CID_PRIVATE_BASE) >>> - return 0; >>> - if (!c->which) >>> - return 1; >>> + switch (c->which) { >>> + case V4L2_CID_PRIVATE_BASE: >>> + /* >>> + * V4L2_CID_PRIVATE_BASE cannot be used as control class >>> + * when using extended controls. >>> + * Only when passed in through VIDIOC_G_CTRL and VIDIOC_S_CTRL >>> + * is it allowed for backwards compatibility. >>> + */ >>> + if (ioctl == VIDIOC_G_CTRL || ioctl == VIDIOC_S_CROP) >>> + return false; >>> + break; >>> + case V4L2_CTRL_WHICH_DEF_VAL: >>> + case V4L2_CTRL_WHICH_CUR_VAL: >>> + return true; >>> + } >>> + >>> /* Check that all controls are from the same control class. */ >>> for (i = 0; i < c->count; i++) { >>> if (V4L2_CTRL_ID2WHICH(c->controls[i].id) != c->which) { >>> c->error_idx = i; >>> - return 0; >>> + return false; >>> } >>> } >>> - return 1; >>> + return true; >>> } >>> >>> static int check_fmt(struct file *file, enum v4l2_buf_type type) >>> @@ -2229,7 +2236,7 @@ static int v4l_g_ctrl(const struct v4l2_ioctl_ops *ops, >>> ctrls.controls = &ctrl; >>> ctrl.id = p->id; >>> ctrl.value = p->value; >>> - if (check_ext_ctrls(&ctrls, 1)) { >>> + if (check_ext_ctrls(&ctrls, VIDIOC_G_CTRL)) { >>> int ret = ops->vidioc_g_ext_ctrls(file, fh, &ctrls); >>> >>> if (ret == 0) >>> @@ -2263,7 +2270,7 @@ static int v4l_s_ctrl(const struct v4l2_ioctl_ops *ops, >>> ctrls.controls = &ctrl; >>> ctrl.id = p->id; >>> ctrl.value = p->value; >>> - if (check_ext_ctrls(&ctrls, 1)) >>> + if (check_ext_ctrls(&ctrls, VIDIOC_S_CTRL)) >>> return ops->vidioc_s_ext_ctrls(file, fh, &ctrls); >>> return -EINVAL; >>> } >>> @@ -2285,8 +2292,8 @@ static int v4l_g_ext_ctrls(const struct v4l2_ioctl_ops *ops, >>> vfd, vfd->v4l2_dev->mdev, p); >>> if (ops->vidioc_g_ext_ctrls == NULL) >>> return -ENOTTY; >>> - return check_ext_ctrls(p, 0) ? ops->vidioc_g_ext_ctrls(file, fh, p) : >>> - -EINVAL; >>> + return check_ext_ctrls(p, VIDIOC_G_EXT_CTRLS) ? >>> + ops->vidioc_g_ext_ctrls(file, fh, p) : -EINVAL; >>> } >>> >>> static int v4l_s_ext_ctrls(const struct v4l2_ioctl_ops *ops, >>> @@ -2306,8 +2313,8 @@ static int v4l_s_ext_ctrls(const struct v4l2_ioctl_ops *ops, >>> vfd, vfd->v4l2_dev->mdev, p); >>> if (ops->vidioc_s_ext_ctrls == NULL) >>> return -ENOTTY; >>> - return check_ext_ctrls(p, 0) ? ops->vidioc_s_ext_ctrls(file, fh, p) : >>> - -EINVAL; >>> + return check_ext_ctrls(p, VIDIOC_S_EXT_CTRLS) ? >>> + ops->vidioc_s_ext_ctrls(file, fh, p) : -EINVAL; >>> } >>> >>> static int v4l_try_ext_ctrls(const struct v4l2_ioctl_ops *ops, >>> @@ -2327,8 +2334,8 @@ static int v4l_try_ext_ctrls(const struct v4l2_ioctl_ops *ops, >>> vfd, vfd->v4l2_dev->mdev, p); >>> if (ops->vidioc_try_ext_ctrls == NULL) >>> return -ENOTTY; >>> - return check_ext_ctrls(p, 0) ? ops->vidioc_try_ext_ctrls(file, fh, p) : >>> - -EINVAL; >>> + return check_ext_ctrls(p, VIDIOC_TRY_EXT_CTRLS) ? >>> + ops->vidioc_try_ext_ctrls(file, fh, p) : -EINVAL; >>> } >>> >>> /* >>> >> > >