diff options
Diffstat (limited to 'drivers/media/v4l2-core/v4l2-subdev.c')
| -rw-r--r-- | drivers/media/v4l2-core/v4l2-subdev.c | 17 | 
1 files changed, 16 insertions, 1 deletions
diff --git a/drivers/media/v4l2-core/v4l2-subdev.c b/drivers/media/v4l2-core/v4l2-subdev.c index f9eed938d348..6a7f7f75dfd7 100644 --- a/drivers/media/v4l2-core/v4l2-subdev.c +++ b/drivers/media/v4l2-core/v4l2-subdev.c @@ -502,10 +502,25 @@ static long subdev_do_ioctl(struct file *file, unsigned int cmd, void *arg)  	return 0;  } +static long subdev_do_ioctl_lock(struct file *file, unsigned int cmd, void *arg) +{ +	struct video_device *vdev = video_devdata(file); +	struct mutex *lock = vdev->lock; +	long ret = -ENODEV; + +	if (lock && mutex_lock_interruptible(lock)) +		return -ERESTARTSYS; +	if (video_is_registered(vdev)) +		ret = subdev_do_ioctl(file, cmd, arg); +	if (lock) +		mutex_unlock(lock); +	return ret; +} +  static long subdev_ioctl(struct file *file, unsigned int cmd,  	unsigned long arg)  { -	return video_usercopy(file, cmd, arg, subdev_do_ioctl); +	return video_usercopy(file, cmd, arg, subdev_do_ioctl_lock);  }  #ifdef CONFIG_COMPAT  |