lkml.org 
[lkml]   [2010]   [Oct]   [15]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
Patch in this message
/
From
SubjectRe: mmotm 2010-10-13 - GSPCA SPCA561 webcam driver broken
Date
On Thursday, October 14, 2010 22:06:29 Valdis.Kletnieks@vt.edu wrote:
> On Wed, 13 Oct 2010 17:13:25 PDT, akpm@linux-foundation.org said:
> > The mm-of-the-moment snapshot 2010-10-13-17-13 has been uploaded to
> >
> > http://userweb.kernel.org/~akpm/mmotm/
>
> This broke my webcam. I bisected it down to this commit, and things
> work again after reverting the 2 code lines of change.
>
> commit 9e4d79a98ebd857ec729f5fa8f432f35def4d0da
> Author: Hans Verkuil <hverkuil@xs4all.nl>
> Date: Sun Sep 26 08:16:56 2010 -0300
>
> V4L/DVB: v4l2-dev: after a disconnect any ioctl call will be blocked
>
> Until now all fops except release and (unlocked_)ioctl returned an error
> after the device node was unregistered. Extend this as well to the ioctl
> fops. There is nothing useful that an application can do here and it
> complicates the driver code unnecessarily.
>
> Signed-off-by: Hans Verkuil <hverkuil@xs4all.nl>
> Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
>
>
> diff --git a/drivers/media/video/v4l2-dev.c b/drivers/media/video/v4l2-dev.c
> index d4a3532..f069c61 100644
> --- a/drivers/media/video/v4l2-dev.c
> +++ b/drivers/media/video/v4l2-dev.c
> @@ -221,8 +221,8 @@ static long v4l2_ioctl(struct file *filp, unsigned int cmd,
> struct video_device *vdev = video_devdata(filp);
> int ret;
>
> - /* Allow ioctl to continue even if the device was unregistered.
> - Things like dequeueing buffers might still be useful. */
> + if (!vdev->fops->ioctl)
> + return -ENOTTY;
> if (vdev->fops->unlocked_ioctl) {
> ret = vdev->fops->unlocked_ioctl(filp, cmd, arg);
> } else if (vdev->fops->ioctl) {
>
> I suspect this doesn't do what's intended if a driver is using ->unlocked_ioctl
> rather than ->ioctl, and it should be reverted - it only saves at most one
> if statement.
>
>

I'm not sure what is going on here. It looks like this patch is mangled in your
tree since the same patch in the v4l-dvb repository looks like this:

diff --git a/drivers/media/video/v4l2-dev.c b/drivers/media/video/v4l2-dev.c
index 32575a6..26d39c4 100644
--- a/drivers/media/video/v4l2-dev.c
+++ b/drivers/media/video/v4l2-dev.c
@@ -222,8 +222,8 @@ static int v4l2_ioctl(struct inode *inode, struct file *filp,

if (!vdev->fops->ioctl)
return -ENOTTY;
- /* Allow ioctl to continue even if the device was unregistered.
- Things like dequeueing buffers might still be useful. */
+ if (!video_is_registered(vdev))
+ return -ENODEV;
return vdev->fops->ioctl(filp, cmd, arg);
}

@@ -234,8 +234,8 @@ static long v4l2_unlocked_ioctl(struct file *filp,

if (!vdev->fops->unlocked_ioctl)
return -ENOTTY;
- /* Allow ioctl to continue even if the device was unregistered.
- Things like dequeueing buffers might still be useful. */
+ if (!video_is_registered(vdev))
+ return -ENODEV;
return vdev->fops->unlocked_ioctl(filp, cmd, arg);
}

In your diff there is a mismatch between ioctl and unlocked_ioctl which no doubt
is causing all the problems for you.
Regards,

Hans

--
Hans Verkuil - video4linux developer - sponsored by TANDBERG, part of Cisco


\
 
 \ /
  Last update: 2010-10-15 10:49    [W:0.165 / U:0.472 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site