viotape: Push down BKL ioctls
PATCH 1/1 viotape: Push down BKL ioctls
Signed-off-by Alan Cox <[email protected]>
drivers/char/viotape.c +21 -13
@@ -46,8 +46,9 @@#include <linux/completion.h> #include <linux/proc_fs.h> #include <linux/seq_file.h> +#include <linux/smp_lock.h> +#include <linux/uaccess.h> -#include <asm/uaccess.h> #include <asm/ioctls.h> #include <asm/firmware.h> #include <asm/vio.h>
@@ -509,18 +510,24 @@ free_op: }/* ioctl */ -static int viotap_ioctl (struct inode *inode,struct file *file, -unsigned int cmd,unsigned long arg) +static long viotap_ioctl (struct file *file,unsigned int cmd, +unsigned long arg) {HvLpEvent_Rc hvrc;int ret;struct viot_devinfo_struct devi;struct mtop mtc;u32 myOp; -struct op_struct *op =get_op_struct (); +struct op_struct *op; -if (op ==NULL ) +lock_kernel (); + + op=get_op_struct (); + +if (op ==NULL ) { +unlock_kernel ();return -ENOMEM ; + }get_dev_info (file->f_path.dentry->d_inode, &devi);
@@ -661,6 +668,7 @@ static int viotap_ioctl(struct inode *inode, struct file *file, &viomtget[devi.devno], sizeof(viomtget[0]))) ret = -EFAULT ; +unlock_kernel ();return ret;case MTIOCPOS :printk (VIOTAPE_KERN_WARN "Got an (unsupported) MTIOCPOS\n" );
@@ -674,6 +682,7 @@ static int viotap_ioctl(struct inode *inode, struct file *file, free_op:free_op_struct (op);up (&reqSem); +unlock_kernel ();return ret; }
@@ -783,12 +792,12 @@ free_op: }const struct file_operations viotap_fops = { - .owner =THIS_MODULE , - .read = viotap_read, - .write = viotap_write, - .ioctl = viotap_ioctl, - .open = viotap_open, - .release = viotap_release, + .owner =THIS_MODULE , + .read = viotap_read, + .write = viotap_write, + .unlocked_ioctl = viotap_ioctl, + .open = viotap_open, + .release = viotap_release, };/* Handle interrupt events for tape */
@@ -1000,8 +1009,7 @@ static int chg_state(int index, unsigned char new_state, struct file *file)if (*cur_state ==VIOT_WRITING ) {struct mtop write_eof = {MTWEOF ,1 }; - rc =viotap_ioctl (NULL , file,MTIOCTOP , - (unsigned long )&write_eof); + rc =viotap_ioctl (file,MTIOCTOP , (unsigned long )&write_eof); } *cur_state = new_state;return rc;
Hi Alan,
drivers/char/viotape.c free_op: · line 514
Quoted 5 lines · On Thu, 22 May 2008 22:20:12 +0100 Alan Cox <[email protected]> wrote:
drivers/char/viotape.c +2
-2-static int viotap_ioctl (struct inode *inode,struct file *file, -unsigned int cmd,unsigned long arg) +static long viotap_ioctl (struct file *file,unsigned int cmd, +unsigned long arg)
The inode parameter is used in this function (so it won't build after
this patch) but in a weird way. I will do an alternate patch.
Signature · 3 lines
Cheers, Stephen Rothwell [email protected] http://www.canb.auug.org.au/~sfr/
PATCH 1/1 viotape: use unlocked_ioctl
This pushes the BKL down into the driver. Based on a patch by Alan Cox.
We need to do it this way for now as the inode parameter of viotap_ioctl is used internally as a flag. We should do a further cleanup patch.
Cc Alan Cox <[email protected]>
Signed-off-by Stephen Rothwell <[email protected]>
--- drivers/char/viotape.c | 24 ++++++++++++++++++------ 1 files changed, 18 insertions(+), 6 deletions(-)
drivers/char/viotape.c +18 -6
@@ -46,6 +46,7 @@#include <linux/completion.h> #include <linux/proc_fs.h> #include <linux/seq_file.h> +#include <linux/smp_lock.h> #include <asm/uaccess.h> #include <asm/ioctls.h>
@@ -677,6 +678,17 @@ free_op:return ret; } +static long viotap_unlocked_ioctl (struct file *file, +unsigned int cmd,unsigned long arg) +{ +long rc; + +lock_kernel (); + rc =viotap_ioctl (file->f_path.dentry->d_inode, file, cmd, arg); +unlock_kernel (); +return rc; +} +static int viotap_open (struct inode *inode,struct file *file) {HvLpEvent_Rc hvrc;
@@ -783,12 +795,12 @@ free_op: }const struct file_operations viotap_fops = { - .owner =THIS_MODULE , - .read = viotap_read, - .write = viotap_write, - .ioctl = viotap_ioctl, - .open = viotap_open, - .release = viotap_release, + .owner =THIS_MODULE , + .read = viotap_read, + .write = viotap_write, + .unlocked_ioctl = viotap_unlocked_ioctl, + .open = viotap_open, + .release = viotap_release, };/* Handle interrupt events for tape */
Signature · 7 lines
1.5.5.1 -- Cheers, Stephen Rothwell [email protected] http://www.canb.auug.org.au/~sfr/