|
@@ -24,6 +24,7 @@
|
|
|
#include <linux/miscdevice.h>
|
|
|
#include <linux/module.h>
|
|
|
#include <linux/mISDNif.h>
|
|
|
+#include <linux/smp_lock.h>
|
|
|
#include "core.h"
|
|
|
|
|
|
static u_int *debug;
|
|
@@ -215,9 +216,8 @@ unlock:
|
|
|
return ret;
|
|
|
}
|
|
|
|
|
|
-static int
|
|
|
-mISDN_ioctl(struct inode *inode, struct file *filep, unsigned int cmd,
|
|
|
- unsigned long arg)
|
|
|
+static long
|
|
|
+mISDN_ioctl(struct file *filep, unsigned int cmd, unsigned long arg)
|
|
|
{
|
|
|
struct mISDNtimerdev *dev = filep->private_data;
|
|
|
int id, tout, ret = 0;
|
|
@@ -226,6 +226,7 @@ mISDN_ioctl(struct inode *inode, struct file *filep, unsigned int cmd,
|
|
|
if (*debug & DEBUG_TIMER)
|
|
|
printk(KERN_DEBUG "%s(%p, %x, %lx)\n", __func__,
|
|
|
filep, cmd, arg);
|
|
|
+ lock_kernel();
|
|
|
switch (cmd) {
|
|
|
case IMADDTIMER:
|
|
|
if (get_user(tout, (int __user *)arg)) {
|
|
@@ -257,13 +258,14 @@ mISDN_ioctl(struct inode *inode, struct file *filep, unsigned int cmd,
|
|
|
default:
|
|
|
ret = -EINVAL;
|
|
|
}
|
|
|
+ unlock_kernel();
|
|
|
return ret;
|
|
|
}
|
|
|
|
|
|
static const struct file_operations mISDN_fops = {
|
|
|
.read = mISDN_read,
|
|
|
.poll = mISDN_poll,
|
|
|
- .ioctl = mISDN_ioctl,
|
|
|
+ .unlocked_ioctl = mISDN_ioctl,
|
|
|
.open = mISDN_open,
|
|
|
.release = mISDN_close,
|
|
|
};
|