|
@@ -296,8 +296,8 @@ static ssize_t cosa_write(struct file *file,
|
|
|
static unsigned int cosa_poll(struct file *file, poll_table *poll);
|
|
|
static int cosa_open(struct inode *inode, struct file *file);
|
|
|
static int cosa_release(struct inode *inode, struct file *file);
|
|
|
-static int cosa_chardev_ioctl(struct inode *inode, struct file *file,
|
|
|
- unsigned int cmd, unsigned long arg);
|
|
|
+static long cosa_chardev_ioctl(struct file *file, unsigned int cmd,
|
|
|
+ unsigned long arg);
|
|
|
#ifdef COSA_FASYNC_WORKING
|
|
|
static int cosa_fasync(struct inode *inode, struct file *file, int on);
|
|
|
#endif
|
|
@@ -308,7 +308,7 @@ static const struct file_operations cosa_fops = {
|
|
|
.read = cosa_read,
|
|
|
.write = cosa_write,
|
|
|
.poll = cosa_poll,
|
|
|
- .ioctl = cosa_chardev_ioctl,
|
|
|
+ .unlocked_ioctl = cosa_chardev_ioctl,
|
|
|
.open = cosa_open,
|
|
|
.release = cosa_release,
|
|
|
#ifdef COSA_FASYNC_WORKING
|
|
@@ -1203,12 +1203,18 @@ static int cosa_net_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
|
|
|
return hdlc_ioctl(dev, ifr, cmd);
|
|
|
}
|
|
|
|
|
|
-static int cosa_chardev_ioctl(struct inode *inode, struct file *file,
|
|
|
- unsigned int cmd, unsigned long arg)
|
|
|
+static long cosa_chardev_ioctl(struct file *file, unsigned int cmd,
|
|
|
+ unsigned long arg)
|
|
|
{
|
|
|
struct channel_data *channel = file->private_data;
|
|
|
- struct cosa_data *cosa = channel->cosa;
|
|
|
- return cosa_ioctl_common(cosa, channel, cmd, arg);
|
|
|
+ struct cosa_data *cosa;
|
|
|
+ long ret;
|
|
|
+
|
|
|
+ lock_kernel();
|
|
|
+ cosa = channel->cosa;
|
|
|
+ ret = cosa_ioctl_common(cosa, channel, cmd, arg);
|
|
|
+ unlock_kernel();
|
|
|
+ return ret;
|
|
|
}
|
|
|
|
|
|
|