i8k: Push the BKL down into the driver ioctl method
PATCH 1/1 i8k: Push the BKL down into the driver ioctl method
Signed-off-by Alan Cox <[email protected]>
drivers/char/i8k.c +23 -23
@@ -23,8 +23,9 @@#include <linux/seq_file.h> #include <linux/dmi.h> #include <linux/capability.h> -#include <asm/uaccess.h> -#include <asm/io.h> +#include <linux/smp_lock.h> +#include <linux/uaccess.h> +#include <linux/io.h> #include <linux/i8k.h>
@@ -82,8 +83,7 @@ module_param(fan_mult, int, 0);MODULE_PARM_DESC (fan_mult,"Factor to multiply fan speed with" );static int i8k_open_fs (struct inode *inode,struct file *file); -static int i8k_ioctl (struct inode *,struct file *,unsigned int , -unsigned long ); +static long i8k_ioctl (struct file *,unsigned int ,unsigned long );static const struct file_operations i8k_fops = { .owner =THIS_MODULE ,
@@ -91,7 +91,7 @@ static const struct file_operations i8k_fops = { .read = seq_read, .llseek = seq_lseek, .release = single_release, - .ioctl = i8k_ioctl, + .unlocked_ioctl = i8k_ioctl, };struct smm_regs {
@@ -307,8 +307,7 @@ static int i8k_get_dell_signature(int req_fn)return regs.eax ==1145651527 && regs.edx ==1145392204 ?0 :-1 ; } -static int i8k_ioctl (struct inode *ip,struct file *fp,unsigned int cmd, -unsigned long arg) +static long i8k_ioctl (struct file *fp,unsigned int cmd,unsigned long arg) {int val =0 ;int speed;
@@ -318,6 +317,8 @@ static int i8k_ioctl(struct inode *ip, struct file *fp, unsigned int cmd,if (!argp)return -EINVAL ; +lock_kernel (); +switch (cmd) {case I8K_BIOS_VERSION : val =i8k_get_bios_version ();
@@ -342,34 +343,33 @@ static int i8k_ioctl(struct inode *ip, struct file *fp, unsigned int cmd,case I8K_GET_SPEED :if (copy_from_user (&val, argp,sizeof (int ))) -return -EFAULT ; - - val =i8k_get_fan_speed (val); + val = -EFAULT ; +else + val =i8k_get_fan_speed (val);break ;case I8K_GET_FAN :if (copy_from_user (&val, argp,sizeof (int ))) -return -EFAULT ; - - val =i8k_get_fan_status (val); + val = -EFAULT ; +else + val =i8k_get_fan_status (val);break ;case I8K_SET_FAN :if (restricted && !capable (CAP_SYS_ADMIN )) -return -EPERM ; - -if (copy_from_user (&val, argp,sizeof (int ))) -return -EFAULT ; - -if (copy_from_user (&speed, argp +1 ,sizeof (int ))) -return -EFAULT ; - - val =i8k_set_fan (val, speed); + val = -EPERM ; +else if (copy_from_user (&val, argp,sizeof (int ))) + val = -EFAULT ; +else if (copy_from_user (&speed, argp +1 ,sizeof (int ))) + val = -EFAULT ; +else + val =i8k_set_fan (val, speed);break ;default : -return -EINVAL ; + val = -ENOTTY ; } +unlock_kernel ();if (val <0 )return val;