dtlk: Push down the BKL
PATCH 1/1 dtlk: Push down the BKL
This is pretty close to eliminating it but needs someone to take the final steps
Signed-off-by Alan Cox <[email protected]>
drivers/char/dtlk.c +11 -8
@@ -62,6 +62,7 @@#include <linux/init.h> /* for __init, module_{init,exit} */ #include <linux/poll.h> /* for POLLIN, etc. */ #include <linux/dtlk.h> /* local header file for DoubleTalk values */ +#include <linux/smp_lock.h> #ifdef TRACING #define TRACE_TEXT (str) printk(str);
@@ -91,8 +92,8 @@ static ssize_t dtlk_write(struct file *, const char __user *,static unsigned int dtlk_poll (struct file *,poll_table *);static int dtlk_open (struct inode *,struct file *);static int dtlk_release (struct inode *,struct file *); -static int dtlk_ioctl (struct inode *inode,struct file *file, -unsigned int cmd,unsigned long arg); +static long dtlk_ioctl (struct file *file,unsigned int cmd, +unsigned long arg);static const struct file_operations dtlk_fops = {
@@ -100,7 +101,7 @@ static const struct file_operations dtlk_fops = .read = dtlk_read, .write = dtlk_write, .poll = dtlk_poll, - .ioctl = dtlk_ioctl, + .unlocked_ioctl = dtlk_ioctl, .open = dtlk_open, .release = dtlk_release, };
@@ -261,10 +262,8 @@ static void dtlk_timer_tick(unsigned long data)wake_up_interruptible (&dtlk_process_list); } -static int dtlk_ioctl (struct inode *inode, -struct file *file, -unsigned int cmd, -unsigned long arg) +static long dtlk_ioctl (struct file *file,unsigned int cmd, +unsigned long arg) {char __user *argp = (char __user *)arg;struct dtlk_settings *sp;
@@ -274,17 +273,21 @@ static int dtlk_ioctl(struct inode *inode,switch (cmd) {case DTLK_INTERROGATE : +lock_kernel (); sp =dtlk_interrogate (); +unlock_kernel ();if (copy_to_user (argp, sp,sizeof (struct dtlk_settings )))return -EINVAL ;return 0 ;case DTLK_STATUS : +lock_kernel (); portval =inb_p (dtlk_port_tts); +unlock_kernel ();return put_user (portval, argp);default : -return -EINVAL ; +return -ENOTTY ; } }