|
@@ -49,7 +49,6 @@
|
|
|
#include <linux/module.h>
|
|
|
#include <linux/delay.h>
|
|
|
#include <linux/slab.h>
|
|
|
-#include <linux/smp_lock.h>
|
|
|
#include <linux/pci.h>
|
|
|
#include <linux/vmalloc.h>
|
|
|
#include <linux/wait.h>
|
|
@@ -913,7 +912,7 @@ static int zoran_open(struct file *file)
|
|
|
dprintk(2, KERN_INFO "%s: %s(%s, pid=[%d]), users(-)=%d\n",
|
|
|
ZR_DEVNAME(zr), __func__, current->comm, task_pid_nr(current), zr->user + 1);
|
|
|
|
|
|
- lock_kernel();
|
|
|
+ mutex_lock(&zr->other_lock);
|
|
|
|
|
|
if (zr->user >= 2048) {
|
|
|
dprintk(1, KERN_ERR "%s: too many users (%d) on device\n",
|
|
@@ -963,14 +962,14 @@ static int zoran_open(struct file *file)
|
|
|
file->private_data = fh;
|
|
|
fh->zr = zr;
|
|
|
zoran_open_init_session(fh);
|
|
|
- unlock_kernel();
|
|
|
+ mutex_unlock(&zr->other_lock);
|
|
|
|
|
|
return 0;
|
|
|
|
|
|
fail_fh:
|
|
|
kfree(fh);
|
|
|
fail_unlock:
|
|
|
- unlock_kernel();
|
|
|
+ mutex_unlock(&zr->other_lock);
|
|
|
|
|
|
dprintk(2, KERN_INFO "%s: open failed (%d), users(-)=%d\n",
|
|
|
ZR_DEVNAME(zr), res, zr->user);
|
|
@@ -989,7 +988,7 @@ zoran_close(struct file *file)
|
|
|
|
|
|
/* kernel locks (fs/device.c), so don't do that ourselves
|
|
|
* (prevents deadlocks) */
|
|
|
- /*mutex_lock(&zr->resource_lock);*/
|
|
|
+ mutex_lock(&zr->other_lock);
|
|
|
|
|
|
zoran_close_end_session(fh);
|
|
|
|
|
@@ -1023,6 +1022,7 @@ zoran_close(struct file *file)
|
|
|
encoder_call(zr, video, s_routing, 2, 0, 0);
|
|
|
}
|
|
|
}
|
|
|
+ mutex_unlock(&zr->other_lock);
|
|
|
|
|
|
file->private_data = NULL;
|
|
|
kfree(fh->overlay_mask);
|
|
@@ -3370,11 +3370,26 @@ static const struct v4l2_ioctl_ops zoran_ioctl_ops = {
|
|
|
#endif
|
|
|
};
|
|
|
|
|
|
+/* please use zr->resource_lock consistently and kill this wrapper */
|
|
|
+static long zoran_ioctl(struct file *file, unsigned int cmd,
|
|
|
+ unsigned long arg)
|
|
|
+{
|
|
|
+ struct zoran_fh *fh = file->private_data;
|
|
|
+ struct zoran *zr = fh->zr;
|
|
|
+ int ret;
|
|
|
+
|
|
|
+ mutex_lock(&zr->other_lock);
|
|
|
+ ret = video_ioctl2(file, cmd, arg);
|
|
|
+ mutex_unlock(&zr->other_lock);
|
|
|
+
|
|
|
+ return ret;
|
|
|
+}
|
|
|
+
|
|
|
static const struct v4l2_file_operations zoran_fops = {
|
|
|
.owner = THIS_MODULE,
|
|
|
.open = zoran_open,
|
|
|
.release = zoran_close,
|
|
|
- .ioctl = video_ioctl2,
|
|
|
+ .unlocked_ioctl = zoran_ioctl,
|
|
|
.read = zoran_read,
|
|
|
.write = zoran_write,
|
|
|
.mmap = zoran_mmap,
|