lock reader, write and user counts with mutex

This commit is contained in:
internal 2023-11-03 11:21:28 +01:00
parent 05718a5965
commit 948234d787
2 changed files with 21 additions and 7 deletions

View File

@ -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);

View File

@ -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 */