Merge branch 'config' of git://git.kernel.org/pub/scm/linux/kernel/git/arnd/bkl
authorLinus Torvalds <torvalds@linux-foundation.org>
Fri, 22 Oct 2010 17:43:11 +0000 (10:43 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Fri, 22 Oct 2010 17:43:11 +0000 (10:43 -0700)
* 'config' of git://git.kernel.org/pub/scm/linux/kernel/git/arnd/bkl:
  BKL: introduce CONFIG_BKL.
  dabusb: remove the BKL
  sunrpc: remove the big kernel lock
  init/main.c: remove BKL notations
  blktrace: remove the big kernel lock
  rtmutex-tester: make it build without BKL
  dvb-core: kill the big kernel lock
  dvb/bt8xx: kill the big kernel lock
  tlclk: remove big kernel lock
  fix rawctl compat ioctls breakage on amd64 and itanic
  uml: kill big kernel lock
  parisc: remove big kernel lock
  cris: autoconvert trivial BKL users
  alpha: kill big kernel lock
  isapnp: BKL removal
  s390/block: kill the big kernel lock
  hpet: kill BKL, add compat_ioctl

53 files changed:
arch/cris/arch-v10/drivers/ds1302.c
arch/cris/arch-v10/drivers/pcf8563.c
arch/cris/arch-v10/drivers/sync_serial.c
arch/cris/arch-v32/drivers/cryptocop.c
arch/cris/arch-v32/drivers/mach-a3/gpio.c
arch/cris/arch-v32/drivers/mach-fs/gpio.c
arch/cris/arch-v32/drivers/pcf8563.c
arch/cris/arch-v32/drivers/sync_serial.c
arch/parisc/kernel/perf.c
arch/um/drivers/harddog_kern.c
arch/um/drivers/hostaudio_kern.c
arch/um/drivers/ubd_kern.c
arch/um/kernel/exec.c
drivers/char/hpet.c
drivers/char/raw.c
drivers/char/tlclk.c
drivers/gpu/drm/Kconfig
drivers/media/Kconfig
drivers/media/dvb/bt8xx/dst_ca.c
drivers/media/dvb/dvb-core/dmxdev.c
drivers/media/dvb/dvb-core/dvb_ca_en50221.c
drivers/media/dvb/dvb-core/dvb_net.c
drivers/media/dvb/dvb-core/dvbdev.c
drivers/media/video/dabusb.c
drivers/net/appletalk/Kconfig
drivers/pnp/isapnp/proc.c
drivers/s390/block/dasd.c
drivers/s390/block/dasd_ioctl.c
drivers/s390/block/dcssblk.c
drivers/staging/cx25821/Kconfig
drivers/staging/easycap/Kconfig
drivers/staging/go7007/Kconfig
drivers/staging/usbip/Kconfig
fs/Kconfig
fs/adfs/Kconfig
fs/autofs/Kconfig
fs/compat_ioctl.c
fs/hpfs/Kconfig
fs/nfs/Kconfig
fs/nfsd/Kconfig
fs/smbfs/Kconfig
fs/udf/Kconfig
fs/ufs/Kconfig
include/linux/smp_lock.h
init/Kconfig
init/main.c
kernel/rtmutex-tester.c
kernel/trace/blktrace.c
lib/Kconfig.debug
net/ipx/Kconfig
net/sunrpc/cache.c
net/sunrpc/rpc_pipe.c
net/x25/Kconfig

index 8842756..4b92ad0 100644 (file)
@@ -19,7 +19,7 @@
 #include <linux/module.h>
 #include <linux/miscdevice.h>
 #include <linux/delay.h>
-#include <linux/smp_lock.h>
+#include <linux/mutex.h>
 #include <linux/bcd.h>
 #include <linux/capability.h>
 
@@ -34,6 +34,7 @@
 
 #define RTC_MAJOR_NR 121 /* local major, change later */
 
+static DEFINE_MUTEX(ds1302_mutex);
 static const char ds1302_name[] = "ds1302";
 
 /* The DS1302 might be connected to different bits on different products. 
@@ -357,9 +358,9 @@ static long rtc_unlocked_ioctl(struct file *file, unsigned int cmd, unsigned lon
 {
        int ret;
 
-       lock_kernel();
+       mutex_lock(&ds1302_mutex);
        ret = rtc_ioctl(file, cmd, arg);
-       unlock_kernel();
+       mutex_unlock(&ds1302_mutex);
 
        return ret;
 }
index 7dcb1f8..2f1dded 100644 (file)
@@ -27,7 +27,6 @@
 #include <linux/delay.h>
 #include <linux/bcd.h>
 #include <linux/mutex.h>
-#include <linux/smp_lock.h>
 
 #include <asm/uaccess.h>
 #include <asm/system.h>
@@ -49,6 +48,7 @@
 #define rtc_read(x) i2c_readreg(RTC_I2C_READ, x)
 #define rtc_write(x,y) i2c_writereg(RTC_I2C_WRITE, x, y)
 
+static DEFINE_MUTEX(pcf8563_mutex);
 static DEFINE_MUTEX(rtc_lock); /* Protect state etc */
 
 static const unsigned char days_in_month[] =
@@ -343,9 +343,9 @@ static long pcf8563_unlocked_ioctl(struct file *filp, unsigned int cmd, unsigned
 {
        int ret;
 
-       lock_kernel();
+       mutex_lock(&pcf8563_mutex);
        return pcf8563_ioctl(filp, cmd, arg);
-       unlock_kernel();
+       mutex_unlock(&pcf8563_mutex);
 
        return ret;
 }
index ee2dd43..3d9fa07 100644 (file)
@@ -20,7 +20,7 @@
 #include <linux/interrupt.h>
 #include <linux/poll.h>
 #include <linux/init.h>
-#include <linux/smp_lock.h>
+#include <linux/mutex.h>
 #include <linux/timer.h>
 #include <asm/irq.h>
 #include <asm/dma.h>
@@ -149,6 +149,7 @@ struct sync_port {
 };
 
 
+static DEFINE_MUTEX(sync_serial_mutex);
 static int etrax_sync_serial_init(void);
 static void initialize_port(int portnbr);
 static inline int sync_data_avail(struct sync_port *port);
@@ -445,7 +446,7 @@ static int sync_serial_open(struct inode *inode, struct file *file)
        int mode;
        int err = -EBUSY;
 
-       lock_kernel();
+       mutex_lock(&sync_serial_mutex);
        DEBUG(printk(KERN_DEBUG "Open sync serial port %d\n", dev));
 
        if (dev < 0 || dev >= NUMBER_OF_PORTS || !ports[dev].enabled) {
@@ -626,7 +627,7 @@ static int sync_serial_open(struct inode *inode, struct file *file)
        ret = 0;
        
 out:
-       unlock_kernel();
+       mutex_unlock(&sync_serial_mutex);
        return ret;
 }
 
@@ -961,9 +962,9 @@ static long sync_serial_ioctl(struct file *file,
 {
        long ret;
 
-       lock_kernel();
+       mutex_lock(&sync_serial_mutex);
        ret = sync_serial_ioctl_unlocked(file, cmd, arg);
-       unlock_kernel();
+       mutex_unlock(&sync_serial_mutex);
 
        return ret;
 }
index b07646a..0973d5a 100644 (file)
@@ -3139,9 +3139,9 @@ cryptocop_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
        struct inode *inode = file->f_path.dentry->d_inode;
        long ret;
 
-       lock_kernel();
+       mutex_lock(&cryptocop_mutex);
        ret = cryptocop_ioctl_unlocked(inode, filp, cmd, arg);
-       unlock_kernel();
+       mutex_unlock(&cryptocop_mutex);
 
        return ret;
 }
index 2dcd27a..50d1885 100644 (file)
@@ -23,7 +23,7 @@
 #include <linux/init.h>
 #include <linux/interrupt.h>
 #include <linux/spinlock.h>
-#include <linux/smp_lock.h>
+#include <linux/mutex.h>
 
 #include <asm/etraxgpio.h>
 #include <hwregs/reg_map.h>
@@ -66,6 +66,7 @@ static int dp_cnt;
 #define DP(x)
 #endif
 
+static DEFINE_MUTEX(gpio_mutex);
 static char gpio_name[] = "etrax gpio";
 
 #ifdef CONFIG_ETRAX_VIRTUAL_GPIO
@@ -391,7 +392,7 @@ static int gpio_open(struct inode *inode, struct file *filp)
        if (!priv)
                return -ENOMEM;
 
-       lock_kernel();
+       mutex_lock(&gpio_mutex);
        memset(priv, 0, sizeof(*priv));
 
        priv->minor = p;
@@ -414,7 +415,7 @@ static int gpio_open(struct inode *inode, struct file *filp)
                spin_unlock_irq(&gpio_lock);
        }
 
-       unlock_kernel();
+       mutex_unlock(&gpio_mutex);
        return 0;
 }
 
@@ -667,9 +668,9 @@ static long gpio_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
 {
        long ret;
 
-       lock_kernel();
+       mutex_lock(&gpio_mutex);
        ret = gpio_ioctl_unlocked(file, cmd, arg);
-       unlock_kernel();
+       mutex_unlock(&gpio_mutex);
 
        return ret;
 }
index 5ec8a7d..de8dca0 100644 (file)
@@ -22,7 +22,7 @@
 #include <linux/init.h>
 #include <linux/interrupt.h>
 #include <linux/spinlock.h>
-#include <linux/smp_lock.h>
+#include <linux/mutex.h>
 
 #include <asm/etraxgpio.h>
 #include <hwregs/reg_map.h>
@@ -64,6 +64,7 @@ static int dp_cnt;
 #define DP(x)
 #endif
 
+static DEFINE_MUTEX(gpio_mutex);
 static char gpio_name[] = "etrax gpio";
 
 #if 0
@@ -429,7 +430,7 @@ gpio_open(struct inode *inode, struct file *filp)
        if (!priv)
                return -ENOMEM;
 
-       lock_kernel();
+       mutex_lock(&gpio_mutex);
        memset(priv, 0, sizeof(*priv));
 
        priv->minor = p;
@@ -450,7 +451,7 @@ gpio_open(struct inode *inode, struct file *filp)
        alarmlist = priv;
        spin_unlock_irq(&alarm_lock);
 
-       unlock_kernel();
+       mutex_unlock(&gpio_mutex);
        return 0;
 }
 
@@ -708,9 +709,9 @@ static long gpio_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
 {
        long ret;
 
-       lock_kernel();
+       mutex_lock(&gpio_mutex);
        ret = gpio_ioctl_unlocked(file, cmd, arg);
-       unlock_kernel();
+       mutex_unlock(&gpio_mutex);
 
        return ret;
 }
index bef6eb5..bdcac9d 100644 (file)
@@ -24,7 +24,6 @@
 #include <linux/init.h>
 #include <linux/fs.h>
 #include <linux/ioctl.h>
-#include <linux/smp_lock.h>
 #include <linux/delay.h>
 #include <linux/bcd.h>
 #include <linux/mutex.h>
@@ -45,6 +44,7 @@
 #define rtc_read(x) i2c_readreg(RTC_I2C_READ, x)
 #define rtc_write(x,y) i2c_writereg(RTC_I2C_WRITE, x, y)
 
+static DEFINE_MUTEX(pcf8563_mutex);
 static DEFINE_MUTEX(rtc_lock); /* Protect state etc */
 
 static const unsigned char days_in_month[] =
@@ -339,9 +339,9 @@ static long pcf8563_unlocked_ioctl(struct file *filp, unsigned int cmd, unsigned
 {
        int ret;
 
-       lock_kernel();
+       mutex_lock(&pcf8563_mutex);
        return pcf8563_ioctl(filp, cmd, arg);
-       unlock_kernel();
+       mutex_unlock(&pcf8563_mutex);
 
        return ret;
 }
index ca248f3..a01ae9f 100644 (file)
@@ -13,7 +13,7 @@
 #include <linux/errno.h>
 #include <linux/major.h>
 #include <linux/sched.h>
-#include <linux/smp_lock.h>
+#include <linux/mutex.h>
 #include <linux/interrupt.h>
 #include <linux/poll.h>
 #include <linux/init.h>
@@ -145,6 +145,7 @@ typedef struct sync_port
        spinlock_t lock;
 } sync_port;
 
+static DEFINE_MUTEX(sync_serial_mutex);
 static int etrax_sync_serial_init(void);
 static void initialize_port(int portnbr);
 static inline int sync_data_avail(struct sync_port *port);
@@ -434,7 +435,7 @@ static int sync_serial_open(struct inode *inode, struct file *file)
        reg_dma_rw_cfg cfg = {.en = regk_dma_yes};
        reg_dma_rw_intr_mask intr_mask = {.data = regk_dma_yes};
 
-       lock_kernel();
+       mutex_lock(&sync_serial_mutex);
        DEBUG(printk(KERN_DEBUG "Open sync serial port %d\n", dev));
 
        if (dev < 0 || dev >= NBR_PORTS || !ports[dev].enabled)
@@ -583,7 +584,7 @@ static int sync_serial_open(struct inode *inode, struct file *file)
        port->busy++;
        ret = 0;
 out:
-       unlock_kernel();
+       mutex_unlock(&sync_serial_mutex);
        return ret;
 }
 
@@ -966,9 +967,9 @@ static long sync_serial_ioctl(struct file *file,
 {
        long ret;
 
-       lock_kernel();
+       mutex_lock(&sync_serial_mutex);
        ret = sync_serial_ioctl_unlocked(file, cmd, arg);
-       unlock_kernel();
+       mutex_unlock(&sync_serial_mutex);
 
        return ret;
 }
index f9f6783..ba0c053 100644 (file)
@@ -46,7 +46,6 @@
 #include <linux/init.h>
 #include <linux/proc_fs.h>
 #include <linux/miscdevice.h>
-#include <linux/smp_lock.h>
 #include <linux/spinlock.h>
 
 #include <asm/uaccess.h>
@@ -261,16 +260,13 @@ printk("Preparing to start counters\n");
  */
 static int perf_open(struct inode *inode, struct file *file)
 {
-       lock_kernel();
        spin_lock(&perf_lock);
        if (perf_enabled) {
                spin_unlock(&perf_lock);
-               unlock_kernel();
                return -EBUSY;
        }
        perf_enabled = 1;
        spin_unlock(&perf_lock);
-       unlock_kernel();
 
        return 0;
 }
index cfcac1f..8603627 100644 (file)
@@ -42,7 +42,7 @@
 #include <linux/miscdevice.h>
 #include <linux/watchdog.h>
 #include <linux/reboot.h>
-#include <linux/smp_lock.h>
+#include <linux/mutex.h>
 #include <linux/init.h>
 #include <linux/spinlock.h>
 #include <asm/uaccess.h>
@@ -50,6 +50,7 @@
 
 MODULE_LICENSE("GPL");
 
+static DEFINE_MUTEX(harddog_mutex);
 static DEFINE_SPINLOCK(lock);
 static int timer_alive;
 static int harddog_in_fd = -1;
@@ -66,7 +67,7 @@ static int harddog_open(struct inode *inode, struct file *file)
        int err = -EBUSY;
        char *sock = NULL;
 
-       lock_kernel();
+       mutex_lock(&harddog_mutex);
        spin_lock(&lock);
        if(timer_alive)
                goto err;
@@ -83,11 +84,11 @@ static int harddog_open(struct inode *inode, struct file *file)
 
        timer_alive = 1;
        spin_unlock(&lock);
-       unlock_kernel();
+       mutex_unlock(&harddog_mutex);
        return nonseekable_open(inode, file);
 err:
        spin_unlock(&lock);
-       unlock_kernel();
+       mutex_unlock(&harddog_mutex);
        return err;
 }
 
@@ -153,9 +154,9 @@ static long harddog_ioctl(struct file *file,
 {
        long ret;
 
-       lock_kernel();
+       mutex_lock(&harddog_mutex);
        ret = harddog_ioctl_unlocked(file, cmd, arg);
-       unlock_kernel();
+       mutex_unlock(&harddog_mutex);
 
        return ret;
 }
index 63c740a..f9f6a4e 100644 (file)
@@ -8,7 +8,7 @@
 #include "linux/slab.h"
 #include "linux/sound.h"
 #include "linux/soundcard.h"
-#include "linux/smp_lock.h"
+#include "linux/mutex.h"
 #include "asm/uaccess.h"
 #include "init.h"
 #include "os.h"
@@ -63,6 +63,8 @@ static int set_mixer(char *name, int *add)
 __uml_setup("mixer=", set_mixer, "mixer=<mixer device>\n" MIXER_HELP);
 #endif
 
+static DEFINE_MUTEX(hostaudio_mutex);
+
 /* /dev/dsp file operations */
 
 static ssize_t hostaudio_read(struct file *file, char __user *buffer,
@@ -198,9 +200,9 @@ static int hostaudio_open(struct inode *inode, struct file *file)
                w = 1;
 
        kparam_block_sysfs_write(dsp);
-       lock_kernel();
+       mutex_lock(&hostaudio_mutex);
        ret = os_open_file(dsp, of_set_rw(OPENFLAGS(), r, w), 0);
-       unlock_kernel();
+       mutex_unlock(&hostaudio_mutex);
        kparam_unblock_sysfs_write(dsp);
 
        if (ret < 0) {
@@ -259,9 +261,9 @@ static int hostmixer_open_mixdev(struct inode *inode, struct file *file)
                w = 1;
 
        kparam_block_sysfs_write(mixer);
-       lock_kernel();
+       mutex_lock(&hostaudio_mutex);
        ret = os_open_file(mixer, of_set_rw(OPENFLAGS(), r, w), 0);
-       unlock_kernel();
+       mutex_unlock(&hostaudio_mutex);
        kparam_unblock_sysfs_write(mixer);
 
        if (ret < 0) {
index 9734994..ba4a98b 100644 (file)
@@ -33,7 +33,7 @@
 #include "linux/mm.h"
 #include "linux/slab.h"
 #include "linux/vmalloc.h"
-#include "linux/smp_lock.h"
+#include "linux/mutex.h"
 #include "linux/blkpg.h"
 #include "linux/genhd.h"
 #include "linux/spinlock.h"
@@ -100,6 +100,7 @@ static inline void ubd_set_bit(__u64 bit, unsigned char *data)
 #define DRIVER_NAME "uml-blkdev"
 
 static DEFINE_MUTEX(ubd_lock);
+static DEFINE_MUTEX(ubd_mutex); /* replaces BKL, might not be needed */
 
 static int ubd_open(struct block_device *bdev, fmode_t mode);
 static int ubd_release(struct gendisk *disk, fmode_t mode);
@@ -1101,7 +1102,7 @@ static int ubd_open(struct block_device *bdev, fmode_t mode)
        struct ubd *ubd_dev = disk->private_data;
        int err = 0;
 
-       lock_kernel();
+       mutex_lock(&ubd_mutex);
        if(ubd_dev->count == 0){
                err = ubd_open_dev(ubd_dev);
                if(err){
@@ -1120,7 +1121,7 @@ static int ubd_open(struct block_device *bdev, fmode_t mode)
                err = -EROFS;
        }*/
 out:
-       unlock_kernel();
+       mutex_unlock(&ubd_mutex);
        return err;
 }
 
@@ -1128,10 +1129,10 @@ static int ubd_release(struct gendisk *disk, fmode_t mode)
 {
        struct ubd *ubd_dev = disk->private_data;
 
-       lock_kernel();
+       mutex_lock(&ubd_mutex);
        if(--ubd_dev->count == 0)
                ubd_close_dev(ubd_dev);
-       unlock_kernel();
+       mutex_unlock(&ubd_mutex);
        return 0;
 }
 
index 49b5e1e..340268b 100644 (file)
@@ -78,13 +78,11 @@ long sys_execve(const char __user *file, const char __user *const __user *argv,
        long error;
        char *filename;
 
-       lock_kernel();
        filename = getname(file);
        error = PTR_ERR(filename);
        if (IS_ERR(filename)) goto out;
        error = execve1(filename, argv, env);
        putname(filename);
  out:
-       unlock_kernel();
        return error;
 }
index a0a1829..a4eee32 100644 (file)
@@ -30,6 +30,7 @@
 #include <linux/bcd.h>
 #include <linux/seq_file.h>
 #include <linux/bitops.h>
+#include <linux/compat.h>
 #include <linux/clocksource.h>
 #include <linux/slab.h>
 
@@ -67,6 +68,7 @@
 #define        read_counter(MC)        readl(MC)
 #endif
 
+static DEFINE_MUTEX(hpet_mutex); /* replaces BKL */
 static u32 hpet_nhpet, hpet_max_freq = HPET_USER_FREQ;
 
 /* This clocksource driver currently only works on ia64 */
@@ -250,7 +252,7 @@ static int hpet_open(struct inode *inode, struct file *file)
        if (file->f_mode & FMODE_WRITE)
                return -EINVAL;
 
-       lock_kernel();
+       mutex_lock(&hpet_mutex);
        spin_lock_irq(&hpet_lock);
 
        for (devp = NULL, hpetp = hpets; hpetp && !devp; hpetp = hpetp->hp_next)
@@ -264,7 +266,7 @@ static int hpet_open(struct inode *inode, struct file *file)
 
        if (!devp) {
                spin_unlock_irq(&hpet_lock);
-               unlock_kernel();
+               mutex_unlock(&hpet_mutex);
                return -EBUSY;
        }
 
@@ -272,7 +274,7 @@ static int hpet_open(struct inode *inode, struct file *file)
        devp->hd_irqdata = 0;
        devp->hd_flags |= HPET_OPEN;
        spin_unlock_irq(&hpet_lock);
-       unlock_kernel();
+       mutex_unlock(&hpet_mutex);
 
        hpet_timer_set_irq(devp);
 
@@ -429,22 +431,6 @@ static int hpet_release(struct inode *inode, struct file *file)
        return 0;
 }
 
-static int hpet_ioctl_common(struct hpet_dev *, int, unsigned long, int);
-
-static long hpet_ioctl(struct file *file, unsigned int cmd,
-                       unsigned long arg)
-{
-       struct hpet_dev *devp;
-       int ret;
-
-       devp = file->private_data;
-       lock_kernel();
-       ret = hpet_ioctl_common(devp, cmd, arg, 0);
-       unlock_kernel();
-
-       return ret;
-}
-
 static int hpet_ioctl_ieon(struct hpet_dev *devp)
 {
        struct hpet_timer __iomem *timer;
@@ -553,7 +539,8 @@ static inline unsigned long hpet_time_div(struct hpets *hpets,
 }
 
 static int
-hpet_ioctl_common(struct hpet_dev *devp, int cmd, unsigned long arg, int kernel)
+hpet_ioctl_common(struct hpet_dev *devp, int cmd, unsigned long arg,
+                 struct hpet_info *info)
 {
        struct hpet_timer __iomem *timer;
        struct hpet __iomem *hpet;
@@ -594,23 +581,15 @@ hpet_ioctl_common(struct hpet_dev *devp, int cmd, unsigned long arg, int kernel)
                break;
        case HPET_INFO:
                {
-                       struct hpet_info info;
-
                        if (devp->hd_ireqfreq)
-                               info.hi_ireqfreq =
+                               info->hi_ireqfreq =
                                        hpet_time_div(hpetp, devp->hd_ireqfreq);
                        else
-                               info.hi_ireqfreq = 0;
-                       info.hi_flags =
+                               info->hi_ireqfreq = 0;
+                       info->hi_flags =
                            readq(&timer->hpet_config) & Tn_PER_INT_CAP_MASK;
-                       info.hi_hpet = hpetp->hp_which;
-                       info.hi_timer = devp - hpetp->hp_dev;
-                       if (kernel)
-                               memcpy((void *)arg, &info, sizeof(info));
-                       else
-                               if (copy_to_user((void __user *)arg, &info,
-                                                sizeof(info)))
-                                       err = -EFAULT;
+                       info->hi_hpet = hpetp->hp_which;
+                       info->hi_timer = devp - hpetp->hp_dev;
                        break;
                }
        case HPET_EPI:
@@ -636,7 +615,7 @@ hpet_ioctl_common(struct hpet_dev *devp, int cmd, unsigned long arg, int kernel)
                devp->hd_flags &= ~HPET_PERIODIC;
                break;
        case HPET_IRQFREQ:
-               if (!kernel && (arg > hpet_max_freq) &&
+               if ((arg > hpet_max_freq) &&
                    !capable(CAP_SYS_RESOURCE)) {
                        err = -EACCES;
                        break;
@@ -653,12 +632,63 @@ hpet_ioctl_common(struct hpet_dev *devp, int cmd, unsigned long arg, int kernel)
        return err;
 }
 
+static long
+hpet_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
+{
+       struct hpet_info info;
+       int err;
+
+       mutex_lock(&hpet_mutex);
+       err = hpet_ioctl_common(file->private_data, cmd, arg, &info);
+       mutex_unlock(&hpet_mutex);
+
+       if ((cmd == HPET_INFO) && !err &&
+           (copy_to_user((void __user *)arg, &info, sizeof(info))))
+               err = -EFAULT;
+
+       return err;
+}
+
+#ifdef CONFIG_COMPAT
+struct compat_hpet_info {
+       compat_ulong_t hi_ireqfreq;     /* Hz */
+       compat_ulong_t hi_flags;        /* information */
+       unsigned short hi_hpet;
+       unsigned short hi_timer;
+};
+
+static long
+hpet_compat_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
+{
+       struct hpet_info info;
+       int err;
+
+       mutex_lock(&hpet_mutex);
+       err = hpet_ioctl_common(file->private_data, cmd, arg, &info);
+       mutex_unlock(&hpet_mutex);
+
+       if ((cmd == HPET_INFO) && !err) {
+               struct compat_hpet_info __user *u = compat_ptr(arg);
+               if (put_user(info.hi_ireqfreq, &u->hi_ireqfreq) ||
+                   put_user(info.hi_flags, &u->hi_flags) ||
+                   put_user(info.hi_hpet, &u->hi_hpet) ||
+                   put_user(info.hi_timer, &u->hi_timer))
+                       err = -EFAULT;
+       }
+
+       return err;
+}
+#endif
+
 static const struct file_operations hpet_fops = {
        .owner = THIS_MODULE,
        .llseek = no_llseek,
        .read = hpet_read,
        .poll = hpet_poll,
        .unlocked_ioctl = hpet_ioctl,
+#ifdef CONFIG_COMPAT
+       .compat_ioctl = hpet_compat_ioctl,
+#endif
        .open = hpet_open,
        .release = hpet_release,
        .fasync = hpet_fasync,
index b38942f..24b2b91 100644 (file)
@@ -19,8 +19,8 @@
 #include <linux/cdev.h>
 #include <linux/device.h>
 #include <linux/mutex.h>
-#include <linux/smp_lock.h>
 #include <linux/gfp.h>
+#include <linux/compat.h>
 
 #include <asm/uaccess.h>
 
@@ -55,7 +55,6 @@ static int raw_open(struct inode *inode, struct file *filp)
                return 0;
        }
 
-       lock_kernel();
        mutex_lock(&raw_mutex);
 
        /*
@@ -82,7 +81,6 @@ static int raw_open(struct inode *inode, struct file *filp)
                        bdev->bd_inode->i_mapping;
        filp->private_data = bdev;
        mutex_unlock(&raw_mutex);
-       unlock_kernel();
        return 0;
 
 out2:
@@ -91,7 +89,6 @@ out1:
        blkdev_put(bdev, filp->f_mode);
 out:
        mutex_unlock(&raw_mutex);
-       unlock_kernel();
        return err;
 }
 
@@ -125,20 +122,84 @@ static long
 raw_ioctl(struct file *filp, unsigned int command, unsigned long arg)
 {
        struct block_device *bdev = filp->private_data;
-       int ret;
+       return blkdev_ioctl(bdev, 0, command, arg);
+}
+
+static int bind_set(int number, u64 major, u64 minor)
+{
+       dev_t dev = MKDEV(major, minor);
+       struct raw_device_data *rawdev;
+       int err = 0;
 
-       lock_kernel();
-       ret = blkdev_ioctl(bdev, 0, command, arg);
-       unlock_kernel();
+       if (number <= 0 || number >= MAX_RAW_MINORS)
+               return -EINVAL;
 
-       return ret;
+       if (MAJOR(dev) != major || MINOR(dev) != minor)
+               return -EINVAL;
+
+       rawdev = &raw_devices[number];
+
+       /*
+        * This is like making block devices, so demand the
+        * same capability
+        */
+       if (!capable(CAP_SYS_ADMIN))
+               return -EPERM;
+
+       /*
+        * For now, we don't need to check that the underlying
+        * block device is present or not: we can do that when
+        * the raw device is opened.  Just check that the
+        * major/minor numbers make sense.
+        */
+
+       if (MAJOR(dev) == 0 && dev != 0)
+               return -EINVAL;
+
+       mutex_lock(&raw_mutex);
+       if (rawdev->inuse) {
+               mutex_unlock(&raw_mutex);
+               return -EBUSY;
+       }
+       if (rawdev->binding) {
+               bdput(rawdev->binding);
+               module_put(THIS_MODULE);
+       }
+       if (!dev) {
+               /* unbind */
+               rawdev->binding = NULL;
+               device_destroy(raw_class, MKDEV(RAW_MAJOR, number));
+       } else {
+               rawdev->binding = bdget(dev);
+               if (rawdev->binding == NULL) {
+                       err = -ENOMEM;
+               } else {
+                       dev_t raw = MKDEV(RAW_MAJOR, number);
+                       __module_get(THIS_MODULE);
+                       device_destroy(raw_class, raw);
+                       device_create(raw_class, NULL, raw, NULL,
+                                     "raw%d", number);
+               }
+       }
+       mutex_unlock(&raw_mutex);
+       return err;
 }
 
-static void bind_device(struct raw_config_request *rq)
+static int bind_get(int number, dev_t *dev)
 {
-       device_destroy(raw_class, MKDEV(RAW_MAJOR, rq->raw_minor));
-       device_create(raw_class, NULL, MKDEV(RAW_MAJOR, rq->raw_minor), NULL,
-                     "raw%d", rq->raw_minor);
+       struct raw_device_data *rawdev;
+       struct block_device *bdev;
+
+       if (number <= 0 || number >= MAX_RAW_MINORS)
+               return -EINVAL;
+
+       rawdev = &raw_devices[number];
+
+       mutex_lock(&raw_mutex);
+       bdev = rawdev->binding;
+       *dev = bdev ? bdev->bd_dev : 0;
+       mutex_unlock(&raw_mutex);
+       return 0;
 }
 
 /*
@@ -149,105 +210,78 @@ 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;
+       dev_t dev;
+       int err;
 
-       lock_kernel();
        switch (command) {
        case RAW_SETBIND:
+               if (copy_from_user(&rq, (void __user *) arg, sizeof(rq)))
+                       return -EFAULT;
+
+               return bind_set(rq.raw_minor, rq.block_major, rq.block_minor);
+
        case RAW_GETBIND:
+               if (copy_from_user(&rq, (void __user *) arg, sizeof(rq)))
+                       return -EFAULT;
 
-               /* First, find out which raw minor we want */
+               err = bind_get(rq.raw_minor, &dev);
+               if (err)
+                       return err;
 
-               if (copy_from_user(&rq, (void __user *) arg, sizeof(rq))) {
-                       err = -EFAULT;
-                       goto out;
-               }
+               rq.block_major = MAJOR(dev);
+               rq.block_minor = MINOR(dev);
 
-               if (rq.raw_minor <= 0 || rq.raw_minor >= MAX_RAW_MINORS) {
-                       err = -EINVAL;
-                       goto out;
-               }
-               rawdev = &raw_devices[rq.raw_minor];
-
-               if (command == RAW_SETBIND) {
-                       dev_t dev;
-
-                       /*
-                        * This is like making block devices, so demand the
-                        * same capability
-                        */
-                       if (!capable(CAP_SYS_ADMIN)) {
-                               err = -EPERM;
-                               goto out;
-                       }
-
-                       /*
-                        * For now, we don't need to check that the underlying
-                        * block device is present or not: we can do that when
-                        * the raw device is opened.  Just check that the
-                        * major/minor numbers make sense.
-                        */
-
-                       dev = MKDEV(rq.block_major, rq.block_minor);
-                       if ((rq.block_major == 0 && rq.block_minor != 0) ||
-                                       MAJOR(dev) != rq.block_major ||
-                                       MINOR(dev) != rq.block_minor) {
-                               err = -EINVAL;
-                               goto out;
-                       }
-
-                       mutex_lock(&raw_mutex);
-                       if (rawdev->inuse) {
-                               mutex_unlock(&raw_mutex);
-                               err = -EBUSY;
-                               goto out;
-                       }
-                       if (rawdev->binding) {
-                               bdput(rawdev->binding);
-                               module_put(THIS_MODULE);
-                       }
-                       if (rq.block_major == 0 && rq.block_minor == 0) {
-                               /* unbind */
-                               rawdev->binding = NULL;
-                               device_destroy(raw_class,
-                                               MKDEV(RAW_MAJOR, rq.raw_minor));
-                       } else {
-                               rawdev->binding = bdget(dev);
-                               if (rawdev->binding == NULL)
-                                       err = -ENOMEM;
-                               else {
-                                       __module_get(THIS_MODULE);
-                                       bind_device(&rq);
-                               }
-                       }
-                       mutex_unlock(&raw_mutex);
-               } else {
-                       struct block_device *bdev;
-
-                       mutex_lock(&raw_mutex);
-                       bdev = rawdev->binding;
-                       if (bdev) {
-                               rq.block_major = MAJOR(bdev->bd_dev);
-                               rq.block_minor = MINOR(bdev->bd_dev);
-                       } else {
-                               rq.block_major = rq.block_minor = 0;
-                       }
-                       mutex_unlock(&raw_mutex);
-                       if (copy_to_user((void __user *)arg, &rq, sizeof(rq))) {
-                               err = -EFAULT;
-                               goto out;
-                       }
-               }
-               break;
-       default:
-               err = -EINVAL;
-               break;
+               if (copy_to_user((void __user *)arg, &rq, sizeof(rq)))
+                       return -EFAULT;
+
+               return 0;
        }
-out:
-       unlock_kernel();
-       return err;
+
+       return -EINVAL;
+}
+
+#ifdef CONFIG_COMPAT
+struct raw32_config_request {
+       compat_int_t    raw_minor;
+       compat_u64      block_major;
+       compat_u64      block_minor;
+};
+
+static long raw_ctl_compat_ioctl(struct file *file, unsigned int cmd,
+                               unsigned long arg)
+{
+       struct raw32_config_request __user *user_req = compat_ptr(arg);
+       struct raw32_config_request rq;
+       dev_t dev;
+       int err = 0;
+
+       switch (cmd) {
+       case RAW_SETBIND:
+               if (copy_from_user(&rq, user_req, sizeof(rq)))
+                       return -EFAULT;
+
+               return bind_set(rq.raw_minor, rq.block_major, rq.block_minor);
+
+       case RAW_GETBIND:
+               if (copy_from_user(&rq, user_req, sizeof(rq)))
+                       return -EFAULT;
+
+               err = bind_get(rq.raw_minor, &dev);
+               if (err)
+                       return err;
+
+               rq.block_major = MAJOR(dev);
+               rq.block_minor = MINOR(dev);
+
+               if (copy_to_user(user_req, &rq, sizeof(rq)))
+                       return -EFAULT;
+
+               return 0;
+       }
+
+       return -EINVAL;
 }
+#endif
 
 static const struct file_operations raw_fops = {
        .read           = do_sync_read,
@@ -263,6 +297,9 @@ static const struct file_operations raw_fops = {
 
 static const struct file_operations raw_ctl_fops = {
        .unlocked_ioctl = raw_ctl_ioctl,
+#ifdef CONFIG_COMPAT
+       .compat_ioctl   = raw_ctl_compat_ioctl,
+#endif
        .open           = raw_open,
        .owner          = THIS_MODULE,
 };
index 80ea6bc..e32cbf0 100644 (file)
@@ -37,7 +37,7 @@
 #include <linux/ioport.h>
 #include <linux/interrupt.h>
 #include <linux/spinlock.h>
-#include <linux/smp_lock.h>
+#include <linux/mutex.h>
 #include <linux/timer.h>
 #include <linux/sysfs.h>
 #include <linux/device.h>
@@ -206,7 +206,7 @@ static int tlclk_open(struct inode *inode, struct file *filp)
 {
        int result;
 
-       lock_kernel();
+       mutex_lock(&tlclk_mutex);
        if (test_and_set_bit(0, &useflags)) {
                result = -EBUSY;
                /* this legacy device is always one per system and it doesn't
@@ -229,7 +229,7 @@ static int tlclk_open(struct inode *inode, struct file *filp)
                inb(TLCLK_REG6);        /* Clear interrupt events */
 
 out:
-       unlock_kernel();
+       mutex_unlock(&tlclk_mutex);
        return result;
 }
 
index 4cab0c6..7af4436 100644 (file)
@@ -73,7 +73,8 @@ source "drivers/gpu/drm/radeon/Kconfig"
 
 config DRM_I810
        tristate "Intel I810"
-       depends on DRM && AGP && AGP_INTEL
+       # BKL usage in order to avoid AB-BA deadlocks, may become BROKEN_ON_SMP
+       depends on DRM && AGP && AGP_INTEL && BKL
        help
          Choose this option if you have an Intel I810 graphics card.  If M is
          selected, the module will be called i810.  AGP support is required
@@ -86,6 +87,8 @@ choice
 
 config DRM_I830
        tristate "i830 driver"
+       # BKL usage in order to avoid AB-BA deadlocks, i830 may get removed
+       depends on BKL
        help
          Choose this option if you have a system that has Intel 830M, 845G,
          852GM, 855GM or 865G integrated graphics.  If M is selected, the
index a28541b..bad2ced 100644 (file)
@@ -19,6 +19,7 @@ comment "Multimedia core support"
 
 config VIDEO_DEV
        tristate "Video For Linux"
+       depends on BKL # used in many drivers for ioctl handling, need to kill
        ---help---
          V4L core support for video capture and overlay devices, webcams and
          AM/FM radio cards.
index cf87051..d75788b 100644 (file)
@@ -22,7 +22,7 @@
 #include <linux/module.h>
 #include <linux/slab.h>
 #include <linux/init.h>
-#include <linux/smp_lock.h>
+#include <linux/mutex.h>
 #include <linux/string.h>
 #include <linux/dvb/ca.h>
 #include "dvbdev.h"
@@ -52,6 +52,7 @@
 } while(0)
 
 
+static DEFINE_MUTEX(dst_ca_mutex);
 static unsigned int verbose = 5;
 module_param(verbose, int, 0644);
 MODULE_PARM_DESC(verbose, "verbose startup messages, default is 1 (yes)");
@@ -564,7 +565,7 @@ static long dst_ca_ioctl(struct file *file, unsigned int cmd, unsigned long ioct
        void __user *arg = (void __user *)ioctl_arg;
        int result = 0;
 
-       lock_kernel();
+       mutex_lock(&dst_ca_mutex);
        dvbdev = file->private_data;
        state = (struct dst_state *)dvbdev->priv;
        p_ca_message = kmalloc(sizeof (struct ca_msg), GFP_KERNEL);
@@ -652,7 +653,7 @@ static long dst_ca_ioctl(struct file *file, unsigned int cmd, unsigned long ioct
        kfree (p_ca_slot_info);
        kfree (p_ca_caps);
 
-       unlock_kernel();
+       mutex_unlock(&dst_ca_mutex);
        return result;
 }
 
index 0042306..2de13b0 100644 (file)
@@ -25,7 +25,6 @@
 #include <linux/slab.h>
 #include <linux/vmalloc.h>
 #include <linux/module.h>
-#include <linux/smp_lock.h>
 #include <linux/poll.h>
 #include <linux/ioctl.h>
 #include <linux/wait.h>
@@ -1088,13 +1087,7 @@ static int dvb_demux_do_ioctl(struct file *file,
 static long dvb_demux_ioctl(struct file *file, unsigned int cmd,
                            unsigned long arg)
 {
-       int ret;
-
-       lock_kernel();
-       ret = dvb_usercopy(file, cmd, arg, dvb_demux_do_ioctl);
-       unlock_kernel();
-
-       return ret;
+       return dvb_usercopy(file, cmd, arg, dvb_demux_do_ioctl);
 }
 
 static unsigned int dvb_demux_poll(struct file *file, poll_table *wait)
@@ -1186,13 +1179,7 @@ static int dvb_dvr_do_ioctl(struct file *file,
 static long dvb_dvr_ioctl(struct file *file,
                         unsigned int cmd, unsigned long arg)
 {
-       int ret;
-
-       lock_kernel();
-       ret = dvb_usercopy(file, cmd, arg, dvb_dvr_do_ioctl);
-       unlock_kernel();
-
-       return ret;
+       return dvb_usercopy(file, cmd, arg, dvb_dvr_do_ioctl);
 }
 
 static unsigned int dvb_dvr_poll(struct file *file, poll_table *wait)
index cb97e6b..1723a98 100644 (file)
@@ -1259,13 +1259,7 @@ static int dvb_ca_en50221_io_do_ioctl(struct file *file,
 static long dvb_ca_en50221_io_ioctl(struct file *file,
                                    unsigned int cmd, unsigned long arg)
 {
-       int ret;
-
-       lock_kernel();
-       ret = dvb_usercopy(file, cmd, arg, dvb_ca_en50221_io_do_ioctl);
-       unlock_kernel();
-
-       return ret;
+       return dvb_usercopy(file, cmd, arg, dvb_ca_en50221_io_do_ioctl);
 }
 
 
index 6c3a8a0..a080322 100644 (file)
@@ -59,7 +59,6 @@
 #include <linux/netdevice.h>
 #include <linux/etherdevice.h>
 #include <linux/dvb/net.h>
-#include <linux/smp_lock.h>
 #include <linux/uio.h>
 #include <asm/uaccess.h>
 #include <linux/crc32.h>
@@ -1445,13 +1444,7 @@ static int dvb_net_do_ioctl(struct file *file,
 static long dvb_net_ioctl(struct file *file,
              unsigned int cmd, unsigned long arg)
 {
-       int ret;
-
-       lock_kernel();
-       ret = dvb_usercopy(file, cmd, arg, dvb_net_do_ioctl);
-       unlock_kernel();
-
-       return ret;
+       return dvb_usercopy(file, cmd, arg, dvb_net_do_ioctl);
 }
 
 static int dvb_net_close(struct inode *inode, struct file *file)
index b915c39..28f486e 100644 (file)
@@ -32,9 +32,9 @@
 #include <linux/fs.h>
 #include <linux/cdev.h>
 #include <linux/mutex.h>
-#include <linux/smp_lock.h>
 #include "dvbdev.h"
 
+static DEFINE_MUTEX(dvbdev_mutex);
 static int dvbdev_debug;
 
 module_param(dvbdev_debug, int, 0644);
@@ -68,7 +68,7 @@ static int dvb_device_open(struct inode *inode, struct file *file)
 {
        struct dvb_device *dvbdev;
 
-       lock_kernel();
+       mutex_lock(&dvbdev_mutex);
        down_read(&minor_rwsem);
        dvbdev = dvb_minors[iminor(inode)];
 
@@ -91,12 +91,12 @@ static int dvb_device_open(struct inode *inode, struct file *file)
                }
                fops_put(old_fops);
                up_read(&minor_rwsem);
-               unlock_kernel();
+               mutex_unlock(&dvbdev_mutex);
                return err;
        }
 fail:
        up_read(&minor_rwsem);
-       unlock_kernel();
+       mutex_unlock(&dvbdev_mutex);
        return -ENODEV;
 }
 
@@ -158,7 +158,6 @@ long dvb_generic_ioctl(struct file *file,
                       unsigned int cmd, unsigned long arg)
 {
        struct dvb_device *dvbdev = file->private_data;
-       int ret;
 
        if (!dvbdev)
                return -ENODEV;
@@ -166,11 +165,7 @@ long dvb_generic_ioctl(struct file *file,
        if (!dvbdev->kernel_ioctl)
                return -EINVAL;
 
-       lock_kernel();
-       ret = dvb_usercopy(file, cmd, arg, dvbdev->kernel_ioctl);
-       unlock_kernel();
-
-       return ret;
+       return dvb_usercopy(file, cmd, arg, dvbdev->kernel_ioctl);
 }
 EXPORT_SYMBOL(dvb_generic_ioctl);
 
@@ -421,8 +416,10 @@ int dvb_usercopy(struct file *file,
        }
 
        /* call driver */
+       mutex_lock(&dvbdev_mutex);
        if ((err = func(file, cmd, parg)) == -ENOIOCTLCMD)
                err = -EINVAL;
+       mutex_unlock(&dvbdev_mutex);
 
        if (err < 0)
                goto out;
index 5b176bd..f3e25e9 100644 (file)
@@ -32,7 +32,6 @@
 #include <linux/list.h>
 #include <linux/vmalloc.h>
 #include <linux/slab.h>
-#include <linux/smp_lock.h>
 #include <linux/init.h>
 #include <asm/uaccess.h>
 #include <asm/atomic.h>
@@ -621,7 +620,6 @@ static int dabusb_open (struct inode *inode, struct file *file)
        if (devnum < DABUSB_MINOR || devnum >= (DABUSB_MINOR + NRDABUSB))
                return -EIO;
 
-       lock_kernel();
        s = &dabusb[devnum - DABUSB_MINOR];
 
        dbg("dabusb_open");
@@ -630,21 +628,17 @@ static int dabusb_open (struct inode *inode, struct file *file)
        while (!s->usbdev || s->opened) {
                mutex_unlock(&s->mutex);
 
-               if (file->f_flags & O_NONBLOCK) {
+               if (file->f_flags & O_NONBLOCK)
                        return -EBUSY;
-               }
                msleep_interruptible(500);
 
-               if (signal_pending (current)) {
-                       unlock_kernel();
+               if (signal_pending (current))
                        return -EAGAIN;
-               }
                mutex_lock(&s->mutex);
        }
        if (usb_set_interface (s->usbdev, _DABUSB_IF, 1) < 0) {
                mutex_unlock(&s->mutex);
                dev_err(&s->usbdev->dev, "set_interface failed\n");
-               unlock_kernel();
                return -EINVAL;
        }
        s->opened = 1;
@@ -654,7 +648,6 @@ static int dabusb_open (struct inode *inode, struct file *file)
        file->private_data = s;
 
        r = nonseekable_open(inode, file);
-       unlock_kernel();
        return r;
 }
 
@@ -689,17 +682,13 @@ static long dabusb_ioctl (struct file *file, unsigned int cmd, unsigned long arg
 
        dbg("dabusb_ioctl");
 
-       lock_kernel();
-       if (s->remove_pending) {
-               unlock_kernel();
+       if (s->remove_pending)
                return -EIO;
-       }
 
        mutex_lock(&s->mutex);
 
        if (!s->usbdev) {
                mutex_unlock(&s->mutex);
-               unlock_kernel();
                return -EIO;
        }
 
@@ -735,7 +724,6 @@ static long dabusb_ioctl (struct file *file, unsigned int cmd, unsigned long arg
                break;
        }
        mutex_unlock(&s->mutex);
-       unlock_kernel();
        return ret;
 }
 
index 0a0e0cd..20f97e7 100644 (file)
@@ -3,6 +3,7 @@
 #
 config ATALK
        tristate "Appletalk protocol support"
+       depends on BKL # waiting to be removed from net/appletalk/ddp.c
        select LLC
        ---help---
          AppleTalk is the protocol that Apple computers can use to communicate
index 3f94eda..e73ebef 100644 (file)
@@ -31,8 +31,9 @@ static struct proc_dir_entry *isapnp_proc_bus_dir = NULL;
 static loff_t isapnp_proc_bus_lseek(struct file *file, loff_t off, int whence)
 {
        loff_t new = -1;
+       struct inode *inode = file->f_path.dentry->d_inode;
 
-       lock_kernel();
+       mutex_lock(&inode->i_mutex);
        switch (whence) {
        case 0:
                new = off;
@@ -44,12 +45,12 @@ static loff_t isapnp_proc_bus_lseek(struct file *file, loff_t off, int whence)
                new = 256 + off;
                break;
        }
-       if (new < 0 || new > 256) {
-               unlock_kernel();
-               return -EINVAL;
-       }
-       unlock_kernel();
-       return (file->f_pos = new);
+       if (new < 0 || new > 256)
+               new = -EINVAL;
+       else
+               file->f_pos = new;
+       mutex_unlock(&inode->i_mutex);
+       return new;
 }
 
 static ssize_t isapnp_proc_bus_read(struct file *file, char __user * buf,
index 8373ca0..38e6fa9 100644 (file)
@@ -21,7 +21,6 @@
 #include <linux/hdreg.h>
 #include <linux/async.h>
 #include <linux/mutex.h>
-#include <linux/smp_lock.h>
 
 #include <asm/ccwdev.h>
 #include <asm/ebcdic.h>
@@ -2236,7 +2235,6 @@ static int dasd_open(struct block_device *bdev, fmode_t mode)
        if (!block)
                return -ENODEV;
 
-       lock_kernel();
        base = block->base;
        atomic_inc(&block->open_count);
        if (test_bit(DASD_FLAG_OFFLINE, &base->flags)) {
@@ -2271,14 +2269,12 @@ static int dasd_open(struct block_device *bdev, fmode_t mode)
                goto out;
        }
 
-       unlock_kernel();
        return 0;
 
 out:
        module_put(base->discipline->owner);
 unlock:
        atomic_dec(&block->open_count);
-       unlock_kernel();
        return rc;
 }
 
@@ -2286,10 +2282,8 @@ static int dasd_release(struct gendisk *disk, fmode_t mode)
 {
        struct dasd_block *block = disk->private_data;
 
-       lock_kernel();
        atomic_dec(&block->open_count);
        module_put(block->base->discipline->owner);
-       unlock_kernel();
        return 0;
 }
 
index 1557214..26075e9 100644 (file)
@@ -16,7 +16,6 @@
 #include <linux/major.h>
 #include <linux/fs.h>
 #include <linux/blkpg.h>
-#include <linux/smp_lock.h>
 #include <linux/slab.h>
 #include <asm/compat.h>
 #include <asm/ccwdev.h>
@@ -370,9 +369,8 @@ static int dasd_ioctl_readall_cmb(struct dasd_block *block, unsigned int cmd,
        return ret;
 }
 
-static int
-dasd_do_ioctl(struct block_device *bdev, fmode_t mode,
-             unsigned int cmd, unsigned long arg)
+int dasd_ioctl(struct block_device *bdev, fmode_t mode,
+              unsigned int cmd, unsigned long arg)
 {
        struct dasd_block *block = bdev->bd_disk->private_data;
        void __user *argp;
@@ -430,14 +428,3 @@ dasd_do_ioctl(struct block_device *bdev, fmode_t mode,
                return -EINVAL;
        }
 }
-
-int dasd_ioctl(struct block_device *bdev, fmode_t mode,
-              unsigned int cmd, unsigned long arg)
-{
-       int rc;
-
-       lock_kernel();
-       rc = dasd_do_ioctl(bdev, mode, cmd, arg);
-       unlock_kernel();
-       return rc;
-}
index 2bd72aa..9b43ae9 100644 (file)
@@ -14,7 +14,6 @@
 #include <linux/init.h>
 #include <linux/slab.h>
 #include <linux/blkdev.h>
-#include <linux/smp_lock.h>
 #include <linux/completion.h>
 #include <linux/interrupt.h>
 #include <linux/platform_device.h>
@@ -776,7 +775,6 @@ dcssblk_open(struct block_device *bdev, fmode_t mode)
        struct dcssblk_dev_info *dev_info;
        int rc;
 
-       lock_kernel();
        dev_info = bdev->bd_disk->private_data;
        if (NULL == dev_info) {
                rc = -ENODEV;
@@ -786,7 +784,6 @@ dcssblk_open(struct block_device *bdev, fmode_t mode)
        bdev->bd_block_size = 4096;
        rc = 0;
 out:
-       unlock_kernel();
        return rc;
 }
 
@@ -797,7 +794,6 @@ dcssblk_release(struct gendisk *disk, fmode_t mode)
        struct segment_info *entry;
        int rc;
 
-       lock_kernel();
        if (!dev_info) {
                rc = -ENODEV;
                goto out;
@@ -815,7 +811,6 @@ dcssblk_release(struct gendisk *disk, fmode_t mode)
        up_write(&dcssblk_devices_sem);
        rc = 0;
 out:
-       unlock_kernel();
        return rc;
 }
 
index df7756a..813cb35 100644 (file)
@@ -1,6 +1,7 @@
 config VIDEO_CX25821
        tristate "Conexant cx25821 support"
        depends on DVB_CORE && VIDEO_DEV && PCI && I2C && INPUT
+       depends on BKL # please fix
        select I2C_ALGOBIT
        select VIDEO_BTCX
        select VIDEO_TVEEPROM
index bd96f39..9d5fe4d 100644 (file)
@@ -1,6 +1,7 @@
 config EASYCAP
        tristate "EasyCAP USB ID 05e1:0408 support"
        depends on USB && VIDEO_DEV
+       depends on BKL # please fix
 
        ---help---
          This is an integrated audio/video driver for EasyCAP cards with
index e47f683..75fa468 100644 (file)
@@ -1,6 +1,7 @@
 config VIDEO_GO7007
        tristate "WIS GO7007 MPEG encoder support"
        depends on VIDEO_DEV && PCI && I2C && INPUT
+       depends on BKL # please fix
        depends on SND
        select VIDEOBUF_DMA_SG
        select VIDEO_IR
index 2c1d10a..b11ec37 100644 (file)
@@ -1,6 +1,6 @@
 config USB_IP_COMMON
        tristate "USB IP support (EXPERIMENTAL)"
-       depends on USB && NET && EXPERIMENTAL
+       depends on USB && NET && EXPERIMENTAL && BKL
        default N
        ---help---
          This enables pushing USB packets over IP to allow remote
index 3d18530..65781de 100644 (file)
@@ -50,6 +50,7 @@ endif # BLOCK
 config FILE_LOCKING
        bool "Enable POSIX file locking API" if EMBEDDED
        default y
+       select BKL # while lockd still uses it.
        help
          This option enables standard file locking support, required
           for filesystems like NFS and for the flock() system
index e55182a..1dd5f34 100644 (file)
@@ -1,6 +1,7 @@
 config ADFS_FS
        tristate "ADFS file system support (EXPERIMENTAL)"
        depends on BLOCK && EXPERIMENTAL
+       depends on BKL # need to fix
        help
          The Acorn Disc Filing System is the standard file system of the
          RiscOS operating system which runs on Acorn's ARM-based Risc PC
index 5f3bea9..480e210 100644 (file)
@@ -1,5 +1,6 @@
 config AUTOFS_FS
        tristate "Kernel automounter support"
+       depends on BKL # unfixable, just use autofs4
        help
          The automounter is a tool to automatically mount remote file systems
          on demand. This implementation is partially kernel-based to reduce
index 03e59aa..d0ad09d 100644 (file)
@@ -599,69 +599,6 @@ static int do_smb_getmountuid(unsigned int fd, unsigned int cmd,
 #define HIDPGETCONNLIST        _IOR('H', 210, int)
 #define HIDPGETCONNINFO        _IOR('H', 211, int)
 
-#ifdef CONFIG_BLOCK
-struct raw32_config_request
-{
-        compat_int_t    raw_minor;
-        __u64   block_major;
-        __u64   block_minor;
-} __attribute__((packed));
-
-static int get_raw32_request(struct raw_config_request *req, struct raw32_config_request __user *user_req)
-{
-        int ret;
-
-        if (!access_ok(VERIFY_READ, user_req, sizeof(struct raw32_config_request)))
-                return -EFAULT;
-
-        ret = __get_user(req->raw_minor, &user_req->raw_minor);
-        ret |= __get_user(req->block_major, &user_req->block_major);
-        ret |= __get_user(req->block_minor, &user_req->block_minor);
-
-        return ret ? -EFAULT : 0;
-}
-
-static int set_raw32_request(struct raw_config_request *req, struct raw32_config_request __user *user_req)
-{
-       int ret;
-
-        if (!access_ok(VERIFY_WRITE, user_req, sizeof(struct raw32_config_request)))
-                return -EFAULT;
-
-        ret = __put_user(req->raw_minor, &user_req->raw_minor);
-        ret |= __put_user(req->block_major, &user_req->block_major);
-        ret |= __put_user(req->block_minor, &user_req->block_minor);
-
-        return ret ? -EFAULT : 0;
-}
-
-static int raw_ioctl(unsigned fd, unsigned cmd,
-               struct raw32_config_request __user *user_req)
-{
-        int ret;
-
-        switch (cmd) {
-        case RAW_SETBIND:
-       default: {      /* RAW_GETBIND */
-                struct raw_config_request req;
-                mm_segment_t oldfs = get_fs();
-
-                if ((ret = get_raw32_request(&req, user_req)))
-                        return ret;
-
-                set_fs(KERNEL_DS);
-                ret = sys_ioctl(fd,cmd,(unsigned long)&req);
-                set_fs(oldfs);
-
-                if ((!ret) && (cmd == RAW_GETBIND)) {
-                        ret = set_raw32_request(&req, user_req);
-                }
-                break;
-        }
-        }
-        return ret;
-}
-#endif /* CONFIG_BLOCK */
 
 struct serial_struct32 {
         compat_int_t    type;
@@ -1262,9 +1199,6 @@ COMPATIBLE_IOCTL(SOUND_MIXER_PRIVATE5)
 COMPATIBLE_IOCTL(SOUND_MIXER_GETLEVELS)
 COMPATIBLE_IOCTL(SOUND_MIXER_SETLEVELS)
 COMPATIBLE_IOCTL(OSS_GETVERSION)
-/* Raw devices */
-COMPATIBLE_IOCTL(RAW_SETBIND)
-COMPATIBLE_IOCTL(RAW_GETBIND)
 /* SMB ioctls which do not need any translations */
 COMPATIBLE_IOCTL(SMB_IOC_NEWCONN)
 /* Watchdog */
@@ -1523,10 +1457,6 @@ static long do_ioctl_trans(int fd, unsigned int cmd,
        case MTIOCGET32:
        case MTIOCPOS32:
                return mt_ioctl_trans(fd, cmd, argp);
-       /* Raw devices */
-       case RAW_SETBIND:
-       case RAW_GETBIND:
-               return raw_ioctl(fd, cmd, argp);
 #endif
        /* One SMB ioctl needs translations. */
 #define SMB_IOC_GETMOUNTUID_32 _IOR('u', 1, compat_uid_t)
index 56bd15c..63b6f56 100644 (file)
@@ -1,6 +1,7 @@
 config HPFS_FS
        tristate "OS/2 HPFS file system support"
        depends on BLOCK
+       depends on BKL # nontrivial to fix
        help
          OS/2 is IBM's operating system for PC's, the same as Warp, and HPFS
          is the file system used for organizing files on OS/2 hard disk
index f7e13db..b950415 100644 (file)
@@ -1,6 +1,7 @@
 config NFS_FS
        tristate "NFS client support"
        depends on INET && FILE_LOCKING
+       depends on BKL # fix as soon as lockd is done
        select LOCKD
        select SUNRPC
        select NFS_ACL_SUPPORT if NFS_V3_ACL
index 4264377..7cf4dda 100644 (file)
@@ -2,6 +2,7 @@ config NFSD
        tristate "NFS server support"
        depends on INET
        depends on FILE_LOCKING
+       depends on BKL # fix as soon as lockd is done
        select LOCKD
        select SUNRPC
        select EXPORTFS
index e668127..2bc24a8 100644 (file)
@@ -1,5 +1,6 @@
 config SMB_FS
        tristate "SMB file system support (OBSOLETE, please use CIFS)"
+       depends on BKL # probably unfixable
        depends on INET
        select NLS
        help
index 0e0e99b..f8def3c 100644 (file)
@@ -1,5 +1,6 @@
 config UDF_FS
        tristate "UDF file system support"
+       depends on BKL # needs serious work to remove
        select CRC_ITU_T
        help
          This is the new file system used on some CD-ROMs and DVDs. Say Y if
index e4f10a4..30c8f22 100644 (file)
@@ -1,6 +1,7 @@
 config UFS_FS
        tristate "UFS file system support (read only)"
        depends on BLOCK
+       depends on BKL # probably fixable
        help
          BSD and derivate versions of Unix (such as SunOS, FreeBSD, NetBSD,
          OpenBSD and NeXTstep) use a file system called UFS. Some System V
index 2ea1dd1..291f721 100644 (file)
@@ -54,12 +54,15 @@ static inline void cycle_kernel_lock(void)
 
 #else
 
+#ifdef CONFIG_BKL /* provoke build bug if not set */
 #define lock_kernel()
 #define unlock_kernel()
-#define release_kernel_lock(task)              do { } while(0)
 #define cycle_kernel_lock()                    do { } while(0)
-#define reacquire_kernel_lock(task)            0
 #define kernel_locked()                                1
+#endif /* CONFIG_BKL */
+
+#define release_kernel_lock(task)              do { } while(0)
+#define reacquire_kernel_lock(task)            0
 
 #endif /* CONFIG_LOCK_KERNEL */
 #endif /* __LINUX_SMPLOCK_H */
index 36890f0..be85a0a 100644 (file)
@@ -71,7 +71,7 @@ config BROKEN_ON_SMP
 
 config LOCK_KERNEL
        bool
-       depends on SMP || PREEMPT
+       depends on (SMP || PREEMPT) && BKL
        default y
 
 config INIT_ENV_ARG_LIMIT
index 9684c96..e59af24 100644 (file)
@@ -424,7 +424,6 @@ static void __init setup_command_line(char *command_line)
 static __initdata DECLARE_COMPLETION(kthreadd_done);
 
 static noinline void __init_refok rest_init(void)
-       __releases(kernel_lock)
 {
        int pid;
 
@@ -818,7 +817,6 @@ static void run_init_process(const char *init_filename)
  * makes it inline to init() and it becomes part of init.text section
  */
 static noinline int init_post(void)
-       __releases(kernel_lock)
 {
        /* need to finish all async __init code before freeing the memory */
        async_synchronize_full();
index a56f629..66cb89b 100644 (file)
@@ -76,7 +76,9 @@ static int handle_op(struct test_thread_data *td, int lockwakeup)
                }
 
                if (!lockwakeup && td->bkl == 4) {
+#ifdef CONFIG_LOCK_KERNEL
                        unlock_kernel();
+#endif
                        td->bkl = 0;
                }
                return 0;
@@ -133,14 +135,18 @@ static int handle_op(struct test_thread_data *td, int lockwakeup)
                if (td->bkl)
                        return 0;
                td->bkl = 1;
+#ifdef CONFIG_LOCK_KERNEL
                lock_kernel();
+#endif
                td->bkl = 4;
                return 0;
 
        case RTTEST_UNLOCKBKL:
                if (td->bkl != 4)
                        break;
+#ifdef CONFIG_LOCK_KERNEL
                unlock_kernel();
+#endif
                td->bkl = 0;
                return 0;
 
index 959f8d6..5328e87 100644 (file)
@@ -23,7 +23,6 @@
 #include <linux/mutex.h>
 #include <linux/slab.h>
 #include <linux/debugfs.h>
-#include <linux/smp_lock.h>
 #include <linux/time.h>
 #include <linux/uaccess.h>
 
@@ -639,7 +638,6 @@ int blk_trace_ioctl(struct block_device *bdev, unsigned cmd, char __user *arg)
        if (!q)
                return -ENXIO;
 
-       lock_kernel();
        mutex_lock(&bdev->bd_mutex);
 
        switch (cmd) {
@@ -667,7 +665,6 @@ int blk_trace_ioctl(struct block_device *bdev, unsigned cmd, char __user *arg)
        }
 
        mutex_unlock(&bdev->bd_mutex);
-       unlock_kernel();
        return ret;
 }
 
@@ -1652,10 +1649,9 @@ static ssize_t sysfs_blk_trace_attr_show(struct device *dev,
        struct block_device *bdev;
        ssize_t ret = -ENXIO;
 
-       lock_kernel();
        bdev = bdget(part_devt(p));
        if (bdev == NULL)
-               goto out_unlock_kernel;
+               goto out;
 
        q = blk_trace_get_queue(bdev);
        if (q == NULL)
@@ -1683,8 +1679,7 @@ out_unlock_bdev:
        mutex_unlock(&bdev->bd_mutex);
 out_bdput:
        bdput(bdev);
-out_unlock_kernel:
-       unlock_kernel();
+out:
        return ret;
 }
 
@@ -1714,11 +1709,10 @@ static ssize_t sysfs_blk_trace_attr_store(struct device *dev,
 
        ret = -ENXIO;
 
-       lock_kernel();
        p = dev_to_part(dev);
        bdev = bdget(part_devt(p));
        if (bdev == NULL)
-               goto out_unlock_kernel;
+               goto out;
 
        q = blk_trace_get_queue(bdev);
        if (q == NULL)
@@ -1753,8 +1747,6 @@ out_unlock_bdev:
        mutex_unlock(&bdev->bd_mutex);
 out_bdput:
        bdput(bdev);
-out_unlock_kernel:
-       unlock_kernel();
 out:
        return ret ? ret : count;
 }
index 21ac830..7b2a8ca 100644 (file)
@@ -461,6 +461,15 @@ config DEBUG_MUTEXES
         This feature allows mutex semantics violations to be detected and
         reported.
 
+config BKL
+       bool "Big Kernel Lock" if (SMP || PREEMPT)
+       default y
+       help
+         This is the traditional lock that is used in old code instead
+         of proper locking. All drivers that use the BKL should depend
+         on this symbol.
+         Say Y here unless you are working on removing the BKL.
+
 config DEBUG_LOCK_ALLOC
        bool "Lock debugging: detect incorrect freeing of live locks"
        depends on DEBUG_KERNEL && TRACE_IRQFLAGS_SUPPORT && STACKTRACE_SUPPORT && LOCKDEP_SUPPORT
index e9ad006..02549cb 100644 (file)
@@ -3,6 +3,7 @@
 #
 config IPX
        tristate "The IPX protocol"
+       depends on BKL # should be fixable
        select LLC
        ---help---
          This is support for the Novell networking protocol, IPX, commonly
index 2b06410..29b11e0 100644 (file)
@@ -28,7 +28,6 @@
 #include <linux/workqueue.h>
 #include <linux/mutex.h>
 #include <linux/pagemap.h>
-#include <linux/smp_lock.h>
 #include <asm/ioctls.h>
 #include <linux/sunrpc/types.h>
 #include <linux/sunrpc/cache.h>
@@ -1348,15 +1347,10 @@ static unsigned int cache_poll_procfs(struct file *filp, poll_table *wait)
 static long cache_ioctl_procfs(struct file *filp,
                               unsigned int cmd, unsigned long arg)
 {
-       long ret;
        struct inode *inode = filp->f_path.dentry->d_inode;
        struct cache_detail *cd = PDE(inode)->data;
 
-       lock_kernel();
-       ret = cache_ioctl(inode, filp, cmd, arg, cd);
-       unlock_kernel();
-
-       return ret;
+       return cache_ioctl(inode, filp, cmd, arg, cd);
 }
 
 static int cache_open_procfs(struct inode *inode, struct file *filp)
@@ -1555,13 +1549,8 @@ static long cache_ioctl_pipefs(struct file *filp,
 {
        struct inode *inode = filp->f_dentry->d_inode;
        struct cache_detail *cd = RPC_I(inode)->private;
-       long ret;
 
-       lock_kernel();
-       ret = cache_ioctl(inode, filp, cmd, arg, cd);
-       unlock_kernel();
-
-       return ret;
+       return cache_ioctl(inode, filp, cmd, arg, cd);
 }
 
 static int cache_open_pipefs(struct inode *inode, struct file *filp)
index 8c8eef2..28bcd52 100644 (file)
@@ -27,7 +27,6 @@
 #include <linux/workqueue.h>
 #include <linux/sunrpc/rpc_pipe_fs.h>
 #include <linux/sunrpc/cache.h>
-#include <linux/smp_lock.h>
 
 static struct vfsmount *rpc_mount __read_mostly;
 static int rpc_mount_count;
@@ -309,40 +308,33 @@ rpc_pipe_poll(struct file *filp, struct poll_table_struct *wait)
        return mask;
 }
 
-static int
-rpc_pipe_ioctl_unlocked(struct file *filp, unsigned int cmd, unsigned long arg)
+static long
+rpc_pipe_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
 {
-       struct rpc_inode *rpci = RPC_I(filp->f_path.dentry->d_inode);
+       struct inode *inode = filp->f_path.dentry->d_inode;
+       struct rpc_inode *rpci = RPC_I(inode);
        int len;
 
        switch (cmd) {
        case FIONREAD:
-               if (rpci->ops == NULL)
+               spin_lock(&inode->i_lock);
+               if (rpci->ops == NULL) {
+                       spin_unlock(&inode->i_lock);
                        return -EPIPE;
+               }
                len = rpci->pipelen;
                if (filp->private_data) {
                        struct rpc_pipe_msg *msg;
                        msg = (struct rpc_pipe_msg *)filp->private_data;
                        len += msg->len - msg->copied;
                }
+               spin_unlock(&inode->i_lock);
                return put_user(len, (int __user *)arg);
        default:
                return -EINVAL;
        }
 }
 
-static long
-rpc_pipe_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
-{
-       long ret;
-
-       lock_kernel();
-       ret = rpc_pipe_ioctl_unlocked(filp, cmd, arg);
-       unlock_kernel();
-
-       return ret;
-}
-
 static const struct file_operations rpc_pipe_fops = {
        .owner          = THIS_MODULE,
        .llseek         = no_llseek,
index e6759c9..2196e55 100644 (file)
@@ -5,6 +5,7 @@
 config X25
        tristate "CCITT X.25 Packet Layer (EXPERIMENTAL)"
        depends on EXPERIMENTAL
+       depends on BKL # should be fixable
        ---help---
          X.25 is a set of standardized network protocols, similar in scope to
          frame relay; the one physical line from your box to the X.25 network