From patchwork Mon Jun 14 10:34:08 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Arnd Bergmann X-Patchwork-Id: 459806 Delivered-To: patch@linaro.org Received: by 2002:a02:735a:0:0:0:0:0 with SMTP id a26csp3162157jae; Mon, 14 Jun 2021 03:45:49 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzF0GaG91uhEbUFs7ESNNC1Ro6fzXPAJv9MmplWDGIVeD4ES4yW+VmEjLJGGNSONIItMasp X-Received: by 2002:a17:907:9047:: with SMTP id az7mr14397137ejc.4.1623667549515; Mon, 14 Jun 2021 03:45:49 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1623667549; cv=none; d=google.com; s=arc-20160816; b=wFgOrENxQbs1h2p/g8pPDhqsI/LlpDZypDPmkv73X5R5fjzHz8/wnx2g9tCe6aXToo Z/rwixNo4NTGA4LglYnK0pWyauuofkp6JBNw5XcHSR0ieMGppD710HIvTOLezx8o9Hjw oggOZOc0BtGJFT+qxSrCl9TtqQqFUYd3DqTrBpYoJhA5JDcMYbPKdUv8mBxS5pEn+msD h9dBHVoUgTnfB6Cwo2Yc3g5UDEbCVdOsXeqCSKUU0weZy2SaA4tHl87+vcFyMdT/9bg2 9HP8R8xzufSA81rpU17Qx3/Ruv4poWCZjGi8hLnQWdL0v7eiIBpAWP8kJZSyaQ7MAEoL gIRA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=OwmjgXgukGoh1fX9/5HKuNsaaNnUgqthWFLuH8Jg6zg=; b=xhTQXBeNQfKI1wR4kBG3XgwTgVTxdCp/LYRoJr8lKmP1OVteuOFcPJ5uF+PljflDJ9 fbvObHcKqp5VrAYstDhXTgZT2R+YdPY6seQ4Rl/p/tgPjH+k5C2a2s5IaruxGqmOerei TzobVOtFG0Nm+T0dnJdM0O0PtHNQaEaQV2DXSBfbG0V8DG837tds5/cxX/ghxRh9YkIp pAsRofm7Hm/6CiSYlFBTEFdnML05M4RSjJ33X8zfmwctS38g3ycId5P9JrP7Cul4aRkC F5JpbwxzH2OXQFu0j1sRcm30coPJd5ZZaI7a3QURtUaAtyjhETrur+TMERWOxbC2ecnr D/vA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=i+BljXZ3; spf=pass (google.com: domain of linux-media-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-media-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id f3si3497708ejl.241.2021.06.14.03.45.49; Mon, 14 Jun 2021 03:45:49 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-media-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=i+BljXZ3; spf=pass (google.com: domain of linux-media-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-media-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233978AbhFNKrK (ORCPT + 4 others); Mon, 14 Jun 2021 06:47:10 -0400 Received: from mail.kernel.org ([198.145.29.99]:50974 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S234387AbhFNKpG (ORCPT ); Mon, 14 Jun 2021 06:45:06 -0400 Received: by mail.kernel.org (Postfix) with ESMTPSA id 05C196143C; Mon, 14 Jun 2021 10:36:26 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1623666989; bh=tz069tuRpzth1vlbMNt9axrP0H788thSG4v+resSSzw=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=i+BljXZ3xOEA/DxFxOsF3qX2mEbQFIsv8nNoiC/ZgnNVtpd/uDJdPdsbdk8igWR99 ljhugiM5Zazx1tbkHBrD7x0D4GWn+nwjggxTL1KAQt5EVb+gxn6K/+behR+yaXNQny HRCMiNHeLLxPkh2fqV9jculqsYFH6n+pB1HmKevLha3s6dQAmBp2iuAhZgS0SsXVaI 1tu3cLk+vn/vLK7xUIZrbm7OdWy0LDCx/XgEHBUbEpAJ7GTiHJVKLlmQZsw7jKaW57 DouIPW+IJf1RuBaBOh4rhnIPZ2vceYsXVoCKT8tUF2VhyVmRmfIJrOAkYmBd4giP7I gwO47eocu+Ftw== From: Arnd Bergmann To: Hans Verkuil , Mauro Carvalho Chehab Cc: Arnd Bergmann , "Lad, Prabhakar" , Eduardo Valentin , Sakari Ailus , Greg Kroah-Hartman , Vaibhav Gupta , Liu Shixin , Laurent Pinchart , Jacopo Mondi , Andy Shevchenko , linux-kernel@vger.kernel.org, linux-media@vger.kernel.org, linux-staging@lists.linux.dev Subject: [PATCH v3 7/8] media: subdev: fix compat_ioctl32 Date: Mon, 14 Jun 2021 12:34:08 +0200 Message-Id: <20210614103409.3154127-8-arnd@kernel.org> X-Mailer: git-send-email 2.29.2 In-Reply-To: <20210614103409.3154127-1-arnd@kernel.org> References: <20210614103409.3154127-1-arnd@kernel.org> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-media@vger.kernel.org From: Arnd Bergmann The adv7842 and si4713 drivers each define one private ioctl command that are handled through the subdev_ioctl() helpers, but that don't work in compat mode because this does not handle private ioctl commands. The compat_ioctl32 callback for subdevs has outdated calling conventions, but as there are no users of that, it is easy to change the function pointer type and the caller to make it behave the same way as the normal ioctl callback and hook in the two drivers that need no argument conversion. Signed-off-by: Arnd Bergmann --- drivers/media/i2c/adv7842.c | 3 +++ drivers/media/radio/si4713/si4713.c | 3 +++ drivers/media/v4l2-core/v4l2-subdev.c | 19 ++++++++++++++++--- include/media/v4l2-subdev.h | 3 +-- 4 files changed, 23 insertions(+), 5 deletions(-) -- 2.29.2 diff --git a/drivers/media/i2c/adv7842.c b/drivers/media/i2c/adv7842.c index 78e61fe6f2f0..cd6df4f52f33 100644 --- a/drivers/media/i2c/adv7842.c +++ b/drivers/media/i2c/adv7842.c @@ -3293,6 +3293,9 @@ static const struct v4l2_ctrl_ops adv7842_ctrl_ops = { static const struct v4l2_subdev_core_ops adv7842_core_ops = { .log_status = adv7842_log_status, .ioctl = adv7842_ioctl, +#ifdef CONFIG_COMPAT + .compat_ioctl32 = adv7842_ioctl, +#endif .interrupt_service_routine = adv7842_isr, .subscribe_event = adv7842_subscribe_event, .unsubscribe_event = v4l2_event_subdev_unsubscribe, diff --git a/drivers/media/radio/si4713/si4713.c b/drivers/media/radio/si4713/si4713.c index adbf43ff6a21..ae7e477774e3 100644 --- a/drivers/media/radio/si4713/si4713.c +++ b/drivers/media/radio/si4713/si4713.c @@ -1398,6 +1398,9 @@ static const struct v4l2_ctrl_ops si4713_ctrl_ops = { static const struct v4l2_subdev_core_ops si4713_subdev_core_ops = { .ioctl = si4713_ioctl, +#ifdef CONFIG_COMPAT + .compat_ioctl32 = si4713_ioctl, +#endif }; static const struct v4l2_subdev_tuner_ops si4713_subdev_tuner_ops = { diff --git a/drivers/media/v4l2-core/v4l2-subdev.c b/drivers/media/v4l2-core/v4l2-subdev.c index bf3aa9252458..fbd176d6c415 100644 --- a/drivers/media/v4l2-core/v4l2-subdev.c +++ b/drivers/media/v4l2-core/v4l2-subdev.c @@ -686,13 +686,26 @@ static long subdev_ioctl(struct file *file, unsigned int cmd, } #ifdef CONFIG_COMPAT -static long subdev_compat_ioctl32(struct file *file, unsigned int cmd, - unsigned long arg) +static long subdev_do_compat_ioctl32(struct file *file, unsigned int cmd, void *arg) { struct video_device *vdev = video_devdata(file); struct v4l2_subdev *sd = vdev_to_v4l2_subdev(vdev); + struct mutex *lock = vdev->lock; + long ret = -ENODEV; - return v4l2_subdev_call(sd, core, compat_ioctl32, cmd, arg); + if (lock && mutex_lock_interruptible(lock)) + return -ERESTARTSYS; + if (video_is_registered(vdev)) + ret = v4l2_subdev_call(sd, core, compat_ioctl32, cmd, arg); + if (lock) + mutex_unlock(lock); + return ret; +} + +static long subdev_compat_ioctl32(struct file *file, unsigned int cmd, + unsigned long arg) +{ + return video_usercopy(file, cmd, arg, subdev_do_compat_ioctl32); } #endif diff --git a/include/media/v4l2-subdev.h b/include/media/v4l2-subdev.h index d0e9a5bdb08b..42aa1f6c7c3f 100644 --- a/include/media/v4l2-subdev.h +++ b/include/media/v4l2-subdev.h @@ -195,8 +195,7 @@ struct v4l2_subdev_core_ops { int (*s_gpio)(struct v4l2_subdev *sd, u32 val); long (*ioctl)(struct v4l2_subdev *sd, unsigned int cmd, void *arg); #ifdef CONFIG_COMPAT - long (*compat_ioctl32)(struct v4l2_subdev *sd, unsigned int cmd, - unsigned long arg); + long (*compat_ioctl32)(struct v4l2_subdev *sd, unsigned int cmd, void *arg); #endif #ifdef CONFIG_VIDEO_ADV_DEBUG int (*g_register)(struct v4l2_subdev *sd, struct v4l2_dbg_register *reg);