aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/scsi
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2010-05-24 11:01:10 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2010-05-24 11:01:10 -0400
commitf13771187b9423b824f32518319f6da85d819003 (patch)
treec431cf16c286065a302d5f3fb43fc1abac7e4047 /drivers/scsi
parent15953654cc312429740fd58fb37a5a3d63a54376 (diff)
parent9f37af654fda88a8dcca74c785f6c20e52758866 (diff)
Merge branch 'bkl/ioctl' of git://git.kernel.org/pub/scm/linux/kernel/git/frederic/random-tracing
* 'bkl/ioctl' of git://git.kernel.org/pub/scm/linux/kernel/git/frederic/random-tracing: uml: Pushdown the bkl from harddog_kern ioctl sunrpc: Pushdown the bkl from sunrpc cache ioctl sunrpc: Pushdown the bkl from ioctl autofs4: Pushdown the bkl from ioctl uml: Convert to unlocked_ioctls to remove implicit BKL ncpfs: BKL ioctl pushdown coda: Clean-up whitespace problems in pioctl.c coda: BKL ioctl pushdown drivers: Push down BKL into various drivers isdn: Push down BKL into ioctl functions scsi: Push down BKL into ioctl functions dvb: Push down BKL into ioctl functions smbfs: Push down BKL into ioctl function coda/psdev: Remove BKL from ioctl function um/mmapper: Remove BKL usage sn_hwperf: Kill BKL usage hfsplus: Push down BKL into ioctl function
Diffstat (limited to 'drivers/scsi')
-rw-r--r--drivers/scsi/3w-9xxx.c10
-rw-r--r--drivers/scsi/3w-sas.c8
-rw-r--r--drivers/scsi/3w-xxxx.c11
-rw-r--r--drivers/scsi/aacraid/linit.c11
-rw-r--r--drivers/scsi/dpt_i2o.c20
-rw-r--r--drivers/scsi/gdth.c20
-rw-r--r--drivers/scsi/megaraid.c20
-rw-r--r--drivers/scsi/megaraid.h3
-rw-r--r--drivers/scsi/megaraid/megaraid_mm.c22
-rw-r--r--drivers/scsi/osst.c14
-rw-r--r--drivers/scsi/sg.c17
11 files changed, 120 insertions, 36 deletions
diff --git a/drivers/scsi/3w-9xxx.c b/drivers/scsi/3w-9xxx.c
index 1bb774becf25..e20b7bdd4c78 100644
--- a/drivers/scsi/3w-9xxx.c
+++ b/drivers/scsi/3w-9xxx.c
@@ -125,7 +125,7 @@ static void twa_aen_queue_event(TW_Device_Extension *tw_dev, TW_Command_Apache_H
125static int twa_aen_read_queue(TW_Device_Extension *tw_dev, int request_id); 125static int twa_aen_read_queue(TW_Device_Extension *tw_dev, int request_id);
126static char *twa_aen_severity_lookup(unsigned char severity_code); 126static char *twa_aen_severity_lookup(unsigned char severity_code);
127static void twa_aen_sync_time(TW_Device_Extension *tw_dev, int request_id); 127static void twa_aen_sync_time(TW_Device_Extension *tw_dev, int request_id);
128static int twa_chrdev_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg); 128static long twa_chrdev_ioctl(struct file *file, unsigned int cmd, unsigned long arg);
129static int twa_chrdev_open(struct inode *inode, struct file *file); 129static int twa_chrdev_open(struct inode *inode, struct file *file);
130static int twa_fill_sense(TW_Device_Extension *tw_dev, int request_id, int copy_sense, int print_host); 130static int twa_fill_sense(TW_Device_Extension *tw_dev, int request_id, int copy_sense, int print_host);
131static void twa_free_request_id(TW_Device_Extension *tw_dev,int request_id); 131static void twa_free_request_id(TW_Device_Extension *tw_dev,int request_id);
@@ -220,7 +220,7 @@ static struct device_attribute *twa_host_attrs[] = {
220/* File operations struct for character device */ 220/* File operations struct for character device */
221static const struct file_operations twa_fops = { 221static const struct file_operations twa_fops = {
222 .owner = THIS_MODULE, 222 .owner = THIS_MODULE,
223 .ioctl = twa_chrdev_ioctl, 223 .unlocked_ioctl = twa_chrdev_ioctl,
224 .open = twa_chrdev_open, 224 .open = twa_chrdev_open,
225 .release = NULL 225 .release = NULL
226}; 226};
@@ -637,8 +637,9 @@ out:
637} /* End twa_check_srl() */ 637} /* End twa_check_srl() */
638 638
639/* This function handles ioctl for the character device */ 639/* This function handles ioctl for the character device */
640static int twa_chrdev_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg) 640static long twa_chrdev_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
641{ 641{
642 struct inode *inode = file->f_path.dentry->d_inode;
642 long timeout; 643 long timeout;
643 unsigned long *cpu_addr, data_buffer_length_adjusted = 0, flags = 0; 644 unsigned long *cpu_addr, data_buffer_length_adjusted = 0, flags = 0;
644 dma_addr_t dma_handle; 645 dma_addr_t dma_handle;
@@ -657,6 +658,8 @@ static int twa_chrdev_ioctl(struct inode *inode, struct file *file, unsigned int
657 int retval = TW_IOCTL_ERROR_OS_EFAULT; 658 int retval = TW_IOCTL_ERROR_OS_EFAULT;
658 void __user *argp = (void __user *)arg; 659 void __user *argp = (void __user *)arg;
659 660
661 lock_kernel();
662
660 /* Only let one of these through at a time */ 663 /* Only let one of these through at a time */
661 if (mutex_lock_interruptible(&tw_dev->ioctl_lock)) { 664 if (mutex_lock_interruptible(&tw_dev->ioctl_lock)) {
662 retval = TW_IOCTL_ERROR_OS_EINTR; 665 retval = TW_IOCTL_ERROR_OS_EINTR;
@@ -876,6 +879,7 @@ out3:
876out2: 879out2:
877 mutex_unlock(&tw_dev->ioctl_lock); 880 mutex_unlock(&tw_dev->ioctl_lock);
878out: 881out:
882 unlock_kernel();
879 return retval; 883 return retval;
880} /* End twa_chrdev_ioctl() */ 884} /* End twa_chrdev_ioctl() */
881 885
diff --git a/drivers/scsi/3w-sas.c b/drivers/scsi/3w-sas.c
index d38000db9237..f481e734aad4 100644
--- a/drivers/scsi/3w-sas.c
+++ b/drivers/scsi/3w-sas.c
@@ -750,19 +750,22 @@ static void twl_load_sgl(TW_Device_Extension *tw_dev, TW_Command_Full *full_comm
750 750
751/* This function handles ioctl for the character device 751/* This function handles ioctl for the character device
752 This interface is used by smartmontools open source software */ 752 This interface is used by smartmontools open source software */
753static int twl_chrdev_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg) 753static long twl_chrdev_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
754{ 754{
755 long timeout; 755 long timeout;
756 unsigned long *cpu_addr, data_buffer_length_adjusted = 0, flags = 0; 756 unsigned long *cpu_addr, data_buffer_length_adjusted = 0, flags = 0;
757 dma_addr_t dma_handle; 757 dma_addr_t dma_handle;
758 int request_id = 0; 758 int request_id = 0;
759 TW_Ioctl_Driver_Command driver_command; 759 TW_Ioctl_Driver_Command driver_command;
760 struct inode *inode = file->f_dentry->d_inode;
760 TW_Ioctl_Buf_Apache *tw_ioctl; 761 TW_Ioctl_Buf_Apache *tw_ioctl;
761 TW_Command_Full *full_command_packet; 762 TW_Command_Full *full_command_packet;
762 TW_Device_Extension *tw_dev = twl_device_extension_list[iminor(inode)]; 763 TW_Device_Extension *tw_dev = twl_device_extension_list[iminor(inode)];
763 int retval = -EFAULT; 764 int retval = -EFAULT;
764 void __user *argp = (void __user *)arg; 765 void __user *argp = (void __user *)arg;
765 766
767 lock_kernel();
768
766 /* Only let one of these through at a time */ 769 /* Only let one of these through at a time */
767 if (mutex_lock_interruptible(&tw_dev->ioctl_lock)) { 770 if (mutex_lock_interruptible(&tw_dev->ioctl_lock)) {
768 retval = -EINTR; 771 retval = -EINTR;
@@ -858,6 +861,7 @@ out3:
858out2: 861out2:
859 mutex_unlock(&tw_dev->ioctl_lock); 862 mutex_unlock(&tw_dev->ioctl_lock);
860out: 863out:
864 unlock_kernel();
861 return retval; 865 return retval;
862} /* End twl_chrdev_ioctl() */ 866} /* End twl_chrdev_ioctl() */
863 867
@@ -884,7 +888,7 @@ out:
884/* File operations struct for character device */ 888/* File operations struct for character device */
885static const struct file_operations twl_fops = { 889static const struct file_operations twl_fops = {
886 .owner = THIS_MODULE, 890 .owner = THIS_MODULE,
887 .ioctl = twl_chrdev_ioctl, 891 .unlocked_ioctl = twl_chrdev_ioctl,
888 .open = twl_chrdev_open, 892 .open = twl_chrdev_open,
889 .release = NULL 893 .release = NULL
890}; 894};
diff --git a/drivers/scsi/3w-xxxx.c b/drivers/scsi/3w-xxxx.c
index d119a614bf7d..30d735ad35b5 100644
--- a/drivers/scsi/3w-xxxx.c
+++ b/drivers/scsi/3w-xxxx.c
@@ -881,7 +881,7 @@ static int tw_allocate_memory(TW_Device_Extension *tw_dev, int size, int which)
881} /* End tw_allocate_memory() */ 881} /* End tw_allocate_memory() */
882 882
883/* This function handles ioctl for the character device */ 883/* This function handles ioctl for the character device */
884static int tw_chrdev_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg) 884static long tw_chrdev_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
885{ 885{
886 int request_id; 886 int request_id;
887 dma_addr_t dma_handle; 887 dma_addr_t dma_handle;
@@ -889,6 +889,7 @@ static int tw_chrdev_ioctl(struct inode *inode, struct file *file, unsigned int
889 unsigned long flags; 889 unsigned long flags;
890 unsigned int data_buffer_length = 0; 890 unsigned int data_buffer_length = 0;
891 unsigned long data_buffer_length_adjusted = 0; 891 unsigned long data_buffer_length_adjusted = 0;
892 struct inode *inode = file->f_dentry->d_inode;
892 unsigned long *cpu_addr; 893 unsigned long *cpu_addr;
893 long timeout; 894 long timeout;
894 TW_New_Ioctl *tw_ioctl; 895 TW_New_Ioctl *tw_ioctl;
@@ -899,9 +900,12 @@ static int tw_chrdev_ioctl(struct inode *inode, struct file *file, unsigned int
899 900
900 dprintk(KERN_WARNING "3w-xxxx: tw_chrdev_ioctl()\n"); 901 dprintk(KERN_WARNING "3w-xxxx: tw_chrdev_ioctl()\n");
901 902
903 lock_kernel();
902 /* Only let one of these through at a time */ 904 /* Only let one of these through at a time */
903 if (mutex_lock_interruptible(&tw_dev->ioctl_lock)) 905 if (mutex_lock_interruptible(&tw_dev->ioctl_lock)) {
906 unlock_kernel();
904 return -EINTR; 907 return -EINTR;
908 }
905 909
906 /* First copy down the buffer length */ 910 /* First copy down the buffer length */
907 if (copy_from_user(&data_buffer_length, argp, sizeof(unsigned int))) 911 if (copy_from_user(&data_buffer_length, argp, sizeof(unsigned int)))
@@ -1030,6 +1034,7 @@ out2:
1030 dma_free_coherent(&tw_dev->tw_pci_dev->dev, data_buffer_length_adjusted+sizeof(TW_New_Ioctl) - 1, cpu_addr, dma_handle); 1034 dma_free_coherent(&tw_dev->tw_pci_dev->dev, data_buffer_length_adjusted+sizeof(TW_New_Ioctl) - 1, cpu_addr, dma_handle);
1031out: 1035out:
1032 mutex_unlock(&tw_dev->ioctl_lock); 1036 mutex_unlock(&tw_dev->ioctl_lock);
1037 unlock_kernel();
1033 return retval; 1038 return retval;
1034} /* End tw_chrdev_ioctl() */ 1039} /* End tw_chrdev_ioctl() */
1035 1040
@@ -1052,7 +1057,7 @@ static int tw_chrdev_open(struct inode *inode, struct file *file)
1052/* File operations struct for character device */ 1057/* File operations struct for character device */
1053static const struct file_operations tw_fops = { 1058static const struct file_operations tw_fops = {
1054 .owner = THIS_MODULE, 1059 .owner = THIS_MODULE,
1055 .ioctl = tw_chrdev_ioctl, 1060 .unlocked_ioctl = tw_chrdev_ioctl,
1056 .open = tw_chrdev_open, 1061 .open = tw_chrdev_open,
1057 .release = NULL 1062 .release = NULL
1058}; 1063};
diff --git a/drivers/scsi/aacraid/linit.c b/drivers/scsi/aacraid/linit.c
index e9373a2d14fa..33898b61fdb5 100644
--- a/drivers/scsi/aacraid/linit.c
+++ b/drivers/scsi/aacraid/linit.c
@@ -705,12 +705,17 @@ static int aac_cfg_open(struct inode *inode, struct file *file)
705 * Bugs: Needs to handle hot plugging 705 * Bugs: Needs to handle hot plugging
706 */ 706 */
707 707
708static int aac_cfg_ioctl(struct inode *inode, struct file *file, 708static long aac_cfg_ioctl(struct file *file,
709 unsigned int cmd, unsigned long arg) 709 unsigned int cmd, unsigned long arg)
710{ 710{
711 int ret;
711 if (!capable(CAP_SYS_RAWIO)) 712 if (!capable(CAP_SYS_RAWIO))
712 return -EPERM; 713 return -EPERM;
713 return aac_do_ioctl(file->private_data, cmd, (void __user *)arg); 714 lock_kernel();
715 ret = aac_do_ioctl(file->private_data, cmd, (void __user *)arg);
716 unlock_kernel();
717
718 return ret;
714} 719}
715 720
716#ifdef CONFIG_COMPAT 721#ifdef CONFIG_COMPAT
@@ -1029,7 +1034,7 @@ ssize_t aac_get_serial_number(struct device *device, char *buf)
1029 1034
1030static const struct file_operations aac_cfg_fops = { 1035static const struct file_operations aac_cfg_fops = {
1031 .owner = THIS_MODULE, 1036 .owner = THIS_MODULE,
1032 .ioctl = aac_cfg_ioctl, 1037 .unlocked_ioctl = aac_cfg_ioctl,
1033#ifdef CONFIG_COMPAT 1038#ifdef CONFIG_COMPAT
1034 .compat_ioctl = aac_compat_cfg_ioctl, 1039 .compat_ioctl = aac_compat_cfg_ioctl,
1035#endif 1040#endif
diff --git a/drivers/scsi/dpt_i2o.c b/drivers/scsi/dpt_i2o.c
index 0435d044c9da..b0c576f84b28 100644
--- a/drivers/scsi/dpt_i2o.c
+++ b/drivers/scsi/dpt_i2o.c
@@ -114,12 +114,13 @@ static int hba_count = 0;
114 114
115static struct class *adpt_sysfs_class; 115static struct class *adpt_sysfs_class;
116 116
117static long adpt_unlocked_ioctl(struct file *, unsigned int, unsigned long);
117#ifdef CONFIG_COMPAT 118#ifdef CONFIG_COMPAT
118static long compat_adpt_ioctl(struct file *, unsigned int, unsigned long); 119static long compat_adpt_ioctl(struct file *, unsigned int, unsigned long);
119#endif 120#endif
120 121
121static const struct file_operations adpt_fops = { 122static const struct file_operations adpt_fops = {
122 .ioctl = adpt_ioctl, 123 .unlocked_ioctl = adpt_unlocked_ioctl,
123 .open = adpt_open, 124 .open = adpt_open,
124 .release = adpt_close, 125 .release = adpt_close,
125#ifdef CONFIG_COMPAT 126#ifdef CONFIG_COMPAT
@@ -2069,8 +2070,7 @@ static int adpt_system_info(void __user *buffer)
2069 return 0; 2070 return 0;
2070} 2071}
2071 2072
2072static int adpt_ioctl(struct inode *inode, struct file *file, uint cmd, 2073static int adpt_ioctl(struct inode *inode, struct file *file, uint cmd, ulong arg)
2073 ulong arg)
2074{ 2074{
2075 int minor; 2075 int minor;
2076 int error = 0; 2076 int error = 0;
@@ -2153,6 +2153,20 @@ static int adpt_ioctl(struct inode *inode, struct file *file, uint cmd,
2153 return error; 2153 return error;
2154} 2154}
2155 2155
2156static long adpt_unlocked_ioctl(struct file *file, uint cmd, ulong arg)
2157{
2158 struct inode *inode;
2159 long ret;
2160
2161 inode = file->f_dentry->d_inode;
2162
2163 lock_kernel();
2164 ret = adpt_ioctl(inode, file, cmd, arg);
2165 unlock_kernel();
2166
2167 return ret;
2168}
2169
2156#ifdef CONFIG_COMPAT 2170#ifdef CONFIG_COMPAT
2157static long compat_adpt_ioctl(struct file *file, 2171static long compat_adpt_ioctl(struct file *file,
2158 unsigned int cmd, unsigned long arg) 2172 unsigned int cmd, unsigned long arg)
diff --git a/drivers/scsi/gdth.c b/drivers/scsi/gdth.c
index a765fe7a55c3..f672d6213eea 100644
--- a/drivers/scsi/gdth.c
+++ b/drivers/scsi/gdth.c
@@ -180,8 +180,8 @@ static const char *gdth_ctr_name(gdth_ha_str *ha);
180 180
181static int gdth_open(struct inode *inode, struct file *filep); 181static int gdth_open(struct inode *inode, struct file *filep);
182static int gdth_close(struct inode *inode, struct file *filep); 182static int gdth_close(struct inode *inode, struct file *filep);
183static int gdth_ioctl(struct inode *inode, struct file *filep, 183static long gdth_unlocked_ioctl(struct file *filep, unsigned int cmd,
184 unsigned int cmd, unsigned long arg); 184 unsigned long arg);
185 185
186static void gdth_flush(gdth_ha_str *ha); 186static void gdth_flush(gdth_ha_str *ha);
187static int gdth_queuecommand(Scsi_Cmnd *scp,void (*done)(Scsi_Cmnd *)); 187static int gdth_queuecommand(Scsi_Cmnd *scp,void (*done)(Scsi_Cmnd *));
@@ -369,7 +369,7 @@ MODULE_LICENSE("GPL");
369 369
370/* ioctl interface */ 370/* ioctl interface */
371static const struct file_operations gdth_fops = { 371static const struct file_operations gdth_fops = {
372 .ioctl = gdth_ioctl, 372 .unlocked_ioctl = gdth_unlocked_ioctl,
373 .open = gdth_open, 373 .open = gdth_open,
374 .release = gdth_close, 374 .release = gdth_close,
375}; 375};
@@ -4462,8 +4462,7 @@ free_fail:
4462 return rc; 4462 return rc;
4463} 4463}
4464 4464
4465static int gdth_ioctl(struct inode *inode, struct file *filep, 4465static int gdth_ioctl(struct file *filep, unsigned int cmd, unsigned long arg)
4466 unsigned int cmd, unsigned long arg)
4467{ 4466{
4468 gdth_ha_str *ha; 4467 gdth_ha_str *ha;
4469 Scsi_Cmnd *scp; 4468 Scsi_Cmnd *scp;
@@ -4611,6 +4610,17 @@ static int gdth_ioctl(struct inode *inode, struct file *filep,
4611 return 0; 4610 return 0;
4612} 4611}
4613 4612
4613static long gdth_unlocked_ioctl(struct file *file, unsigned int cmd,
4614 unsigned long arg)
4615{
4616 int ret;
4617
4618 lock_kernel();
4619 ret = gdth_ioctl(file, cmd, arg);
4620 unlock_kernel();
4621
4622 return ret;
4623}
4614 4624
4615/* flush routine */ 4625/* flush routine */
4616static void gdth_flush(gdth_ha_str *ha) 4626static void gdth_flush(gdth_ha_str *ha)
diff --git a/drivers/scsi/megaraid.c b/drivers/scsi/megaraid.c
index 4bf7edca9e69..0b6e3228610a 100644
--- a/drivers/scsi/megaraid.c
+++ b/drivers/scsi/megaraid.c
@@ -91,12 +91,15 @@ static struct proc_dir_entry *mega_proc_dir_entry;
91/* For controller re-ordering */ 91/* For controller re-ordering */
92static struct mega_hbas mega_hbas[MAX_CONTROLLERS]; 92static struct mega_hbas mega_hbas[MAX_CONTROLLERS];
93 93
94static long
95megadev_unlocked_ioctl(struct file *filep, unsigned int cmd, unsigned long arg);
96
94/* 97/*
95 * The File Operations structure for the serial/ioctl interface of the driver 98 * The File Operations structure for the serial/ioctl interface of the driver
96 */ 99 */
97static const struct file_operations megadev_fops = { 100static const struct file_operations megadev_fops = {
98 .owner = THIS_MODULE, 101 .owner = THIS_MODULE,
99 .ioctl = megadev_ioctl, 102 .unlocked_ioctl = megadev_unlocked_ioctl,
100 .open = megadev_open, 103 .open = megadev_open,
101}; 104};
102 105
@@ -3302,8 +3305,7 @@ megadev_open (struct inode *inode, struct file *filep)
3302 * controller. 3305 * controller.
3303 */ 3306 */
3304static int 3307static int
3305megadev_ioctl(struct inode *inode, struct file *filep, unsigned int cmd, 3308megadev_ioctl(struct file *filep, unsigned int cmd, unsigned long arg)
3306 unsigned long arg)
3307{ 3309{
3308 adapter_t *adapter; 3310 adapter_t *adapter;
3309 nitioctl_t uioc; 3311 nitioctl_t uioc;
@@ -3694,6 +3696,18 @@ freemem_and_return:
3694 return 0; 3696 return 0;
3695} 3697}
3696 3698
3699static long
3700megadev_unlocked_ioctl(struct file *filep, unsigned int cmd, unsigned long arg)
3701{
3702 int ret;
3703
3704 lock_kernel();
3705 ret = megadev_ioctl(filep, cmd, arg);
3706 unlock_kernel();
3707
3708 return ret;
3709}
3710
3697/** 3711/**
3698 * mega_m_to_n() 3712 * mega_m_to_n()
3699 * @arg - user address 3713 * @arg - user address
diff --git a/drivers/scsi/megaraid.h b/drivers/scsi/megaraid.h
index d310f49d077e..2b4a048cadf1 100644
--- a/drivers/scsi/megaraid.h
+++ b/drivers/scsi/megaraid.h
@@ -1013,8 +1013,7 @@ static void mega_8_to_40ld (mraid_inquiry *inquiry,
1013 mega_inquiry3 *enquiry3, mega_product_info *); 1013 mega_inquiry3 *enquiry3, mega_product_info *);
1014 1014
1015static int megadev_open (struct inode *, struct file *); 1015static int megadev_open (struct inode *, struct file *);
1016static int megadev_ioctl (struct inode *, struct file *, unsigned int, 1016static int megadev_ioctl (struct file *, unsigned int, unsigned long);
1017 unsigned long);
1018static int mega_m_to_n(void __user *, nitioctl_t *); 1017static int mega_m_to_n(void __user *, nitioctl_t *);
1019static int mega_n_to_m(void __user *, megacmd_t *); 1018static int mega_n_to_m(void __user *, megacmd_t *);
1020 1019
diff --git a/drivers/scsi/megaraid/megaraid_mm.c b/drivers/scsi/megaraid/megaraid_mm.c
index 36e0b7d05c1d..41f82f76d884 100644
--- a/drivers/scsi/megaraid/megaraid_mm.c
+++ b/drivers/scsi/megaraid/megaraid_mm.c
@@ -22,7 +22,7 @@
22 22
23// Entry points for char node driver 23// Entry points for char node driver
24static int mraid_mm_open(struct inode *, struct file *); 24static int mraid_mm_open(struct inode *, struct file *);
25static int mraid_mm_ioctl(struct inode *, struct file *, uint, unsigned long); 25static long mraid_mm_unlocked_ioctl(struct file *, uint, unsigned long);
26 26
27 27
28// routines to convert to and from the old the format 28// routines to convert to and from the old the format
@@ -70,7 +70,7 @@ static wait_queue_head_t wait_q;
70 70
71static const struct file_operations lsi_fops = { 71static const struct file_operations lsi_fops = {
72 .open = mraid_mm_open, 72 .open = mraid_mm_open,
73 .ioctl = mraid_mm_ioctl, 73 .unlocked_ioctl = mraid_mm_unlocked_ioctl,
74#ifdef CONFIG_COMPAT 74#ifdef CONFIG_COMPAT
75 .compat_ioctl = mraid_mm_compat_ioctl, 75 .compat_ioctl = mraid_mm_compat_ioctl,
76#endif 76#endif
@@ -110,8 +110,7 @@ mraid_mm_open(struct inode *inode, struct file *filep)
110 * @arg : user ioctl packet 110 * @arg : user ioctl packet
111 */ 111 */
112static int 112static int
113mraid_mm_ioctl(struct inode *inode, struct file *filep, unsigned int cmd, 113mraid_mm_ioctl(struct file *filep, unsigned int cmd, unsigned long arg)
114 unsigned long arg)
115{ 114{
116 uioc_t *kioc; 115 uioc_t *kioc;
117 char signature[EXT_IOCTL_SIGN_SZ] = {0}; 116 char signature[EXT_IOCTL_SIGN_SZ] = {0};
@@ -218,6 +217,19 @@ mraid_mm_ioctl(struct inode *inode, struct file *filep, unsigned int cmd,
218 return rval; 217 return rval;
219} 218}
220 219
220static long
221mraid_mm_unlocked_ioctl(struct file *filep, unsigned int cmd,
222 unsigned long arg)
223{
224 int err;
225
226 /* inconsistant: mraid_mm_compat_ioctl doesn't take the BKL */
227 lock_kernel();
228 err = mraid_mm_ioctl(filep, cmd, arg);
229 unlock_kernel();
230
231 return err;
232}
221 233
222/** 234/**
223 * mraid_mm_get_adapter - Returns corresponding adapters for the mimd packet 235 * mraid_mm_get_adapter - Returns corresponding adapters for the mimd packet
@@ -1225,7 +1237,7 @@ mraid_mm_compat_ioctl(struct file *filep, unsigned int cmd,
1225{ 1237{
1226 int err; 1238 int err;
1227 1239
1228 err = mraid_mm_ioctl(NULL, filep, cmd, arg); 1240 err = mraid_mm_ioctl(filep, cmd, arg);
1229 1241
1230 return err; 1242 return err;
1231} 1243}
diff --git a/drivers/scsi/osst.c b/drivers/scsi/osst.c
index b219118f8bd6..8dbf1c3afb7b 100644
--- a/drivers/scsi/osst.c
+++ b/drivers/scsi/osst.c
@@ -4932,7 +4932,7 @@ static int os_scsi_tape_close(struct inode * inode, struct file * filp)
4932 4932
4933 4933
4934/* The ioctl command */ 4934/* The ioctl command */
4935static int osst_ioctl(struct inode * inode,struct file * file, 4935static long osst_ioctl(struct file * file,
4936 unsigned int cmd_in, unsigned long arg) 4936 unsigned int cmd_in, unsigned long arg)
4937{ 4937{
4938 int i, cmd_nr, cmd_type, blk, retval = 0; 4938 int i, cmd_nr, cmd_type, blk, retval = 0;
@@ -4943,8 +4943,11 @@ static int osst_ioctl(struct inode * inode,struct file * file,
4943 char * name = tape_name(STp); 4943 char * name = tape_name(STp);
4944 void __user * p = (void __user *)arg; 4944 void __user * p = (void __user *)arg;
4945 4945
4946 if (mutex_lock_interruptible(&STp->lock)) 4946 lock_kernel();
4947 if (mutex_lock_interruptible(&STp->lock)) {
4948 unlock_kernel();
4947 return -ERESTARTSYS; 4949 return -ERESTARTSYS;
4950 }
4948 4951
4949#if DEBUG 4952#if DEBUG
4950 if (debugging && !STp->in_use) { 4953 if (debugging && !STp->in_use) {
@@ -5256,12 +5259,15 @@ static int osst_ioctl(struct inode * inode,struct file * file,
5256 5259
5257 mutex_unlock(&STp->lock); 5260 mutex_unlock(&STp->lock);
5258 5261
5259 return scsi_ioctl(STp->device, cmd_in, p); 5262 retval = scsi_ioctl(STp->device, cmd_in, p);
5263 unlock_kernel();
5264 return retval;
5260 5265
5261out: 5266out:
5262 if (SRpnt) osst_release_request(SRpnt); 5267 if (SRpnt) osst_release_request(SRpnt);
5263 5268
5264 mutex_unlock(&STp->lock); 5269 mutex_unlock(&STp->lock);
5270 unlock_kernel();
5265 5271
5266 return retval; 5272 return retval;
5267} 5273}
@@ -5613,7 +5619,7 @@ static const struct file_operations osst_fops = {
5613 .owner = THIS_MODULE, 5619 .owner = THIS_MODULE,
5614 .read = osst_read, 5620 .read = osst_read,
5615 .write = osst_write, 5621 .write = osst_write,
5616 .ioctl = osst_ioctl, 5622 .unlocked_ioctl = osst_ioctl,
5617#ifdef CONFIG_COMPAT 5623#ifdef CONFIG_COMPAT
5618 .compat_ioctl = osst_compat_ioctl, 5624 .compat_ioctl = osst_compat_ioctl,
5619#endif 5625#endif
diff --git a/drivers/scsi/sg.c b/drivers/scsi/sg.c
index dee1c96288d4..ef752b248c4d 100644
--- a/drivers/scsi/sg.c
+++ b/drivers/scsi/sg.c
@@ -758,8 +758,7 @@ sg_common_write(Sg_fd * sfp, Sg_request * srp,
758} 758}
759 759
760static int 760static int
761sg_ioctl(struct inode *inode, struct file *filp, 761sg_ioctl(struct file *filp, unsigned int cmd_in, unsigned long arg)
762 unsigned int cmd_in, unsigned long arg)
763{ 762{
764 void __user *p = (void __user *)arg; 763 void __user *p = (void __user *)arg;
765 int __user *ip = p; 764 int __user *ip = p;
@@ -1078,6 +1077,18 @@ sg_ioctl(struct inode *inode, struct file *filp,
1078 } 1077 }
1079} 1078}
1080 1079
1080static long
1081sg_unlocked_ioctl(struct file *filp, unsigned int cmd_in, unsigned long arg)
1082{
1083 int ret;
1084
1085 lock_kernel();
1086 ret = sg_ioctl(filp, cmd_in, arg);
1087 unlock_kernel();
1088
1089 return ret;
1090}
1091
1081#ifdef CONFIG_COMPAT 1092#ifdef CONFIG_COMPAT
1082static long sg_compat_ioctl(struct file *filp, unsigned int cmd_in, unsigned long arg) 1093static long sg_compat_ioctl(struct file *filp, unsigned int cmd_in, unsigned long arg)
1083{ 1094{
@@ -1322,7 +1333,7 @@ static const struct file_operations sg_fops = {
1322 .read = sg_read, 1333 .read = sg_read,
1323 .write = sg_write, 1334 .write = sg_write,
1324 .poll = sg_poll, 1335 .poll = sg_poll,
1325 .ioctl = sg_ioctl, 1336 .unlocked_ioctl = sg_unlocked_ioctl,
1326#ifdef CONFIG_COMPAT 1337#ifdef CONFIG_COMPAT
1327 .compat_ioctl = sg_compat_ioctl, 1338 .compat_ioctl = sg_compat_ioctl,
1328#endif 1339#endif