提交 6de7d14d 编写于 作者: H Hans Verkuil 提交者: Mauro Carvalho Chehab

[media] saa7146: remove V4L2_FL_LOCK_ALL_FOPS

Add proper locking to the file operations, allowing for the removal
of the V4L2_FL_LOCK_ALL_FOPS flag.

I also removed some dead code in the form of the saa7146_devices list and
saa7146_devices_lock mutex: these were used once but that was a long time
ago.
Signed-off-by: NHans Verkuil <hans.verkuil@cisco.com>
Signed-off-by: NMauro Carvalho Chehab <mchehab@redhat.com>
上级 85397ef6
...@@ -23,9 +23,6 @@ ...@@ -23,9 +23,6 @@
#include <media/saa7146.h> #include <media/saa7146.h>
#include <linux/module.h> #include <linux/module.h>
LIST_HEAD(saa7146_devices);
DEFINE_MUTEX(saa7146_devices_lock);
static int saa7146_num; static int saa7146_num;
unsigned int saa7146_debug; unsigned int saa7146_debug;
...@@ -482,8 +479,6 @@ static int saa7146_init_one(struct pci_dev *pci, const struct pci_device_id *ent ...@@ -482,8 +479,6 @@ static int saa7146_init_one(struct pci_dev *pci, const struct pci_device_id *ent
set it explicitly. */ set it explicitly. */
pci_set_drvdata(pci, &dev->v4l2_dev); pci_set_drvdata(pci, &dev->v4l2_dev);
INIT_LIST_HEAD(&dev->item);
list_add_tail(&dev->item,&saa7146_devices);
saa7146_num++; saa7146_num++;
err = 0; err = 0;
...@@ -545,7 +540,6 @@ static void saa7146_remove_one(struct pci_dev *pdev) ...@@ -545,7 +540,6 @@ static void saa7146_remove_one(struct pci_dev *pdev)
iounmap(dev->mem); iounmap(dev->mem);
pci_release_region(pdev, 0); pci_release_region(pdev, 0);
list_del(&dev->item);
pci_disable_device(pdev); pci_disable_device(pdev);
kfree(dev); kfree(dev);
...@@ -592,8 +586,6 @@ EXPORT_SYMBOL_GPL(saa7146_setgpio); ...@@ -592,8 +586,6 @@ EXPORT_SYMBOL_GPL(saa7146_setgpio);
EXPORT_SYMBOL_GPL(saa7146_i2c_adapter_prepare); EXPORT_SYMBOL_GPL(saa7146_i2c_adapter_prepare);
EXPORT_SYMBOL_GPL(saa7146_debug); EXPORT_SYMBOL_GPL(saa7146_debug);
EXPORT_SYMBOL_GPL(saa7146_devices);
EXPORT_SYMBOL_GPL(saa7146_devices_lock);
MODULE_AUTHOR("Michael Hunold <michael@mihu.de>"); MODULE_AUTHOR("Michael Hunold <michael@mihu.de>");
MODULE_DESCRIPTION("driver for generic saa7146-based hardware"); MODULE_DESCRIPTION("driver for generic saa7146-based hardware");
......
...@@ -201,7 +201,7 @@ static int fops_open(struct file *file) ...@@ -201,7 +201,7 @@ static int fops_open(struct file *file)
DEB_EE("file:%p, dev:%s\n", file, video_device_node_name(vdev)); DEB_EE("file:%p, dev:%s\n", file, video_device_node_name(vdev));
if (mutex_lock_interruptible(&saa7146_devices_lock)) if (mutex_lock_interruptible(vdev->lock))
return -ERESTARTSYS; return -ERESTARTSYS;
DEB_D("using: %p\n", dev); DEB_D("using: %p\n", dev);
...@@ -253,7 +253,7 @@ static int fops_open(struct file *file) ...@@ -253,7 +253,7 @@ static int fops_open(struct file *file)
kfree(fh); kfree(fh);
file->private_data = NULL; file->private_data = NULL;
} }
mutex_unlock(&saa7146_devices_lock); mutex_unlock(vdev->lock);
return result; return result;
} }
...@@ -265,7 +265,7 @@ static int fops_release(struct file *file) ...@@ -265,7 +265,7 @@ static int fops_release(struct file *file)
DEB_EE("file:%p\n", file); DEB_EE("file:%p\n", file);
if (mutex_lock_interruptible(&saa7146_devices_lock)) if (mutex_lock_interruptible(vdev->lock))
return -ERESTARTSYS; return -ERESTARTSYS;
if (vdev->vfl_type == VFL_TYPE_VBI) { if (vdev->vfl_type == VFL_TYPE_VBI) {
...@@ -283,7 +283,7 @@ static int fops_release(struct file *file) ...@@ -283,7 +283,7 @@ static int fops_release(struct file *file)
file->private_data = NULL; file->private_data = NULL;
kfree(fh); kfree(fh);
mutex_unlock(&saa7146_devices_lock); mutex_unlock(vdev->lock);
return 0; return 0;
} }
...@@ -293,6 +293,7 @@ static int fops_mmap(struct file *file, struct vm_area_struct * vma) ...@@ -293,6 +293,7 @@ static int fops_mmap(struct file *file, struct vm_area_struct * vma)
struct video_device *vdev = video_devdata(file); struct video_device *vdev = video_devdata(file);
struct saa7146_fh *fh = file->private_data; struct saa7146_fh *fh = file->private_data;
struct videobuf_queue *q; struct videobuf_queue *q;
int res;
switch (vdev->vfl_type) { switch (vdev->vfl_type) {
case VFL_TYPE_GRABBER: { case VFL_TYPE_GRABBER: {
...@@ -314,10 +315,14 @@ static int fops_mmap(struct file *file, struct vm_area_struct * vma) ...@@ -314,10 +315,14 @@ static int fops_mmap(struct file *file, struct vm_area_struct * vma)
return 0; return 0;
} }
return videobuf_mmap_mapper(q,vma); if (mutex_lock_interruptible(vdev->lock))
return -ERESTARTSYS;
res = videobuf_mmap_mapper(q, vma);
mutex_unlock(vdev->lock);
return res;
} }
static unsigned int fops_poll(struct file *file, struct poll_table_struct *wait) static unsigned int __fops_poll(struct file *file, struct poll_table_struct *wait)
{ {
struct video_device *vdev = video_devdata(file); struct video_device *vdev = video_devdata(file);
struct saa7146_fh *fh = file->private_data; struct saa7146_fh *fh = file->private_data;
...@@ -356,10 +361,22 @@ static unsigned int fops_poll(struct file *file, struct poll_table_struct *wait) ...@@ -356,10 +361,22 @@ static unsigned int fops_poll(struct file *file, struct poll_table_struct *wait)
return res; return res;
} }
static unsigned int fops_poll(struct file *file, struct poll_table_struct *wait)
{
struct video_device *vdev = video_devdata(file);
unsigned int res;
mutex_lock(vdev->lock);
res = __fops_poll(file, wait);
mutex_unlock(vdev->lock);
return res;
}
static ssize_t fops_read(struct file *file, char __user *data, size_t count, loff_t *ppos) static ssize_t fops_read(struct file *file, char __user *data, size_t count, loff_t *ppos)
{ {
struct video_device *vdev = video_devdata(file); struct video_device *vdev = video_devdata(file);
struct saa7146_fh *fh = file->private_data; struct saa7146_fh *fh = file->private_data;
int ret;
switch (vdev->vfl_type) { switch (vdev->vfl_type) {
case VFL_TYPE_GRABBER: case VFL_TYPE_GRABBER:
...@@ -373,8 +390,13 @@ static ssize_t fops_read(struct file *file, char __user *data, size_t count, lof ...@@ -373,8 +390,13 @@ static ssize_t fops_read(struct file *file, char __user *data, size_t count, lof
DEB_EE("V4L2_BUF_TYPE_VBI_CAPTURE: file:%p, data:%p, count:%lu\n", DEB_EE("V4L2_BUF_TYPE_VBI_CAPTURE: file:%p, data:%p, count:%lu\n",
file, data, (unsigned long)count); file, data, (unsigned long)count);
*/ */
if (fh->dev->ext_vv_data->capabilities & V4L2_CAP_VBI_CAPTURE) if (fh->dev->ext_vv_data->capabilities & V4L2_CAP_VBI_CAPTURE) {
return saa7146_vbi_uops.read(file,data,count,ppos); if (mutex_lock_interruptible(vdev->lock))
return -ERESTARTSYS;
ret = saa7146_vbi_uops.read(file, data, count, ppos);
mutex_unlock(vdev->lock);
return ret;
}
return -EINVAL; return -EINVAL;
default: default:
BUG(); BUG();
...@@ -386,15 +408,20 @@ static ssize_t fops_write(struct file *file, const char __user *data, size_t cou ...@@ -386,15 +408,20 @@ static ssize_t fops_write(struct file *file, const char __user *data, size_t cou
{ {
struct video_device *vdev = video_devdata(file); struct video_device *vdev = video_devdata(file);
struct saa7146_fh *fh = file->private_data; struct saa7146_fh *fh = file->private_data;
int ret;
switch (vdev->vfl_type) { switch (vdev->vfl_type) {
case VFL_TYPE_GRABBER: case VFL_TYPE_GRABBER:
return -EINVAL; return -EINVAL;
case VFL_TYPE_VBI: case VFL_TYPE_VBI:
if (fh->dev->ext_vv_data->vbi_fops.write) if (fh->dev->ext_vv_data->vbi_fops.write) {
return fh->dev->ext_vv_data->vbi_fops.write(file, data, count, ppos); if (mutex_lock_interruptible(vdev->lock))
else return -ERESTARTSYS;
return -EINVAL; ret = fh->dev->ext_vv_data->vbi_fops.write(file, data, count, ppos);
mutex_unlock(vdev->lock);
return ret;
}
return -EINVAL;
default: default:
BUG(); BUG();
return -EINVAL; return -EINVAL;
...@@ -584,10 +611,6 @@ int saa7146_register_device(struct video_device **vid, struct saa7146_dev* dev, ...@@ -584,10 +611,6 @@ int saa7146_register_device(struct video_device **vid, struct saa7146_dev* dev,
else else
vfd->ioctl_ops = &dev->ext_vv_data->vbi_ops; vfd->ioctl_ops = &dev->ext_vv_data->vbi_ops;
vfd->release = video_device_release; vfd->release = video_device_release;
/* Locking in file operations other than ioctl should be done by
the driver, not the V4L2 core.
This driver needs auditing so that this flag can be removed. */
set_bit(V4L2_FL_LOCK_ALL_FOPS, &vfd->flags);
vfd->lock = &dev->v4l2_lock; vfd->lock = &dev->v4l2_lock;
vfd->v4l2_dev = &dev->v4l2_dev; vfd->v4l2_dev = &dev->v4l2_dev;
vfd->tvnorms = 0; vfd->tvnorms = 0;
......
...@@ -117,8 +117,6 @@ struct saa7146_dev ...@@ -117,8 +117,6 @@ struct saa7146_dev
{ {
struct module *module; struct module *module;
struct list_head item;
struct v4l2_device v4l2_dev; struct v4l2_device v4l2_dev;
struct v4l2_ctrl_handler ctrl_handler; struct v4l2_ctrl_handler ctrl_handler;
...@@ -166,8 +164,6 @@ static inline struct saa7146_dev *to_saa7146_dev(struct v4l2_device *v4l2_dev) ...@@ -166,8 +164,6 @@ static inline struct saa7146_dev *to_saa7146_dev(struct v4l2_device *v4l2_dev)
int saa7146_i2c_adapter_prepare(struct saa7146_dev *dev, struct i2c_adapter *i2c_adapter, u32 bitrate); int saa7146_i2c_adapter_prepare(struct saa7146_dev *dev, struct i2c_adapter *i2c_adapter, u32 bitrate);
/* from saa7146_core.c */ /* from saa7146_core.c */
extern struct list_head saa7146_devices;
extern struct mutex saa7146_devices_lock;
int saa7146_register_extension(struct saa7146_extension*); int saa7146_register_extension(struct saa7146_extension*);
int saa7146_unregister_extension(struct saa7146_extension*); int saa7146_unregister_extension(struct saa7146_extension*);
struct saa7146_format* saa7146_format_by_fourcc(struct saa7146_dev *dev, int fourcc); struct saa7146_format* saa7146_format_by_fourcc(struct saa7146_dev *dev, int fourcc);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册