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)
|
int dvb_generic_open(struct inode *inode, struct file *file)
|
||||||
{
|
{
|
||||||
struct dvb_device *dvbdev = file->private_data;
|
struct dvb_device *dvbdev = file->private_data;
|
||||||
|
int ret = 0;
|
||||||
|
|
||||||
if (!dvbdev)
|
if (!dvbdev)
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
|
|
||||||
if (!dvbdev->users)
|
mutex_lock(&dvbdev->lock);
|
||||||
return -EBUSY;
|
if (!dvbdev->users) {
|
||||||
|
ret = -EBUSY;
|
||||||
|
goto unlock;
|
||||||
|
}
|
||||||
|
|
||||||
if ((file->f_flags & O_ACCMODE) == O_RDONLY) {
|
if ((file->f_flags & O_ACCMODE) == O_RDONLY) {
|
||||||
if (!dvbdev->readers)
|
if (!dvbdev->readers) {
|
||||||
return -EBUSY;
|
ret = -EBUSY;
|
||||||
|
goto unlock;
|
||||||
|
}
|
||||||
dvbdev->readers--;
|
dvbdev->readers--;
|
||||||
} else {
|
} else {
|
||||||
if (!dvbdev->writers)
|
if (!dvbdev->writers) {
|
||||||
return -EBUSY;
|
ret = -EBUSY;
|
||||||
|
goto unlock;
|
||||||
|
}
|
||||||
dvbdev->writers--;
|
dvbdev->writers--;
|
||||||
}
|
}
|
||||||
|
|
||||||
dvbdev->users--;
|
dvbdev->users--;
|
||||||
return 0;
|
unlock:
|
||||||
|
mutex_unlock(&dvbdev->lock);
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(dvb_generic_open);
|
EXPORT_SYMBOL(dvb_generic_open);
|
||||||
|
|
||||||
@ -163,12 +173,14 @@ int dvb_generic_release(struct inode *inode, struct file *file)
|
|||||||
if (!dvbdev)
|
if (!dvbdev)
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
|
|
||||||
|
mutex_lock(&dvbdev->lock);
|
||||||
if ((file->f_flags & O_ACCMODE) == O_RDONLY)
|
if ((file->f_flags & O_ACCMODE) == O_RDONLY)
|
||||||
dvbdev->readers++;
|
dvbdev->readers++;
|
||||||
else
|
else
|
||||||
dvbdev->writers++;
|
dvbdev->writers++;
|
||||||
|
|
||||||
dvbdev->users++;
|
dvbdev->users++;
|
||||||
|
mutex_unlock(&dvbdev->lock);
|
||||||
|
|
||||||
dvb_device_put(dvbdev);
|
dvb_device_put(dvbdev);
|
||||||
|
|
||||||
@ -524,6 +536,7 @@ int dvb_register_device(struct dvb_adapter *adap, struct dvb_device **pdvbdev,
|
|||||||
dvbdev->adapter = adap;
|
dvbdev->adapter = adap;
|
||||||
dvbdev->priv = priv;
|
dvbdev->priv = priv;
|
||||||
dvbdev->fops = dvbdevfops;
|
dvbdev->fops = dvbdevfops;
|
||||||
|
mutex_init(&dvbdev->lock);
|
||||||
init_waitqueue_head(&dvbdev->wait_queue);
|
init_waitqueue_head(&dvbdev->wait_queue);
|
||||||
dvbdevfops->owner = adap->module;
|
dvbdevfops->owner = adap->module;
|
||||||
list_add_tail(&dvbdev->list_head, &adap->device_list);
|
list_add_tail(&dvbdev->list_head, &adap->device_list);
|
||||||
|
@ -182,6 +182,7 @@ struct dvb_device {
|
|||||||
int readers;
|
int readers;
|
||||||
int writers;
|
int writers;
|
||||||
int users;
|
int users;
|
||||||
|
struct mutex lock;
|
||||||
|
|
||||||
wait_queue_head_t wait_queue;
|
wait_queue_head_t wait_queue;
|
||||||
/* don't really need those !? -- FIXME: use video_usercopy */
|
/* don't really need those !? -- FIXME: use video_usercopy */
|
||||||
|
Loading…
x
Reference in New Issue
Block a user