drivers: Push down BKL into various drivers
Arnd Bergmann [Mon, 26 Apr 2010 22:24:05 +0000 (00:24 +0200)]
These are the last remaining device drivers using
the ->ioctl file operation in the drivers directory
(except from v4l drivers).

[fweisbec: drop i8k pushdown as it has been done from
procfs pushdown branch already]

Signed-off-by: Arnd Bergmann <arnd@arndb.de>
Signed-off-by: Frederic Weisbecker <fweisbec@gmail.com>

23 files changed:
drivers/char/apm-emulation.c
drivers/char/applicom.c
drivers/char/ds1620.c
drivers/char/dtlk.c
drivers/char/generic_nvram.c
drivers/char/genrtc.c
drivers/char/hpet.c
drivers/char/ipmi/ipmi_devintf.c
drivers/char/ipmi/ipmi_watchdog.c
drivers/char/nvram.c
drivers/char/nwflash.c
drivers/char/raw.c
drivers/hwmon/fschmd.c
drivers/hwmon/w83793.c
drivers/input/misc/hp_sdc_rtc.c
drivers/macintosh/nvram.c
drivers/macintosh/via-pmu.c
drivers/mtd/mtdchar.c
drivers/pcmcia/pcmcia_ioctl.c
drivers/rtc/rtc-m41t80.c
drivers/sbus/char/openprom.c
drivers/usb/mon/mon_bin.c
drivers/usb/mon/mon_stat.c

index 4f568cb..033e150 100644 (file)
@@ -265,8 +265,8 @@ static unsigned int apm_poll(struct file *fp, poll_table * wait)
  *   Only when everyone who has opened /dev/apm_bios with write permission
  *   has acknowledge does the actual suspend happen.
  */
-static int
-apm_ioctl(struct inode * inode, struct file *filp, u_int cmd, u_long arg)
+static long
+apm_ioctl(struct file *filp, u_int cmd, u_long arg)
 {
        struct apm_user *as = filp->private_data;
        int err = -EINVAL;
@@ -274,6 +274,7 @@ apm_ioctl(struct inode * inode, struct file *filp, u_int cmd, u_long arg)
        if (!as->suser || !as->writer)
                return -EPERM;
 
+       lock_kernel();
        switch (cmd) {
        case APM_IOC_SUSPEND:
                mutex_lock(&state_lock);
@@ -334,6 +335,7 @@ apm_ioctl(struct inode * inode, struct file *filp, u_int cmd, u_long arg)
                mutex_unlock(&state_lock);
                break;
        }
+       unlock_kernel();
 
        return err;
 }
@@ -397,7 +399,7 @@ static const struct file_operations apm_bios_fops = {
        .owner          = THIS_MODULE,
        .read           = apm_read,
        .poll           = apm_poll,
-       .ioctl          = apm_ioctl,
+       .unlocked_ioctl = apm_ioctl,
        .open           = apm_open,
        .release        = apm_release,
 };
index a7424bf..63313a3 100644 (file)
@@ -26,6 +26,7 @@
 #include <linux/sched.h>
 #include <linux/slab.h>
 #include <linux/errno.h>
+#include <linux/smp_lock.h>
 #include <linux/miscdevice.h>
 #include <linux/pci.h>
 #include <linux/wait.h>
@@ -106,8 +107,7 @@ static unsigned int DeviceErrorCount;       /* number of device error     */
 
 static ssize_t ac_read (struct file *, char __user *, size_t, loff_t *);
 static ssize_t ac_write (struct file *, const char __user *, size_t, loff_t *);
-static int ac_ioctl(struct inode *, struct file *, unsigned int,
-                   unsigned long);
+static long ac_ioctl(struct file *, unsigned int, unsigned long);
 static irqreturn_t ac_interrupt(int, void *);
 
 static const struct file_operations ac_fops = {
@@ -115,7 +115,7 @@ static const struct file_operations ac_fops = {
        .llseek = no_llseek,
        .read = ac_read,
        .write = ac_write,
-       .ioctl = ac_ioctl,
+       .unlocked_ioctl = ac_ioctl,
 };
 
 static struct miscdevice ac_miscdev = {
@@ -689,7 +689,7 @@ static irqreturn_t ac_interrupt(int vec, void *dev_instance)
 
 
 
-static int ac_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg)
+static long ac_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
      
 {                              /* @ ADG ou ATO selon le cas */
        int i;
@@ -711,7 +711,8 @@ static int ac_ioctl(struct inode *inode, struct file *file, unsigned int cmd, un
                kfree(adgl);
                return -EFAULT;
        }
-       
+
+       lock_kernel();  
        IndexCard = adgl->num_card-1;
         
        if(cmd != 6 && ((IndexCard >= MAX_BOARD) || !apbs[IndexCard].RamIO)) {
@@ -721,6 +722,7 @@ static int ac_ioctl(struct inode *inode, struct file *file, unsigned int cmd, un
                        warncount--;
                }
                kfree(adgl);
+               unlock_kernel();
                return -EINVAL;
        }
 
@@ -838,6 +840,7 @@ static int ac_ioctl(struct inode *inode, struct file *file, unsigned int cmd, un
        }
        Dummy = readb(apbs[IndexCard].RamIO + VERS);
        kfree(adgl);
+       unlock_kernel();
        return 0;
 }
 
index 61f0146..dbee868 100644 (file)
@@ -232,7 +232,7 @@ ds1620_read(struct file *file, char __user *buf, size_t count, loff_t *ptr)
 }
 
 static int
-ds1620_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg)
+ds1620_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
 {
        struct therm therm;
        union {
@@ -316,6 +316,18 @@ ds1620_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned
        return 0;
 }
 
+static long
+ds1620_unlocked_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
+{
+       int ret;
+
+       lock_kernel();
+       ret = ds1620_ioctl(file, cmd, arg);
+       unlock_kernel();
+
+       return ret;
+}
+
 #ifdef THERM_USE_PROC
 static int
 proc_therm_ds1620_read(char *buf, char **start, off_t offset,
@@ -344,7 +356,7 @@ static const struct file_operations ds1620_fops = {
        .owner          = THIS_MODULE,
        .open           = ds1620_open,
        .read           = ds1620_read,
-       .ioctl          = ds1620_ioctl,
+       .unlocked_ioctl = ds1620_unlocked_ioctl,
 };
 
 static struct miscdevice ds1620_miscdev = {
index 045c930..e3859d4 100644 (file)
@@ -93,8 +93,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 =
 {
@@ -102,7 +102,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,
 };
@@ -263,10 +263,9 @@ 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;
@@ -276,7 +275,9 @@ 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;
index fda4181..82b5a88 100644 (file)
@@ -19,6 +19,7 @@
 #include <linux/miscdevice.h>
 #include <linux/fcntl.h>
 #include <linux/init.h>
+#include <linux/smp_lock.h>
 #include <asm/uaccess.h>
 #include <asm/nvram.h>
 #ifdef CONFIG_PPC_PMAC
@@ -84,8 +85,7 @@ static ssize_t write_nvram(struct file *file, const char __user *buf,
        return p - buf;
 }
 
-static int nvram_ioctl(struct inode *inode, struct file *file,
-       unsigned int cmd, unsigned long arg)
+static int nvram_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
 {
        switch(cmd) {
 #ifdef CONFIG_PPC_PMAC
@@ -116,12 +116,23 @@ static int nvram_ioctl(struct inode *inode, struct file *file,
        return 0;
 }
 
+static long nvram_unlocked_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
+{
+       int ret;
+
+       lock_kernel();
+       ret = nvram_ioctl(file, cmd, arg);
+       unlock_kernel();
+
+       return ret;
+}
+
 const struct file_operations nvram_fops = {
        .owner          = THIS_MODULE,
        .llseek         = nvram_llseek,
        .read           = read_nvram,
        .write          = write_nvram,
-       .ioctl          = nvram_ioctl,
+       .unlocked_ioctl = nvram_unlocked_ioctl,
 };
 
 static struct miscdevice nvram_dev = {
index 31e7c91..b6c2cc1 100644 (file)
@@ -262,7 +262,7 @@ static inline int gen_set_rtc_irq_bit(unsigned char bit)
 #endif
 }
 
-static int gen_rtc_ioctl(struct inode *inode, struct file *file,
+static int gen_rtc_ioctl(struct file *file,
                         unsigned int cmd, unsigned long arg)
 {
        struct rtc_time wtime;
@@ -332,6 +332,18 @@ static int gen_rtc_ioctl(struct inode *inode, struct file *file,
        return -EINVAL;
 }
 
+static long gen_rtc_unlocked_ioctl(struct file *file, unsigned int cmd,
+                                  unsigned long arg)
+{
+       int ret;
+
+       lock_kernel();
+       ret = gen_rtc_ioctl(file, cmd, arg);
+       unlock_kernel();
+
+       return ret;
+}
+
 /*
  *     We enforce only one user at a time here with the open/close.
  *     Also clear the previous interrupt data on an open, and clean
@@ -482,7 +494,7 @@ static const struct file_operations gen_rtc_fops = {
        .read           = gen_rtc_read,
        .poll           = gen_rtc_poll,
 #endif
-       .ioctl          = gen_rtc_ioctl,
+       .unlocked_ioctl = gen_rtc_unlocked_ioctl,
        .open           = gen_rtc_open,
        .release        = gen_rtc_release,
 };
index 9ded667..a0a1829 100644 (file)
@@ -431,14 +431,18 @@ static int hpet_release(struct inode *inode, struct file *file)
 
 static int hpet_ioctl_common(struct hpet_dev *, int, unsigned long, int);
 
-static int
-hpet_ioctl(struct inode *inode, struct file *file, unsigned int cmd,
-          unsigned long arg)
+static long hpet_ioctl(struct file *file, unsigned int cmd,
+                       unsigned long arg)
 {
        struct hpet_dev *devp;
+       int ret;
 
        devp = file->private_data;
-       return hpet_ioctl_common(devp, cmd, arg, 0);
+       lock_kernel();
+       ret = hpet_ioctl_common(devp, cmd, arg, 0);
+       unlock_kernel();
+
+       return ret;
 }
 
 static int hpet_ioctl_ieon(struct hpet_dev *devp)
@@ -654,7 +658,7 @@ static const struct file_operations hpet_fops = {
        .llseek = no_llseek,
        .read = hpet_read,
        .poll = hpet_poll,
-       .ioctl = hpet_ioctl,
+       .unlocked_ioctl = hpet_ioctl,
        .open = hpet_open,
        .release = hpet_release,
        .fasync = hpet_fasync,
index 65545de..d8ec92a 100644 (file)
@@ -228,8 +228,7 @@ static int handle_send_req(ipmi_user_t     user,
        return rv;
 }
 
-static int ipmi_ioctl(struct inode  *inode,
-                     struct file   *file,
+static int ipmi_ioctl(struct file   *file,
                      unsigned int  cmd,
                      unsigned long data)
 {
@@ -630,6 +629,23 @@ static int ipmi_ioctl(struct inode  *inode,
        return rv;
 }
 
+/*
+ * Note: it doesn't make sense to take the BKL here but
+ *       not in compat_ipmi_ioctl. -arnd
+ */
+static long ipmi_unlocked_ioctl(struct file   *file,
+                               unsigned int  cmd,
+                               unsigned long data)
+{
+       int ret;
+
+       lock_kernel();
+       ret = ipmi_ioctl(file, cmd, data);
+       unlock_kernel();
+
+       return ret;
+}
+
 #ifdef CONFIG_COMPAT
 
 /*
@@ -802,7 +818,7 @@ static long compat_ipmi_ioctl(struct file *filep, unsigned int cmd,
                if (copy_to_user(precv64, &recv64, sizeof(recv64)))
                        return -EFAULT;
 
-               rc = ipmi_ioctl(filep->f_path.dentry->d_inode, filep,
+               rc = ipmi_ioctl(filep,
                                ((cmd == COMPAT_IPMICTL_RECEIVE_MSG)
                                 ? IPMICTL_RECEIVE_MSG
                                 : IPMICTL_RECEIVE_MSG_TRUNC),
@@ -819,14 +835,14 @@ static long compat_ipmi_ioctl(struct file *filep, unsigned int cmd,
                return rc;
        }
        default:
-               return ipmi_ioctl(filep->f_path.dentry->d_inode, filep, cmd, arg);
+               return ipmi_ioctl(filep, cmd, arg);
        }
 }
 #endif
 
 static const struct file_operations ipmi_fops = {
        .owner          = THIS_MODULE,
-       .ioctl          = ipmi_ioctl,
+       .unlocked_ioctl = ipmi_unlocked_ioctl,
 #ifdef CONFIG_COMPAT
        .compat_ioctl   = compat_ipmi_ioctl,
 #endif
index a4d57e3..82bcdb2 100644 (file)
@@ -659,7 +659,7 @@ static struct watchdog_info ident = {
        .identity       = "IPMI"
 };
 
-static int ipmi_ioctl(struct inode *inode, struct file *file,
+static int ipmi_ioctl(struct file *file,
                      unsigned int cmd, unsigned long arg)
 {
        void __user *argp = (void __user *)arg;
@@ -730,6 +730,19 @@ static int ipmi_ioctl(struct inode *inode, struct file *file,
        }
 }
 
+static long ipmi_unlocked_ioctl(struct file *file,
+                               unsigned int cmd,
+                               unsigned long arg)
+{
+       int ret;
+
+       lock_kernel();
+       ret = ipmi_ioctl(file, cmd, arg);
+       unlock_kernel();
+
+       return ret;
+}
+
 static ssize_t ipmi_write(struct file *file,
                          const char  __user *buf,
                          size_t      len,
@@ -880,7 +893,7 @@ static const struct file_operations ipmi_wdog_fops = {
        .read    = ipmi_read,
        .poll    = ipmi_poll,
        .write   = ipmi_write,
-       .ioctl   = ipmi_ioctl,
+       .unlocked_ioctl = ipmi_unlocked_ioctl,
        .open    = ipmi_open,
        .release = ipmi_close,
        .fasync  = ipmi_fasync,
index 47e8f7b..66d2917 100644 (file)
@@ -296,8 +296,8 @@ checksum_err:
        return -EIO;
 }
 
-static int nvram_ioctl(struct inode *inode, struct file *file,
-                                       unsigned int cmd, unsigned long arg)
+static long nvram_ioctl(struct file *file, unsigned int cmd,
+                       unsigned long arg)
 {
        int i;
 
@@ -308,6 +308,7 @@ static int nvram_ioctl(struct inode *inode, struct file *file,
                if (!capable(CAP_SYS_ADMIN))
                        return -EACCES;
 
+               lock_kernel();
                spin_lock_irq(&rtc_lock);
 
                for (i = 0; i < NVRAM_BYTES; ++i)
@@ -315,6 +316,7 @@ static int nvram_ioctl(struct inode *inode, struct file *file,
                __nvram_set_checksum();
 
                spin_unlock_irq(&rtc_lock);
+               unlock_kernel();
                return 0;
 
        case NVRAM_SETCKS:
@@ -323,9 +325,11 @@ static int nvram_ioctl(struct inode *inode, struct file *file,
                if (!capable(CAP_SYS_ADMIN))
                        return -EACCES;
 
+               lock_kernel();
                spin_lock_irq(&rtc_lock);
                __nvram_set_checksum();
                spin_unlock_irq(&rtc_lock);
+               unlock_kernel();
                return 0;
 
        default:
@@ -422,7 +426,7 @@ static const struct file_operations nvram_fops = {
        .llseek         = nvram_llseek,
        .read           = nvram_read,
        .write          = nvram_write,
-       .ioctl          = nvram_ioctl,
+       .unlocked_ioctl = nvram_ioctl,
        .open           = nvram_open,
        .release        = nvram_release,
 };
index f808109..043a1c7 100644 (file)
@@ -94,8 +94,9 @@ static int get_flash_id(void)
        return c2;
 }
 
-static int flash_ioctl(struct inode *inodep, struct file *filep, unsigned int cmd, unsigned long arg)
+static long flash_ioctl(struct file *filep, unsigned int cmd, unsigned long arg)
 {
+       lock_kernel();
        switch (cmd) {
        case CMD_WRITE_DISABLE:
                gbWriteBase64Enable = 0;
@@ -113,8 +114,10 @@ static int flash_ioctl(struct inode *inodep, struct file *filep, unsigned int cm
        default:
                gbWriteBase64Enable = 0;
                gbWriteEnable = 0;
+               unlock_kernel();
                return -EINVAL;
        }
+       unlock_kernel();
        return 0;
 }
 
@@ -631,7 +634,7 @@ static const struct file_operations flash_fops =
        .llseek         = flash_llseek,
        .read           = flash_read,
        .write          = flash_write,
-       .ioctl          = flash_ioctl,
+       .unlocked_ioctl = flash_ioctl,
 };
 
 static struct miscdevice flash_miscdev =
index 8756ab0..b38942f 100644 (file)
@@ -121,13 +121,17 @@ static int raw_release(struct inode *inode, struct file *filp)
 /*
  * Forward ioctls to the underlying block device.
  */
-static int
-raw_ioctl(struct inode *inode, struct file *filp,
-                 unsigned int command, unsigned long arg)
+static long
+raw_ioctl(struct file *filp, unsigned int command, unsigned long arg)
 {
        struct block_device *bdev = filp->private_data;
+       int ret;
+
+       lock_kernel();
+       ret = blkdev_ioctl(bdev, 0, command, arg);
+       unlock_kernel();
 
-       return blkdev_ioctl(bdev, 0, command, arg);
+       return ret;
 }
 
 static void bind_device(struct raw_config_request *rq)
@@ -141,13 +145,14 @@ static void bind_device(struct raw_config_request *rq)
  * Deal with ioctls against the raw-device control interface, to bind
  * and unbind other raw devices.
  */
-static int raw_ctl_ioctl(struct inode *inode, struct file *filp,
-                       unsigned int command, unsigned long arg)
+static long raw_ctl_ioctl(struct file *filp, unsigned int command,
+                         unsigned long arg)
 {
        struct raw_config_request rq;
        struct raw_device_data *rawdev;
        int err = 0;
 
+       lock_kernel();
        switch (command) {
        case RAW_SETBIND:
        case RAW_GETBIND:
@@ -240,25 +245,26 @@ static int raw_ctl_ioctl(struct inode *inode, struct file *filp,
                break;
        }
 out:
+       unlock_kernel();
        return err;
 }
 
 static const struct file_operations raw_fops = {
-       .read   =       do_sync_read,
-       .aio_read =     generic_file_aio_read,
-       .write  =       do_sync_write,
-       .aio_write =    blkdev_aio_write,
-       .fsync  =       blkdev_fsync,
-       .open   =       raw_open,
-       .release=       raw_release,
-       .ioctl  =       raw_ioctl,
-       .owner  =       THIS_MODULE,
+       .read           = do_sync_read,
+       .aio_read       = generic_file_aio_read,
+       .write          = do_sync_write,
+       .aio_write      = blkdev_aio_write,
+       .fsync          = blkdev_fsync,
+       .open           = raw_open,
+       .release        = raw_release,
+       .unlocked_ioctl = raw_ioctl,
+       .owner          = THIS_MODULE,
 };
 
 static const struct file_operations raw_ctl_fops = {
-       .ioctl  =       raw_ctl_ioctl,
-       .open   =       raw_open,
-       .owner  =       THIS_MODULE,
+       .unlocked_ioctl = raw_ctl_ioctl,
+       .open           = raw_open,
+       .owner          = THIS_MODULE,
 };
 
 static struct cdev raw_cdev;
index 0627f7a..b7ca2a9 100644 (file)
@@ -38,6 +38,7 @@
 #include <linux/i2c.h>
 #include <linux/hwmon.h>
 #include <linux/hwmon-sysfs.h>
+#include <linux/smp_lock.h>
 #include <linux/err.h>
 #include <linux/mutex.h>
 #include <linux/sysfs.h>
@@ -847,8 +848,7 @@ static ssize_t watchdog_write(struct file *filp, const char __user *buf,
        return count;
 }
 
-static int watchdog_ioctl(struct inode *inode, struct file *filp,
-       unsigned int cmd, unsigned long arg)
+static long watchdog_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
 {
        static struct watchdog_info ident = {
                .options = WDIOF_KEEPALIVEPING | WDIOF_SETTIMEOUT |
@@ -858,6 +858,7 @@ static int watchdog_ioctl(struct inode *inode, struct file *filp,
        int i, ret = 0;
        struct fschmd_data *data = filp->private_data;
 
+       lock_kernel();
        switch (cmd) {
        case WDIOC_GETSUPPORT:
                ident.firmware_version = data->revision;
@@ -914,7 +915,7 @@ static int watchdog_ioctl(struct inode *inode, struct file *filp,
        default:
                ret = -ENOTTY;
        }
-
+       unlock_kernel();
        return ret;
 }
 
@@ -924,7 +925,7 @@ static const struct file_operations watchdog_fops = {
        .open = watchdog_open,
        .release = watchdog_release,
        .write = watchdog_write,
-       .ioctl = watchdog_ioctl,
+       .unlocked_ioctl = watchdog_ioctl,
 };
 
 
index 612807d..697202e 100644 (file)
@@ -35,6 +35,7 @@
 #include <linux/slab.h>
 #include <linux/i2c.h>
 #include <linux/hwmon.h>
+#include <linux/smp_lock.h>
 #include <linux/hwmon-vid.h>
 #include <linux/hwmon-sysfs.h>
 #include <linux/err.h>
@@ -1319,8 +1320,8 @@ static ssize_t watchdog_write(struct file *filp, const char __user *buf,
        return count;
 }
 
-static int watchdog_ioctl(struct inode *inode, struct file *filp,
-                         unsigned int cmd, unsigned long arg)
+static long watchdog_ioctl(struct file *filp, unsigned int cmd,
+                          unsigned long arg)
 {
        static struct watchdog_info ident = {
                .options = WDIOF_KEEPALIVEPING |
@@ -1332,6 +1333,7 @@ static int watchdog_ioctl(struct inode *inode, struct file *filp,
        int val, ret = 0;
        struct w83793_data *data = filp->private_data;
 
+       lock_kernel();
        switch (cmd) {
        case WDIOC_GETSUPPORT:
                if (!nowayout)
@@ -1385,7 +1387,7 @@ static int watchdog_ioctl(struct inode *inode, struct file *filp,
        default:
                ret = -ENOTTY;
        }
-
+       unlock_kernel();
        return ret;
 }
 
@@ -1395,7 +1397,7 @@ static const struct file_operations watchdog_fops = {
        .open = watchdog_open,
        .release = watchdog_close,
        .write = watchdog_write,
-       .ioctl = watchdog_ioctl,
+       .unlocked_ioctl = watchdog_ioctl,
 };
 
 /*
index ad730e1..e00a1cc 100644 (file)
@@ -43,6 +43,7 @@
 #include <linux/proc_fs.h>
 #include <linux/poll.h>
 #include <linux/rtc.h>
+#include <linux/smp_lock.h>
 #include <linux/semaphore.h>
 
 MODULE_AUTHOR("Brian S. Julin <bri@calyx.com>");
@@ -64,8 +65,8 @@ static DECLARE_WAIT_QUEUE_HEAD(hp_sdc_rtc_wait);
 static ssize_t hp_sdc_rtc_read(struct file *file, char __user *buf,
                               size_t count, loff_t *ppos);
 
-static int hp_sdc_rtc_ioctl(struct inode *inode, struct file *file,
-                           unsigned int cmd, unsigned long arg);
+static long hp_sdc_rtc_unlocked_ioctl(struct file *file,
+                                     unsigned int cmd, unsigned long arg);
 
 static unsigned int hp_sdc_rtc_poll(struct file *file, poll_table *wait);
 
@@ -512,7 +513,7 @@ static int hp_sdc_rtc_read_proc(char *page, char **start, off_t off,
         return len;
 }
 
-static int hp_sdc_rtc_ioctl(struct inode *inode, struct file *file, 
+static int hp_sdc_rtc_ioctl(struct file *file, 
                            unsigned int cmd, unsigned long arg)
 {
 #if 1
@@ -659,14 +660,27 @@ static int hp_sdc_rtc_ioctl(struct inode *inode, struct file *file,
 #endif
 }
 
+static long hp_sdc_rtc_unlocked_ioctl(struct file *file,
+                                     unsigned int cmd, unsigned long arg)
+{
+       int ret;
+
+       lock_kernel();
+       ret = hp_sdc_rtc_ioctl(file, cmd, arg);
+       unlock_kernel();
+
+       return ret;
+}
+
+
 static const struct file_operations hp_sdc_rtc_fops = {
-        .owner =       THIS_MODULE,
-        .llseek =      no_llseek,
-        .read =                hp_sdc_rtc_read,
-        .poll =                hp_sdc_rtc_poll,
-        .ioctl =       hp_sdc_rtc_ioctl,
-        .open =                hp_sdc_rtc_open,
-        .fasync =      hp_sdc_rtc_fasync,
+        .owner =               THIS_MODULE,
+        .llseek =              no_llseek,
+        .read =                        hp_sdc_rtc_read,
+        .poll =                        hp_sdc_rtc_poll,
+        .unlocked_ioctl =      hp_sdc_rtc_ioctl,
+        .open =                        hp_sdc_rtc_open,
+        .fasync =              hp_sdc_rtc_fasync,
 };
 
 static struct miscdevice hp_sdc_rtc_dev = {
index c876349..a271c82 100644 (file)
@@ -100,7 +100,7 @@ const struct file_operations nvram_fops = {
        .llseek         = nvram_llseek,
        .read           = read_nvram,
        .write          = write_nvram,
-       .ioctl          = nvram_ioctl,
+       .unlocked_ioctl = nvram_ioctl,
 };
 
 static struct miscdevice nvram_dev = {
index 4276484..3d4fc0f 100644 (file)
@@ -2273,8 +2273,7 @@ static int register_pmu_pm_ops(void)
 device_initcall(register_pmu_pm_ops);
 #endif
 
-static int
-pmu_ioctl(struct inode * inode, struct file *filp,
+static int pmu_ioctl(struct file *filp,
                     u_int cmd, u_long arg)
 {
        __u32 __user *argp = (__u32 __user *)arg;
@@ -2337,11 +2336,23 @@ pmu_ioctl(struct inode * inode, struct file *filp,
        return error;
 }
 
+static long pmu_unlocked_ioctl(struct file *filp,
+                              u_int cmd, u_long arg)
+{
+       int ret;
+
+       lock_kernel();
+       ret = pmu_ioctl(filp, cmd, arg);
+       unlock_kernel();
+
+       return ret;
+}
+
 static const struct file_operations pmu_device_fops = {
        .read           = pmu_read,
        .write          = pmu_write,
        .poll           = pmu_fpoll,
-       .ioctl          = pmu_ioctl,
+       .unlocked_ioctl = pmu_unlocked_ioctl,
        .open           = pmu_open,
        .release        = pmu_release,
 };
index 5b081cb..6749c2f 100644 (file)
@@ -450,8 +450,7 @@ static int mtd_do_readoob(struct mtd_info *mtd, uint64_t start,
        return ret;
 }
 
-static int mtd_ioctl(struct inode *inode, struct file *file,
-                    u_int cmd, u_long arg)
+static int mtd_ioctl(struct file *file, u_int cmd, u_long arg)
 {
        struct mtd_file_info *mfi = file->private_data;
        struct mtd_info *mtd = mfi->mtd;
@@ -822,6 +821,17 @@ static int mtd_ioctl(struct inode *inode, struct file *file,
        return ret;
 } /* memory_ioctl */
 
+static long mtd_unlocked_ioctl(struct file *file, u_int cmd, u_long arg)
+{
+       int ret;
+
+       lock_kernel();
+       ret = mtd_ioctl(file, cmd, arg);
+       unlock_kernel();
+
+       return ret;
+}
+
 #ifdef CONFIG_COMPAT
 
 struct mtd_oob_buf32 {
@@ -836,7 +846,6 @@ struct mtd_oob_buf32 {
 static long mtd_compat_ioctl(struct file *file, unsigned int cmd,
        unsigned long arg)
 {
-       struct inode *inode = file->f_path.dentry->d_inode;
        struct mtd_file_info *mfi = file->private_data;
        struct mtd_info *mtd = mfi->mtd;
        void __user *argp = compat_ptr(arg);
@@ -874,7 +883,7 @@ static long mtd_compat_ioctl(struct file *file, unsigned int cmd,
                break;
        }
        default:
-               ret = mtd_ioctl(inode, file, cmd, (unsigned long)argp);
+               ret = mtd_ioctl(file, cmd, (unsigned long)argp);
        }
 
        unlock_kernel();
@@ -942,7 +951,7 @@ static const struct file_operations mtd_fops = {
        .llseek         = mtd_lseek,
        .read           = mtd_read,
        .write          = mtd_write,
-       .ioctl          = mtd_ioctl,
+       .unlocked_ioctl = mtd_unlocked_ioctl,
 #ifdef CONFIG_COMPAT
        .compat_ioctl   = mtd_compat_ioctl,
 #endif
index 7631faa..838bbf6 100644 (file)
@@ -818,8 +818,7 @@ static u_int ds_poll(struct file *file, poll_table *wait)
 
 /*====================================================================*/
 
-static int ds_ioctl(struct inode *inode, struct file *file,
-                   u_int cmd, u_long arg)
+static int ds_ioctl(struct file *file, u_int cmd, u_long arg)
 {
     struct pcmcia_socket *s;
     void __user *uarg = (char __user *)arg;
@@ -1026,13 +1025,25 @@ free_out:
     return err;
 } /* ds_ioctl */
 
+static long ds_unlocked_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
+{
+       int ret;
+
+       lock_kernel();
+       ret = ds_ioctl(file, cmd, arg);
+       unlock_kernel();
+
+       return ret;
+}
+
+
 /*====================================================================*/
 
 static const struct file_operations ds_fops = {
        .owner          = THIS_MODULE,
        .open           = ds_open,
        .release        = ds_release,
-       .ioctl          = ds_ioctl,
+       .unlocked_ioctl = ds_unlocked_ioctl,
        .read           = ds_read,
        .write          = ds_write,
        .poll           = ds_poll,
index 60fe266..038095d 100644 (file)
@@ -623,7 +623,7 @@ static ssize_t wdt_read(struct file *file, char __user *buf,
  *     according to their available features. We only actually usefully support
  *     querying capabilities and current status.
  */
-static int wdt_ioctl(struct inode *inode, struct file *file, unsigned int cmd,
+static int wdt_ioctl(struct file *file, unsigned int cmd,
                     unsigned long arg)
 {
        int new_margin, rv;
@@ -676,6 +676,18 @@ static int wdt_ioctl(struct inode *inode, struct file *file, unsigned int cmd,
        return -ENOTTY;
 }
 
+static long wdt_unlocked_ioctl(struct file *file, unsigned int cmd,
+                              unsigned long arg)
+{
+       int ret;
+
+       lock_kernel();
+       ret = wdt_ioctl(file, cmd, arg);
+       unlock_kernel();
+
+       return ret;
+}
+
 /**
  *     wdt_open:
  *     @inode: inode of device
@@ -736,7 +748,7 @@ static int wdt_notify_sys(struct notifier_block *this, unsigned long code,
 static const struct file_operations wdt_fops = {
        .owner  = THIS_MODULE,
        .read   = wdt_read,
-       .ioctl  = wdt_ioctl,
+       .unlocked_ioctl = wdt_unlocked_ioctl,
        .write  = wdt_write,
        .open   = wdt_open,
        .release = wdt_release,
index fc2f676..d53e62a 100644 (file)
@@ -298,9 +298,9 @@ static int opromgetbootargs(void __user *argp, struct openpromio *op, int bufsiz
 /*
  *     SunOS and Solaris /dev/openprom ioctl calls.
  */
-static int openprom_sunos_ioctl(struct inode * inode, struct file * file,
-                               unsigned int cmd, unsigned long arg,
-                               struct device_node *dp)
+static long openprom_sunos_ioctl(struct file * file,
+                                unsigned int cmd, unsigned long arg,
+                                struct device_node *dp)
 {
        DATA *data = file->private_data;
        struct openpromio *opp = NULL;
@@ -316,6 +316,8 @@ static int openprom_sunos_ioctl(struct inode * inode, struct file * file,
        if (bufsize < 0)
                return bufsize;
 
+       lock_kernel();
+
        switch (cmd) {
        case OPROMGETOPT:
        case OPROMGETPROP:
@@ -365,6 +367,8 @@ static int openprom_sunos_ioctl(struct inode * inode, struct file * file,
        }
 
        kfree(opp);
+       unlock_kernel();
+
        return error;
 }
 
@@ -547,13 +551,14 @@ static int opiocgetnext(unsigned int cmd, void __user *argp)
        return 0;
 }
 
-static int openprom_bsd_ioctl(struct inode * inode, struct file * file,
+static int openprom_bsd_ioctl(struct file * file,
                              unsigned int cmd, unsigned long arg)
 {
        DATA *data = (DATA *) file->private_data;
        void __user *argp = (void __user *)arg;
        int err;
 
+       lock_kernel();
        switch (cmd) {
        case OPIOCGET:
                err = opiocget(argp, data);
@@ -570,10 +575,10 @@ static int openprom_bsd_ioctl(struct inode * inode, struct file * file,
        case OPIOCGETOPTNODE:
                BUILD_BUG_ON(sizeof(phandle) != sizeof(int));
 
+               err = 0;
                if (copy_to_user(argp, &options_node->phandle, sizeof(phandle)))
-                       return -EFAULT;
-
-               return 0;
+                       err = -EFAULT;
+               break;
 
        case OPIOCGETNEXT:
        case OPIOCGETCHILD:
@@ -581,9 +586,10 @@ static int openprom_bsd_ioctl(struct inode * inode, struct file * file,
                break;
 
        default:
-               return -EINVAL;
-
+               err = -EINVAL;
+               break;
        };
+       unlock_kernel();
 
        return err;
 }
@@ -592,8 +598,8 @@ static int openprom_bsd_ioctl(struct inode * inode, struct file * file,
 /*
  *     Handoff control to the correct ioctl handler.
  */
-static int openprom_ioctl(struct inode * inode, struct file * file,
-                         unsigned int cmd, unsigned long arg)
+static long openprom_ioctl(struct file * file,
+                          unsigned int cmd, unsigned long arg)
 {
        DATA *data = (DATA *) file->private_data;
 
@@ -602,14 +608,14 @@ static int openprom_ioctl(struct inode * inode, struct file * file,
        case OPROMNXTOPT:
                if ((file->f_mode & FMODE_READ) == 0)
                        return -EPERM;
-               return openprom_sunos_ioctl(inode, file, cmd, arg,
+               return openprom_sunos_ioctl(file, cmd, arg,
                                            options_node);
 
        case OPROMSETOPT:
        case OPROMSETOPT2:
                if ((file->f_mode & FMODE_WRITE) == 0)
                        return -EPERM;
-               return openprom_sunos_ioctl(inode, file, cmd, arg,
+               return openprom_sunos_ioctl(file, cmd, arg,
                                            options_node);
 
        case OPROMNEXT:
@@ -618,7 +624,7 @@ static int openprom_ioctl(struct inode * inode, struct file * file,
        case OPROMNXTPROP:
                if ((file->f_mode & FMODE_READ) == 0)
                        return -EPERM;
-               return openprom_sunos_ioctl(inode, file, cmd, arg,
+               return openprom_sunos_ioctl(file, cmd, arg,
                                            data->current_node);
 
        case OPROMU2P:
@@ -630,7 +636,7 @@ static int openprom_ioctl(struct inode * inode, struct file * file,
        case OPROMPATH2NODE:
                if ((file->f_mode & FMODE_READ) == 0)
                        return -EPERM;
-               return openprom_sunos_ioctl(inode, file, cmd, arg, NULL);
+               return openprom_sunos_ioctl(file, cmd, arg, NULL);
 
        case OPIOCGET:
        case OPIOCNEXTPROP:
@@ -639,12 +645,12 @@ static int openprom_ioctl(struct inode * inode, struct file * file,
        case OPIOCGETCHILD:
                if ((file->f_mode & FMODE_READ) == 0)
                        return -EBADF;
-               return openprom_bsd_ioctl(inode,file,cmd,arg);
+               return openprom_bsd_ioctl(file,cmd,arg);
 
        case OPIOCSET:
                if ((file->f_mode & FMODE_WRITE) == 0)
                        return -EBADF;
-               return openprom_bsd_ioctl(inode,file,cmd,arg);
+               return openprom_bsd_ioctl(file,cmd,arg);
 
        default:
                return -EINVAL;
@@ -676,7 +682,7 @@ static long openprom_compat_ioctl(struct file *file, unsigned int cmd,
        case OPROMSETCUR:
        case OPROMPCI2NODE:
        case OPROMPATH2NODE:
-               rval = openprom_ioctl(file->f_path.dentry->d_inode, file, cmd, arg);
+               rval = openprom_ioctl(file, cmd, arg);
                break;
        }
 
@@ -709,7 +715,7 @@ static int openprom_release(struct inode * inode, struct file * file)
 static const struct file_operations openprom_fops = {
        .owner =        THIS_MODULE,
        .llseek =       no_llseek,
-       .ioctl =        openprom_ioctl,
+       .unlocked_ioctl = openprom_ioctl,
        .compat_ioctl = openprom_compat_ioctl,
        .open =         openprom_open,
        .release =      openprom_release,
index ddf7f9a..5594772 100644 (file)
@@ -954,8 +954,7 @@ static int mon_bin_queued(struct mon_reader_bin *rp)
 
 /*
  */
-static int mon_bin_ioctl(struct inode *inode, struct file *file,
-    unsigned int cmd, unsigned long arg)
+static int mon_bin_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
 {
        struct mon_reader_bin *rp = file->private_data;
        // struct mon_bus* mbus = rp->r.m_bus;
@@ -1095,6 +1094,19 @@ static int mon_bin_ioctl(struct inode *inode, struct file *file,
        return ret;
 }
 
+static long mon_bin_unlocked_ioctl(struct file *file, unsigned int cmd,
+                                  unsigned long arg)
+{
+       int ret;
+
+       lock_kernel();
+       ret = mon_bin_ioctl(file, cmd, arg);
+       unlock_kernel();
+
+       return ret;
+}
+
+
 #ifdef CONFIG_COMPAT
 static long mon_bin_compat_ioctl(struct file *file,
     unsigned int cmd, unsigned long arg)
@@ -1148,14 +1160,13 @@ static long mon_bin_compat_ioctl(struct file *file,
                return 0;
 
        case MON_IOCG_STATS:
-               return mon_bin_ioctl(NULL, file, cmd,
-                                           (unsigned long) compat_ptr(arg));
+               return mon_bin_ioctl(file, cmd, (unsigned long) compat_ptr(arg));
 
        case MON_IOCQ_URB_LEN:
        case MON_IOCQ_RING_SIZE:
        case MON_IOCT_RING_SIZE:
        case MON_IOCH_MFLUSH:
-               return mon_bin_ioctl(NULL, file, cmd, arg);
+               return mon_bin_ioctl(file, cmd, arg);
 
        default:
                ;
@@ -1239,7 +1250,7 @@ static const struct file_operations mon_fops_binary = {
        .read =         mon_bin_read,
        /* .write =     mon_text_write, */
        .poll =         mon_bin_poll,
-       .ioctl =        mon_bin_ioctl,
+       .unlocked_ioctl = mon_bin_unlocked_ioctl,
 #ifdef CONFIG_COMPAT
        .compat_ioctl = mon_bin_compat_ioctl,
 #endif
index 1becdc3..8ec94f1 100644 (file)
@@ -11,6 +11,7 @@
 #include <linux/slab.h>
 #include <linux/usb.h>
 #include <linux/fs.h>
+#include <linux/smp_lock.h>
 #include <asm/uaccess.h>
 
 #include "usb_mon.h"
@@ -63,6 +64,6 @@ const struct file_operations mon_fops_stat = {
        .read =         mon_stat_read,
        /* .write =     mon_stat_write, */
        /* .poll =              mon_stat_poll, */
-       /* .ioctl =     mon_stat_ioctl, */
+       /* .unlocked_ioctl =    mon_stat_ioctl, */
        .release =      mon_stat_release,
 };