mirror of
https://github.com/DigitalDevices/dddvb.git
synced 2025-03-01 10:35:23 +00:00
lock reader, write and user counts with mutex
This commit is contained in:
parent
05718a5965
commit
948234d787
@ -134,25 +134,35 @@ static struct cdev dvb_device_cdev;
|
||||
int dvb_generic_open(struct inode *inode, struct file *file)
|
||||
{
|
||||
struct dvb_device *dvbdev = file->private_data;
|
||||
int ret = 0;
|
||||
|
||||
if (!dvbdev)
|
||||
return -ENODEV;
|
||||
|
||||
if (!dvbdev->users)
|
||||
return -EBUSY;
|
||||
mutex_lock(&dvbdev->lock);
|
||||
if (!dvbdev->users) {
|
||||
ret = -EBUSY;
|
||||
goto unlock;
|
||||
}
|
||||
|
||||
if ((file->f_flags & O_ACCMODE) == O_RDONLY) {
|
||||
if (!dvbdev->readers)
|
||||
return -EBUSY;
|
||||
if (!dvbdev->readers) {
|
||||
ret = -EBUSY;
|
||||
goto unlock;
|
||||
}
|
||||
dvbdev->readers--;
|
||||
} else {
|
||||
if (!dvbdev->writers)
|
||||
return -EBUSY;
|
||||
if (!dvbdev->writers) {
|
||||
ret = -EBUSY;
|
||||
goto unlock;
|
||||
}
|
||||
dvbdev->writers--;
|
||||
}
|
||||
|
||||
dvbdev->users--;
|
||||
return 0;
|
||||
unlock:
|
||||
mutex_unlock(&dvbdev->lock);
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL(dvb_generic_open);
|
||||
|
||||
@ -163,12 +173,14 @@ int dvb_generic_release(struct inode *inode, struct file *file)
|
||||
if (!dvbdev)
|
||||
return -ENODEV;
|
||||
|
||||
mutex_lock(&dvbdev->lock);
|
||||
if ((file->f_flags & O_ACCMODE) == O_RDONLY)
|
||||
dvbdev->readers++;
|
||||
else
|
||||
dvbdev->writers++;
|
||||
|
||||
dvbdev->users++;
|
||||
mutex_unlock(&dvbdev->lock);
|
||||
|
||||
dvb_device_put(dvbdev);
|
||||
|
||||
@ -524,6 +536,7 @@ int dvb_register_device(struct dvb_adapter *adap, struct dvb_device **pdvbdev,
|
||||
dvbdev->adapter = adap;
|
||||
dvbdev->priv = priv;
|
||||
dvbdev->fops = dvbdevfops;
|
||||
mutex_init(&dvbdev->lock);
|
||||
init_waitqueue_head(&dvbdev->wait_queue);
|
||||
dvbdevfops->owner = adap->module;
|
||||
list_add_tail(&dvbdev->list_head, &adap->device_list);
|
||||
|
@ -182,6 +182,7 @@ struct dvb_device {
|
||||
int readers;
|
||||
int writers;
|
||||
int users;
|
||||
struct mutex lock;
|
||||
|
||||
wait_queue_head_t wait_queue;
|
||||
/* don't really need those !? -- FIXME: use video_usercopy */
|
||||
|
Loading…
x
Reference in New Issue
Block a user