[media] cadet: use unlocked_ioctl
Converted from ioctl to unlocked_ioctl. This driver already used an internal lock, but it was missing in cadet_open and cadet_release and it was not used correctly in cadet_read. Signed-off-by: Hans Verkuil <hverkuil@xs4all.nl> Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
This commit is contained in:
parent
32958fdd16
commit
1cccee0b84
1 changed files with 9 additions and 3 deletions
|
@ -328,11 +328,10 @@ static ssize_t cadet_read(struct file *file, char __user *data, size_t count, lo
|
||||||
unsigned char readbuf[RDS_BUFFER];
|
unsigned char readbuf[RDS_BUFFER];
|
||||||
int i = 0;
|
int i = 0;
|
||||||
|
|
||||||
|
mutex_lock(&dev->lock);
|
||||||
if (dev->rdsstat == 0) {
|
if (dev->rdsstat == 0) {
|
||||||
mutex_lock(&dev->lock);
|
|
||||||
dev->rdsstat = 1;
|
dev->rdsstat = 1;
|
||||||
outb(0x80, dev->io); /* Select RDS fifo */
|
outb(0x80, dev->io); /* Select RDS fifo */
|
||||||
mutex_unlock(&dev->lock);
|
|
||||||
init_timer(&dev->readtimer);
|
init_timer(&dev->readtimer);
|
||||||
dev->readtimer.function = cadet_handler;
|
dev->readtimer.function = cadet_handler;
|
||||||
dev->readtimer.data = (unsigned long)dev;
|
dev->readtimer.data = (unsigned long)dev;
|
||||||
|
@ -340,12 +339,15 @@ static ssize_t cadet_read(struct file *file, char __user *data, size_t count, lo
|
||||||
add_timer(&dev->readtimer);
|
add_timer(&dev->readtimer);
|
||||||
}
|
}
|
||||||
if (dev->rdsin == dev->rdsout) {
|
if (dev->rdsin == dev->rdsout) {
|
||||||
|
mutex_unlock(&dev->lock);
|
||||||
if (file->f_flags & O_NONBLOCK)
|
if (file->f_flags & O_NONBLOCK)
|
||||||
return -EWOULDBLOCK;
|
return -EWOULDBLOCK;
|
||||||
interruptible_sleep_on(&dev->read_queue);
|
interruptible_sleep_on(&dev->read_queue);
|
||||||
|
mutex_lock(&dev->lock);
|
||||||
}
|
}
|
||||||
while (i < count && dev->rdsin != dev->rdsout)
|
while (i < count && dev->rdsin != dev->rdsout)
|
||||||
readbuf[i++] = dev->rdsbuf[dev->rdsout++];
|
readbuf[i++] = dev->rdsbuf[dev->rdsout++];
|
||||||
|
mutex_unlock(&dev->lock);
|
||||||
|
|
||||||
if (copy_to_user(data, readbuf, i))
|
if (copy_to_user(data, readbuf, i))
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
|
@ -525,9 +527,11 @@ static int cadet_open(struct file *file)
|
||||||
{
|
{
|
||||||
struct cadet *dev = video_drvdata(file);
|
struct cadet *dev = video_drvdata(file);
|
||||||
|
|
||||||
|
mutex_lock(&dev->lock);
|
||||||
dev->users++;
|
dev->users++;
|
||||||
if (1 == dev->users)
|
if (1 == dev->users)
|
||||||
init_waitqueue_head(&dev->read_queue);
|
init_waitqueue_head(&dev->read_queue);
|
||||||
|
mutex_unlock(&dev->lock);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -535,11 +539,13 @@ static int cadet_release(struct file *file)
|
||||||
{
|
{
|
||||||
struct cadet *dev = video_drvdata(file);
|
struct cadet *dev = video_drvdata(file);
|
||||||
|
|
||||||
|
mutex_lock(&dev->lock);
|
||||||
dev->users--;
|
dev->users--;
|
||||||
if (0 == dev->users) {
|
if (0 == dev->users) {
|
||||||
del_timer_sync(&dev->readtimer);
|
del_timer_sync(&dev->readtimer);
|
||||||
dev->rdsstat = 0;
|
dev->rdsstat = 0;
|
||||||
}
|
}
|
||||||
|
mutex_unlock(&dev->lock);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -559,7 +565,7 @@ static const struct v4l2_file_operations cadet_fops = {
|
||||||
.open = cadet_open,
|
.open = cadet_open,
|
||||||
.release = cadet_release,
|
.release = cadet_release,
|
||||||
.read = cadet_read,
|
.read = cadet_read,
|
||||||
.ioctl = video_ioctl2,
|
.unlocked_ioctl = video_ioctl2,
|
||||||
.poll = cadet_poll,
|
.poll = cadet_poll,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue