|
@@ -32,9 +32,9 @@
|
|
|
#include <linux/fs.h>
|
|
|
#include <linux/cdev.h>
|
|
|
#include <linux/mutex.h>
|
|
|
-#include <linux/smp_lock.h>
|
|
|
#include "dvbdev.h"
|
|
|
|
|
|
+static DEFINE_MUTEX(dvbdev_mutex);
|
|
|
static int dvbdev_debug;
|
|
|
|
|
|
module_param(dvbdev_debug, int, 0644);
|
|
@@ -68,7 +68,7 @@ static int dvb_device_open(struct inode *inode, struct file *file)
|
|
|
{
|
|
|
struct dvb_device *dvbdev;
|
|
|
|
|
|
- lock_kernel();
|
|
|
+ mutex_lock(&dvbdev_mutex);
|
|
|
down_read(&minor_rwsem);
|
|
|
dvbdev = dvb_minors[iminor(inode)];
|
|
|
|
|
@@ -91,12 +91,12 @@ static int dvb_device_open(struct inode *inode, struct file *file)
|
|
|
}
|
|
|
fops_put(old_fops);
|
|
|
up_read(&minor_rwsem);
|
|
|
- unlock_kernel();
|
|
|
+ mutex_unlock(&dvbdev_mutex);
|
|
|
return err;
|
|
|
}
|
|
|
fail:
|
|
|
up_read(&minor_rwsem);
|
|
|
- unlock_kernel();
|
|
|
+ mutex_unlock(&dvbdev_mutex);
|
|
|
return -ENODEV;
|
|
|
}
|
|
|
|
|
@@ -158,7 +158,6 @@ long dvb_generic_ioctl(struct file *file,
|
|
|
unsigned int cmd, unsigned long arg)
|
|
|
{
|
|
|
struct dvb_device *dvbdev = file->private_data;
|
|
|
- int ret;
|
|
|
|
|
|
if (!dvbdev)
|
|
|
return -ENODEV;
|
|
@@ -166,11 +165,7 @@ long dvb_generic_ioctl(struct file *file,
|
|
|
if (!dvbdev->kernel_ioctl)
|
|
|
return -EINVAL;
|
|
|
|
|
|
- lock_kernel();
|
|
|
- ret = dvb_usercopy(file, cmd, arg, dvbdev->kernel_ioctl);
|
|
|
- unlock_kernel();
|
|
|
-
|
|
|
- return ret;
|
|
|
+ return dvb_usercopy(file, cmd, arg, dvbdev->kernel_ioctl);
|
|
|
}
|
|
|
EXPORT_SYMBOL(dvb_generic_ioctl);
|
|
|
|
|
@@ -421,8 +416,10 @@ int dvb_usercopy(struct file *file,
|
|
|
}
|
|
|
|
|
|
/* call driver */
|
|
|
+ mutex_lock(&dvbdev_mutex);
|
|
|
if ((err = func(file, cmd, parg)) == -ENOIOCTLCMD)
|
|
|
err = -EINVAL;
|
|
|
+ mutex_unlock(&dvbdev_mutex);
|
|
|
|
|
|
if (err < 0)
|
|
|
goto out;
|