diff --git a/[refs] b/[refs] index cf4bb86cc2c9..22c6ad7d12bd 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: db08bf0877f3464fb0c2c37dcdd9f9683192ea26 +refs/heads/master: ff10fca5ceacf7bc59636f5ab808e775d1717167 diff --git a/trunk/Documentation/DocBook/drm.tmpl b/trunk/Documentation/DocBook/drm.tmpl index 2861055afd7a..910c923a9b86 100644 --- a/trunk/Documentation/DocBook/drm.tmpl +++ b/trunk/Documentation/DocBook/drm.tmpl @@ -136,7 +136,6 @@ #ifdef CONFIG_COMPAT .compat_ioctl = i915_compat_ioctl, #endif - .llseek = noop_llseek, }, .pci_driver = { .name = DRIVER_NAME, diff --git a/trunk/Documentation/x86/x86_64/kernel-stacks b/trunk/Documentation/x86/x86_64/kernel-stacks index a01eec5d1d0b..5ad65d51fb95 100644 --- a/trunk/Documentation/x86/x86_64/kernel-stacks +++ b/trunk/Documentation/x86/x86_64/kernel-stacks @@ -18,9 +18,9 @@ specialized stacks contain no useful data. The main CPU stacks are: Used for external hardware interrupts. If this is the first external hardware interrupt (i.e. not a nested hardware interrupt) then the kernel switches from the current task to the interrupt stack. Like - the split thread and interrupt stacks on i386, this gives more room - for kernel interrupt processing without having to increase the size - of every per thread stack. + the split thread and interrupt stacks on i386 (with CONFIG_4KSTACKS), + this gives more room for kernel interrupt processing without having + to increase the size of every per thread stack. The interrupt stack is also used when processing a softirq. diff --git a/trunk/arch/arm/kernel/etm.c b/trunk/arch/arm/kernel/etm.c index 11db62806a1a..a48d51257988 100644 --- a/trunk/arch/arm/kernel/etm.c +++ b/trunk/arch/arm/kernel/etm.c @@ -329,7 +329,6 @@ static const struct file_operations etb_fops = { .read = etb_read, .open = etb_open, .release = etb_release, - .llseek = no_llseek, }; static struct miscdevice etb_miscdev = { diff --git a/trunk/arch/arm/mach-msm/last_radio_log.c b/trunk/arch/arm/mach-msm/last_radio_log.c index 1e243f46a969..b64ba5a98686 100644 --- a/trunk/arch/arm/mach-msm/last_radio_log.c +++ b/trunk/arch/arm/mach-msm/last_radio_log.c @@ -48,8 +48,7 @@ static ssize_t last_radio_log_read(struct file *file, char __user *buf, } static struct file_operations last_radio_log_fops = { - .read = last_radio_log_read, - .llseek = default_llseek, + .read = last_radio_log_read }; void msm_init_last_radio_log(struct module *owner) diff --git a/trunk/arch/arm/mach-msm/smd_debug.c b/trunk/arch/arm/mach-msm/smd_debug.c index f91c3b7bc655..3b2dd717b788 100644 --- a/trunk/arch/arm/mach-msm/smd_debug.c +++ b/trunk/arch/arm/mach-msm/smd_debug.c @@ -212,7 +212,6 @@ static int debug_open(struct inode *inode, struct file *file) static const struct file_operations debug_ops = { .read = debug_read, .open = debug_open, - .llseek = default_llseek, }; static void debug_create(const char *name, mode_t mode, diff --git a/trunk/arch/arm/plat-mxc/audmux-v2.c b/trunk/arch/arm/plat-mxc/audmux-v2.c index 0be1ac7f421b..62920490c0d6 100644 --- a/trunk/arch/arm/plat-mxc/audmux-v2.c +++ b/trunk/arch/arm/plat-mxc/audmux-v2.c @@ -137,7 +137,6 @@ static ssize_t audmux_read_file(struct file *file, char __user *user_buf, static const struct file_operations audmux_debugfs_fops = { .open = audmux_open_file, .read = audmux_read_file, - .llseek = default_llseek, }; static void audmux_debugfs_init(void) diff --git a/trunk/arch/arm/plat-omap/iommu-debug.c b/trunk/arch/arm/plat-omap/iommu-debug.c index f07cf2f08e09..e6c0d536899c 100644 --- a/trunk/arch/arm/plat-omap/iommu-debug.c +++ b/trunk/arch/arm/plat-omap/iommu-debug.c @@ -328,14 +328,12 @@ static int debug_open_generic(struct inode *inode, struct file *file) .open = debug_open_generic, \ .read = debug_read_##name, \ .write = debug_write_##name, \ - .llseek = generic_file_llseek, \ }; #define DEBUG_FOPS_RO(name) \ static const struct file_operations debug_##name##_fops = { \ .open = debug_open_generic, \ .read = debug_read_##name, \ - .llseek = generic_file_llseek, \ }; DEBUG_FOPS_RO(ver); diff --git a/trunk/arch/avr32/boards/mimc200/fram.c b/trunk/arch/avr32/boards/mimc200/fram.c index 9764a1a1073e..54fbd95cee9b 100644 --- a/trunk/arch/avr32/boards/mimc200/fram.c +++ b/trunk/arch/avr32/boards/mimc200/fram.c @@ -41,7 +41,6 @@ static int fram_mmap(struct file *filp, struct vm_area_struct *vma) static const struct file_operations fram_fops = { .owner = THIS_MODULE, .mmap = fram_mmap, - .llseek = noop_llseek, }; #define FRAM_MINOR 0 diff --git a/trunk/arch/blackfin/kernel/kgdb_test.c b/trunk/arch/blackfin/kernel/kgdb_test.c index 08c0236acf3c..9a4b07594389 100644 --- a/trunk/arch/blackfin/kernel/kgdb_test.c +++ b/trunk/arch/blackfin/kernel/kgdb_test.c @@ -88,7 +88,6 @@ static const struct file_operations kgdb_test_proc_fops = { .owner = THIS_MODULE, .read = kgdb_test_proc_read, .write = kgdb_test_proc_write, - .llseek = noop_llseek, }; static int __init kgdbtest_init(void) diff --git a/trunk/arch/blackfin/mach-bf561/coreb.c b/trunk/arch/blackfin/mach-bf561/coreb.c index c6a4c8f2d37b..deb2271d09a3 100644 --- a/trunk/arch/blackfin/mach-bf561/coreb.c +++ b/trunk/arch/blackfin/mach-bf561/coreb.c @@ -51,7 +51,6 @@ coreb_ioctl(struct file *file, unsigned int cmd, unsigned long arg) static const struct file_operations coreb_fops = { .owner = THIS_MODULE, .unlocked_ioctl = coreb_ioctl, - .llseek = noop_llseek, }; static struct miscdevice coreb_dev = { diff --git a/trunk/arch/cris/arch-v10/drivers/ds1302.c b/trunk/arch/cris/arch-v10/drivers/ds1302.c index 3d655dcc65da..884275629ef7 100644 --- a/trunk/arch/cris/arch-v10/drivers/ds1302.c +++ b/trunk/arch/cris/arch-v10/drivers/ds1302.c @@ -19,7 +19,7 @@ #include #include #include -#include +#include #include #include @@ -34,7 +34,6 @@ #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. @@ -358,9 +357,9 @@ static long rtc_unlocked_ioctl(struct file *file, unsigned int cmd, unsigned lon { int ret; - mutex_lock(&ds1302_mutex); + lock_kernel(); ret = rtc_ioctl(file, cmd, arg); - mutex_unlock(&ds1302_mutex); + unlock_kernel(); return ret; } @@ -388,7 +387,6 @@ print_rtc_status(void) static const struct file_operations rtc_fops = { .owner = THIS_MODULE, .unlocked_ioctl = rtc_unlocked_ioctl, - .llseek = noop_llseek, }; /* Probe for the chip by writing something to its RAM and try reading it back. */ diff --git a/trunk/arch/cris/arch-v10/drivers/gpio.c b/trunk/arch/cris/arch-v10/drivers/gpio.c index a276f0811731..a07b6d25b0c7 100644 --- a/trunk/arch/cris/arch-v10/drivers/gpio.c +++ b/trunk/arch/cris/arch-v10/drivers/gpio.c @@ -745,7 +745,6 @@ static const struct file_operations gpio_fops = { .write = gpio_write, .open = gpio_open, .release = gpio_release, - .llseek = noop_llseek, }; static void ioif_watcher(const unsigned int gpio_in_available, diff --git a/trunk/arch/cris/arch-v10/drivers/i2c.c b/trunk/arch/cris/arch-v10/drivers/i2c.c index c413539d4205..77a941813819 100644 --- a/trunk/arch/cris/arch-v10/drivers/i2c.c +++ b/trunk/arch/cris/arch-v10/drivers/i2c.c @@ -617,7 +617,6 @@ static const struct file_operations i2c_fops = { .unlocked_ioctl = i2c_ioctl, .open = i2c_open, .release = i2c_release, - .llseek = noop_llseek, }; int __init diff --git a/trunk/arch/cris/arch-v10/drivers/pcf8563.c b/trunk/arch/cris/arch-v10/drivers/pcf8563.c index ea69faba9b62..7dcb1f85f42b 100644 --- a/trunk/arch/cris/arch-v10/drivers/pcf8563.c +++ b/trunk/arch/cris/arch-v10/drivers/pcf8563.c @@ -27,6 +27,7 @@ #include #include #include +#include #include #include @@ -48,7 +49,6 @@ #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[] = @@ -64,7 +64,6 @@ static int voltage_low; static const struct file_operations pcf8563_fops = { .owner = THIS_MODULE, .unlocked_ioctl = pcf8563_unlocked_ioctl, - .llseek = noop_llseek, }; unsigned char @@ -344,9 +343,9 @@ static long pcf8563_unlocked_ioctl(struct file *filp, unsigned int cmd, unsigned { int ret; - mutex_lock(&pcf8563_mutex); + lock_kernel(); return pcf8563_ioctl(filp, cmd, arg); - mutex_unlock(&pcf8563_mutex); + unlock_kernel(); return ret; } diff --git a/trunk/arch/cris/arch-v10/drivers/sync_serial.c b/trunk/arch/cris/arch-v10/drivers/sync_serial.c index 399dc1ec8e6f..ee2dd4323daf 100644 --- a/trunk/arch/cris/arch-v10/drivers/sync_serial.c +++ b/trunk/arch/cris/arch-v10/drivers/sync_serial.c @@ -20,7 +20,7 @@ #include #include #include -#include +#include #include #include #include @@ -149,7 +149,6 @@ 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); @@ -251,8 +250,7 @@ static const struct file_operations sync_serial_fops = { .poll = sync_serial_poll, .unlocked_ioctl = sync_serial_ioctl, .open = sync_serial_open, - .release = sync_serial_release, - .llseek = noop_llseek, + .release = sync_serial_release }; static int __init etrax_sync_serial_init(void) @@ -447,7 +445,7 @@ static int sync_serial_open(struct inode *inode, struct file *file) int mode; int err = -EBUSY; - mutex_lock(&sync_serial_mutex); + lock_kernel(); DEBUG(printk(KERN_DEBUG "Open sync serial port %d\n", dev)); if (dev < 0 || dev >= NUMBER_OF_PORTS || !ports[dev].enabled) { @@ -628,7 +626,7 @@ static int sync_serial_open(struct inode *inode, struct file *file) ret = 0; out: - mutex_unlock(&sync_serial_mutex); + unlock_kernel(); return ret; } @@ -963,9 +961,9 @@ static long sync_serial_ioctl(struct file *file, { long ret; - mutex_lock(&sync_serial_mutex); + lock_kernel(); ret = sync_serial_ioctl_unlocked(file, cmd, arg); - mutex_unlock(&sync_serial_mutex); + unlock_kernel(); return ret; } diff --git a/trunk/arch/cris/arch-v32/drivers/cryptocop.c b/trunk/arch/cris/arch-v32/drivers/cryptocop.c index c03bc3bc30c2..b07646a30509 100644 --- a/trunk/arch/cris/arch-v32/drivers/cryptocop.c +++ b/trunk/arch/cris/arch-v32/drivers/cryptocop.c @@ -281,8 +281,7 @@ const struct file_operations cryptocop_fops = { .owner = THIS_MODULE, .open = cryptocop_open, .release = cryptocop_release, - .unlocked_ioctl = cryptocop_ioctl, - .llseek = noop_llseek, + .unlocked_ioctl = cryptocop_ioctl }; @@ -3140,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; - mutex_lock(&cryptocop_mutex); + lock_kernel(); ret = cryptocop_ioctl_unlocked(inode, filp, cmd, arg); - mutex_unlock(&cryptocop_mutex); + unlock_kernel(); return ret; } diff --git a/trunk/arch/cris/arch-v32/drivers/i2c.c b/trunk/arch/cris/arch-v32/drivers/i2c.c index ddb23996f11a..5a3e900c9a78 100644 --- a/trunk/arch/cris/arch-v32/drivers/i2c.c +++ b/trunk/arch/cris/arch-v32/drivers/i2c.c @@ -698,7 +698,6 @@ static const struct file_operations i2c_fops = { .unlocked_ioctl = i2c_ioctl, .open = i2c_open, .release = i2c_release, - .llseek = noop_llseek, }; static int __init i2c_init(void) diff --git a/trunk/arch/cris/arch-v32/drivers/mach-a3/gpio.c b/trunk/arch/cris/arch-v32/drivers/mach-a3/gpio.c index c845831e2225..2dcd27adbad4 100644 --- a/trunk/arch/cris/arch-v32/drivers/mach-a3/gpio.c +++ b/trunk/arch/cris/arch-v32/drivers/mach-a3/gpio.c @@ -23,7 +23,7 @@ #include #include #include -#include +#include #include #include @@ -66,7 +66,6 @@ static int dp_cnt; #define DP(x) #endif -static DEFINE_MUTEX(gpio_mutex); static char gpio_name[] = "etrax gpio"; #ifdef CONFIG_ETRAX_VIRTUAL_GPIO @@ -392,7 +391,7 @@ static int gpio_open(struct inode *inode, struct file *filp) if (!priv) return -ENOMEM; - mutex_lock(&gpio_mutex); + lock_kernel(); memset(priv, 0, sizeof(*priv)); priv->minor = p; @@ -415,7 +414,7 @@ static int gpio_open(struct inode *inode, struct file *filp) spin_unlock_irq(&gpio_lock); } - mutex_unlock(&gpio_mutex); + unlock_kernel(); return 0; } @@ -668,9 +667,9 @@ static long gpio_ioctl(struct file *file, unsigned int cmd, unsigned long arg) { long ret; - mutex_lock(&gpio_mutex); + lock_kernel(); ret = gpio_ioctl_unlocked(file, cmd, arg); - mutex_unlock(&gpio_mutex); + unlock_kernel(); return ret; } @@ -894,7 +893,6 @@ static const struct file_operations gpio_fops = { .write = gpio_write, .open = gpio_open, .release = gpio_release, - .llseek = noop_llseek, }; #ifdef CONFIG_ETRAX_VIRTUAL_GPIO diff --git a/trunk/arch/cris/arch-v32/drivers/mach-fs/gpio.c b/trunk/arch/cris/arch-v32/drivers/mach-fs/gpio.c index ee90d2659be7..5ec8a7d4e7d7 100644 --- a/trunk/arch/cris/arch-v32/drivers/mach-fs/gpio.c +++ b/trunk/arch/cris/arch-v32/drivers/mach-fs/gpio.c @@ -22,7 +22,7 @@ #include #include #include -#include +#include #include #include @@ -64,7 +64,6 @@ static int dp_cnt; #define DP(x) #endif -static DEFINE_MUTEX(gpio_mutex); static char gpio_name[] = "etrax gpio"; #if 0 @@ -430,7 +429,7 @@ gpio_open(struct inode *inode, struct file *filp) if (!priv) return -ENOMEM; - mutex_lock(&gpio_mutex); + lock_kernel(); memset(priv, 0, sizeof(*priv)); priv->minor = p; @@ -451,7 +450,7 @@ gpio_open(struct inode *inode, struct file *filp) alarmlist = priv; spin_unlock_irq(&alarm_lock); - mutex_unlock(&gpio_mutex); + unlock_kernel(); return 0; } @@ -709,9 +708,9 @@ static long gpio_ioctl(struct file *file, unsigned int cmd, unsigned long arg) { long ret; - mutex_lock(&gpio_mutex); + lock_kernel(); ret = gpio_ioctl_unlocked(file, cmd, arg); - mutex_unlock(&gpio_mutex); + unlock_kernel(); return ret; } @@ -871,7 +870,6 @@ static const struct file_operations gpio_fops = { .write = gpio_write, .open = gpio_open, .release = gpio_release, - .llseek = noop_llseek, }; #ifdef CONFIG_ETRAX_VIRTUAL_GPIO diff --git a/trunk/arch/cris/arch-v32/drivers/pcf8563.c b/trunk/arch/cris/arch-v32/drivers/pcf8563.c index b6e4fc0aad42..bef6eb53b153 100644 --- a/trunk/arch/cris/arch-v32/drivers/pcf8563.c +++ b/trunk/arch/cris/arch-v32/drivers/pcf8563.c @@ -24,6 +24,7 @@ #include #include #include +#include #include #include #include @@ -44,7 +45,6 @@ #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[] = @@ -60,7 +60,6 @@ static int voltage_low; static const struct file_operations pcf8563_fops = { .owner = THIS_MODULE, .unlocked_ioctl = pcf8563_unlocked_ioctl, - .llseek = noop_llseek, }; unsigned char @@ -340,9 +339,9 @@ static long pcf8563_unlocked_ioctl(struct file *filp, unsigned int cmd, unsigned { int ret; - mutex_lock(&pcf8563_mutex); + lock_kernel(); return pcf8563_ioctl(filp, cmd, arg); - mutex_unlock(&pcf8563_mutex); + unlock_kernel(); return ret; } diff --git a/trunk/arch/cris/arch-v32/drivers/sync_serial.c b/trunk/arch/cris/arch-v32/drivers/sync_serial.c index c8637a9195ea..ca248f3adb80 100644 --- a/trunk/arch/cris/arch-v32/drivers/sync_serial.c +++ b/trunk/arch/cris/arch-v32/drivers/sync_serial.c @@ -13,7 +13,7 @@ #include #include #include -#include +#include #include #include #include @@ -145,7 +145,6 @@ 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); @@ -248,8 +247,7 @@ static const struct file_operations sync_serial_fops = { .poll = sync_serial_poll, .unlocked_ioctl = sync_serial_ioctl, .open = sync_serial_open, - .release = sync_serial_release, - .llseek = noop_llseek, + .release = sync_serial_release }; static int __init etrax_sync_serial_init(void) @@ -436,7 +434,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}; - mutex_lock(&sync_serial_mutex); + lock_kernel(); DEBUG(printk(KERN_DEBUG "Open sync serial port %d\n", dev)); if (dev < 0 || dev >= NBR_PORTS || !ports[dev].enabled) @@ -585,7 +583,7 @@ static int sync_serial_open(struct inode *inode, struct file *file) port->busy++; ret = 0; out: - mutex_unlock(&sync_serial_mutex); + unlock_kernel(); return ret; } @@ -968,9 +966,9 @@ static long sync_serial_ioctl(struct file *file, { long ret; - mutex_lock(&sync_serial_mutex); + lock_kernel(); ret = sync_serial_ioctl_unlocked(file, cmd, arg); - mutex_unlock(&sync_serial_mutex); + unlock_kernel(); return ret; } diff --git a/trunk/arch/cris/kernel/profile.c b/trunk/arch/cris/kernel/profile.c index b82e08615d1b..195ec5fa0dd2 100644 --- a/trunk/arch/cris/kernel/profile.c +++ b/trunk/arch/cris/kernel/profile.c @@ -59,7 +59,6 @@ write_cris_profile(struct file *file, const char __user *buf, static const struct file_operations cris_proc_profile_operations = { .read = read_cris_profile, .write = write_cris_profile, - .llseek = default_llseek, }; static int __init init_cris_profile(void) diff --git a/trunk/arch/ia64/kernel/salinfo.c b/trunk/arch/ia64/kernel/salinfo.c index 79802e540e53..45d7543b69cc 100644 --- a/trunk/arch/ia64/kernel/salinfo.c +++ b/trunk/arch/ia64/kernel/salinfo.c @@ -354,7 +354,6 @@ salinfo_event_read(struct file *file, char __user *buffer, size_t count, loff_t static const struct file_operations salinfo_event_fops = { .open = salinfo_event_open, .read = salinfo_event_read, - .llseek = noop_llseek, }; static int @@ -572,7 +571,6 @@ static const struct file_operations salinfo_data_fops = { .release = salinfo_log_release, .read = salinfo_log_read, .write = salinfo_log_write, - .llseek = default_llseek, }; static int __cpuinit diff --git a/trunk/arch/ia64/sn/kernel/sn2/sn_hwperf.c b/trunk/arch/ia64/sn/kernel/sn2/sn_hwperf.c index 30862c0358cd..fa1eceed0d23 100644 --- a/trunk/arch/ia64/sn/kernel/sn2/sn_hwperf.c +++ b/trunk/arch/ia64/sn/kernel/sn2/sn_hwperf.c @@ -860,7 +860,6 @@ static long sn_hwperf_ioctl(struct file *fp, u32 op, unsigned long arg) static const struct file_operations sn_hwperf_fops = { .unlocked_ioctl = sn_hwperf_ioctl, - .llseek = noop_llseek, }; static struct miscdevice sn_hwperf_dev = { diff --git a/trunk/arch/m68k/bvme6000/rtc.c b/trunk/arch/m68k/bvme6000/rtc.c index 1c4d4c7bf4d4..cb8617bb194b 100644 --- a/trunk/arch/m68k/bvme6000/rtc.c +++ b/trunk/arch/m68k/bvme6000/rtc.c @@ -155,7 +155,6 @@ static const struct file_operations rtc_fops = { .unlocked_ioctl = rtc_ioctl, .open = rtc_open, .release = rtc_release, - .llseek = noop_llseek, }; static struct miscdevice rtc_dev = { diff --git a/trunk/arch/m68k/mvme16x/rtc.c b/trunk/arch/m68k/mvme16x/rtc.c index 39c79ebcd18a..11ac6f63967a 100644 --- a/trunk/arch/m68k/mvme16x/rtc.c +++ b/trunk/arch/m68k/mvme16x/rtc.c @@ -144,7 +144,6 @@ static const struct file_operations rtc_fops = { .unlocked_ioctl = rtc_ioctl, .open = rtc_open, .release = rtc_release, - .llseek = noop_llseek, }; static struct miscdevice rtc_dev= diff --git a/trunk/arch/mips/kernel/rtlx.c b/trunk/arch/mips/kernel/rtlx.c index 557ef72472e0..26f9b9ab19cc 100644 --- a/trunk/arch/mips/kernel/rtlx.c +++ b/trunk/arch/mips/kernel/rtlx.c @@ -468,8 +468,7 @@ static const struct file_operations rtlx_fops = { .release = file_release, .write = file_write, .read = file_read, - .poll = file_poll, - .llseek = noop_llseek, + .poll = file_poll }; static struct irqaction rtlx_irq = { diff --git a/trunk/arch/mips/kernel/vpe.c b/trunk/arch/mips/kernel/vpe.c index 3eb3cde2f661..2bd2151c586a 100644 --- a/trunk/arch/mips/kernel/vpe.c +++ b/trunk/arch/mips/kernel/vpe.c @@ -1192,8 +1192,7 @@ static const struct file_operations vpe_fops = { .owner = THIS_MODULE, .open = vpe_open, .release = vpe_release, - .write = vpe_write, - .llseek = noop_llseek, + .write = vpe_write }; /* module wrapper entry points */ diff --git a/trunk/arch/mips/sibyte/common/sb_tbprof.c b/trunk/arch/mips/sibyte/common/sb_tbprof.c index ca35b730d189..d4ed7a9156f5 100644 --- a/trunk/arch/mips/sibyte/common/sb_tbprof.c +++ b/trunk/arch/mips/sibyte/common/sb_tbprof.c @@ -545,7 +545,6 @@ static const struct file_operations sbprof_tb_fops = { .unlocked_ioctl = sbprof_tb_ioctl, .compat_ioctl = sbprof_tb_ioctl, .mmap = NULL, - .llseek = default_llseek, }; static struct class *tb_class; diff --git a/trunk/arch/parisc/kernel/perf.c b/trunk/arch/parisc/kernel/perf.c index ba0c053e25ae..f9f6783e4bdd 100644 --- a/trunk/arch/parisc/kernel/perf.c +++ b/trunk/arch/parisc/kernel/perf.c @@ -46,6 +46,7 @@ #include #include #include +#include #include #include @@ -260,13 +261,16 @@ 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; } diff --git a/trunk/arch/powerpc/kernel/lparcfg.c b/trunk/arch/powerpc/kernel/lparcfg.c index 16468362ad57..8d9e3b9cda64 100644 --- a/trunk/arch/powerpc/kernel/lparcfg.c +++ b/trunk/arch/powerpc/kernel/lparcfg.c @@ -780,7 +780,6 @@ static const struct file_operations lparcfg_fops = { .write = lparcfg_write, .open = lparcfg_open, .release = single_release, - .llseek = seq_lseek, }; static int __init lparcfg_init(void) diff --git a/trunk/arch/powerpc/kernel/rtas_flash.c b/trunk/arch/powerpc/kernel/rtas_flash.c index 2b442e6c21e6..67a84d8f118d 100644 --- a/trunk/arch/powerpc/kernel/rtas_flash.c +++ b/trunk/arch/powerpc/kernel/rtas_flash.c @@ -716,7 +716,6 @@ static const struct file_operations rtas_flash_operations = { .write = rtas_flash_write, .open = rtas_excl_open, .release = rtas_flash_release, - .llseek = default_llseek, }; static const struct file_operations manage_flash_operations = { @@ -725,7 +724,6 @@ static const struct file_operations manage_flash_operations = { .write = manage_flash_write, .open = rtas_excl_open, .release = rtas_excl_release, - .llseek = default_llseek, }; static const struct file_operations validate_flash_operations = { @@ -734,7 +732,6 @@ static const struct file_operations validate_flash_operations = { .write = validate_flash_write, .open = rtas_excl_open, .release = validate_flash_release, - .llseek = default_llseek, }; static int __init rtas_flash_init(void) diff --git a/trunk/arch/powerpc/kernel/rtasd.c b/trunk/arch/powerpc/kernel/rtasd.c index 0438f819fe6b..638883e23e3a 100644 --- a/trunk/arch/powerpc/kernel/rtasd.c +++ b/trunk/arch/powerpc/kernel/rtasd.c @@ -354,7 +354,6 @@ static const struct file_operations proc_rtas_log_operations = { .poll = rtas_log_poll, .open = rtas_log_open, .release = rtas_log_release, - .llseek = noop_llseek, }; static int enable_surveillance(int timeout) diff --git a/trunk/arch/powerpc/platforms/iseries/mf.c b/trunk/arch/powerpc/platforms/iseries/mf.c index 42d0a886de05..33e5fc7334fc 100644 --- a/trunk/arch/powerpc/platforms/iseries/mf.c +++ b/trunk/arch/powerpc/platforms/iseries/mf.c @@ -1249,7 +1249,6 @@ static ssize_t proc_mf_change_vmlinux(struct file *file, static const struct file_operations proc_vmlinux_operations = { .write = proc_mf_change_vmlinux, - .llseek = default_llseek, }; static int __init mf_proc_init(void) diff --git a/trunk/arch/powerpc/platforms/pseries/reconfig.c b/trunk/arch/powerpc/platforms/pseries/reconfig.c index 1de2cbb92303..57ddbb43b33a 100644 --- a/trunk/arch/powerpc/platforms/pseries/reconfig.c +++ b/trunk/arch/powerpc/platforms/pseries/reconfig.c @@ -539,8 +539,7 @@ static ssize_t ofdt_write(struct file *file, const char __user *buf, size_t coun } static const struct file_operations ofdt_fops = { - .write = ofdt_write, - .llseek = noop_llseek, + .write = ofdt_write }; /* create /proc/powerpc/ofdt write-only by root */ diff --git a/trunk/arch/powerpc/platforms/pseries/scanlog.c b/trunk/arch/powerpc/platforms/pseries/scanlog.c index 554457294a2b..80e9e7652a4d 100644 --- a/trunk/arch/powerpc/platforms/pseries/scanlog.c +++ b/trunk/arch/powerpc/platforms/pseries/scanlog.c @@ -170,7 +170,6 @@ const struct file_operations scanlog_fops = { .write = scanlog_write, .open = scanlog_open, .release = scanlog_release, - .llseek = noop_llseek, }; static int __init scanlog_init(void) diff --git a/trunk/arch/s390/crypto/prng.c b/trunk/arch/s390/crypto/prng.c index 975e3ab13cb5..aa819dac2360 100644 --- a/trunk/arch/s390/crypto/prng.c +++ b/trunk/arch/s390/crypto/prng.c @@ -152,7 +152,6 @@ static const struct file_operations prng_fops = { .open = &prng_open, .release = NULL, .read = &prng_read, - .llseek = noop_llseek, }; static struct miscdevice prng_dev = { diff --git a/trunk/arch/s390/hypfs/hypfs_diag.c b/trunk/arch/s390/hypfs/hypfs_diag.c index 020e51c063d2..1211bb1d2f24 100644 --- a/trunk/arch/s390/hypfs/hypfs_diag.c +++ b/trunk/arch/s390/hypfs/hypfs_diag.c @@ -618,7 +618,6 @@ static const struct file_operations dbfs_d204_ops = { .open = dbfs_d204_open, .read = dbfs_d204_read, .release = dbfs_d204_release, - .llseek = no_llseek, }; static int hypfs_dbfs_init(void) diff --git a/trunk/arch/s390/hypfs/hypfs_vm.c b/trunk/arch/s390/hypfs/hypfs_vm.c index 26cf177f6a3a..ee5ab1a578e7 100644 --- a/trunk/arch/s390/hypfs/hypfs_vm.c +++ b/trunk/arch/s390/hypfs/hypfs_vm.c @@ -275,7 +275,6 @@ static const struct file_operations dbfs_d2fc_ops = { .open = dbfs_d2fc_open, .read = dbfs_d2fc_read, .release = dbfs_d2fc_release, - .llseek = no_llseek, }; int hypfs_vm_init(void) diff --git a/trunk/arch/s390/hypfs/inode.c b/trunk/arch/s390/hypfs/inode.c index 74d98670be27..98a4a4c267a7 100644 --- a/trunk/arch/s390/hypfs/inode.c +++ b/trunk/arch/s390/hypfs/inode.c @@ -449,7 +449,6 @@ static const struct file_operations hypfs_file_ops = { .write = do_sync_write, .aio_read = hypfs_aio_read, .aio_write = hypfs_aio_write, - .llseek = no_llseek, }; static struct file_system_type hypfs_type = { diff --git a/trunk/arch/s390/kernel/debug.c b/trunk/arch/s390/kernel/debug.c index 5ad6bc078bfd..98192261491d 100644 --- a/trunk/arch/s390/kernel/debug.c +++ b/trunk/arch/s390/kernel/debug.c @@ -174,7 +174,6 @@ static const struct file_operations debug_file_ops = { .write = debug_input, .open = debug_open, .release = debug_close, - .llseek = no_llseek, }; static struct dentry *debug_debugfs_root_entry; diff --git a/trunk/arch/sh/boards/mach-landisk/gio.c b/trunk/arch/sh/boards/mach-landisk/gio.c index 8132dff078fb..01e6abb769b9 100644 --- a/trunk/arch/sh/boards/mach-landisk/gio.c +++ b/trunk/arch/sh/boards/mach-landisk/gio.c @@ -128,7 +128,6 @@ static const struct file_operations gio_fops = { .open = gio_open, /* open */ .release = gio_close, /* release */ .unlocked_ioctl = gio_ioctl, - .llseek = noop_llseek, }; static int __init gio_init(void) diff --git a/trunk/arch/sparc/kernel/apc.c b/trunk/arch/sparc/kernel/apc.c index 52de4a9424e8..2c0046ecc715 100644 --- a/trunk/arch/sparc/kernel/apc.c +++ b/trunk/arch/sparc/kernel/apc.c @@ -132,7 +132,6 @@ static const struct file_operations apc_fops = { .unlocked_ioctl = apc_ioctl, .open = apc_open, .release = apc_release, - .llseek = noop_llseek, }; static struct miscdevice apc_miscdev = { APC_MINOR, APC_DEVNAME, &apc_fops }; diff --git a/trunk/arch/sparc/kernel/mdesc.c b/trunk/arch/sparc/kernel/mdesc.c index 6addb914fcc8..83e85c2e802a 100644 --- a/trunk/arch/sparc/kernel/mdesc.c +++ b/trunk/arch/sparc/kernel/mdesc.c @@ -890,7 +890,6 @@ static ssize_t mdesc_read(struct file *file, char __user *buf, static const struct file_operations mdesc_fops = { .read = mdesc_read, .owner = THIS_MODULE, - .llseek = noop_llseek, }; static struct miscdevice mdesc_misc = { diff --git a/trunk/arch/tile/include/asm/bitops.h b/trunk/arch/tile/include/asm/bitops.h index 6d4f0ff2c68c..6832b4be8990 100644 --- a/trunk/arch/tile/include/asm/bitops.h +++ b/trunk/arch/tile/include/asm/bitops.h @@ -120,7 +120,6 @@ static inline unsigned long __arch_hweight64(__u64 w) #include #include -#include #include #include #include diff --git a/trunk/arch/tile/kernel/hardwall.c b/trunk/arch/tile/kernel/hardwall.c index 1e54a7843410..584b965dc824 100644 --- a/trunk/arch/tile/kernel/hardwall.c +++ b/trunk/arch/tile/kernel/hardwall.c @@ -774,7 +774,6 @@ static const struct file_operations dev_hardwall_fops = { #endif .flush = hardwall_flush, .release = hardwall_release, - .llseek = noop_llseek, }; static struct cdev hardwall_dev; diff --git a/trunk/arch/um/drivers/harddog_kern.c b/trunk/arch/um/drivers/harddog_kern.c index 2d0266d0254d..cfcac1ff4cf2 100644 --- a/trunk/arch/um/drivers/harddog_kern.c +++ b/trunk/arch/um/drivers/harddog_kern.c @@ -42,7 +42,7 @@ #include #include #include -#include +#include #include #include #include @@ -50,7 +50,6 @@ MODULE_LICENSE("GPL"); -static DEFINE_MUTEX(harddog_mutex); static DEFINE_SPINLOCK(lock); static int timer_alive; static int harddog_in_fd = -1; @@ -67,7 +66,7 @@ static int harddog_open(struct inode *inode, struct file *file) int err = -EBUSY; char *sock = NULL; - mutex_lock(&harddog_mutex); + lock_kernel(); spin_lock(&lock); if(timer_alive) goto err; @@ -84,11 +83,11 @@ static int harddog_open(struct inode *inode, struct file *file) timer_alive = 1; spin_unlock(&lock); - mutex_unlock(&harddog_mutex); + unlock_kernel(); return nonseekable_open(inode, file); err: spin_unlock(&lock); - mutex_unlock(&harddog_mutex); + unlock_kernel(); return err; } @@ -154,9 +153,9 @@ static long harddog_ioctl(struct file *file, { long ret; - mutex_lock(&harddog_mutex); + lock_kernel(); ret = harddog_ioctl_unlocked(file, cmd, arg); - mutex_unlock(&harddog_mutex); + unlock_kernel(); return ret; } @@ -167,7 +166,6 @@ static const struct file_operations harddog_fops = { .unlocked_ioctl = harddog_ioctl, .open = harddog_open, .release = harddog_release, - .llseek = no_llseek, }; static struct miscdevice harddog_miscdev = { diff --git a/trunk/arch/um/drivers/hostaudio_kern.c b/trunk/arch/um/drivers/hostaudio_kern.c index f9f6a4e20590..63c740a85b4c 100644 --- a/trunk/arch/um/drivers/hostaudio_kern.c +++ b/trunk/arch/um/drivers/hostaudio_kern.c @@ -8,7 +8,7 @@ #include "linux/slab.h" #include "linux/sound.h" #include "linux/soundcard.h" -#include "linux/mutex.h" +#include "linux/smp_lock.h" #include "asm/uaccess.h" #include "init.h" #include "os.h" @@ -63,8 +63,6 @@ static int set_mixer(char *name, int *add) __uml_setup("mixer=", set_mixer, "mixer=\n" MIXER_HELP); #endif -static DEFINE_MUTEX(hostaudio_mutex); - /* /dev/dsp file operations */ static ssize_t hostaudio_read(struct file *file, char __user *buffer, @@ -200,9 +198,9 @@ static int hostaudio_open(struct inode *inode, struct file *file) w = 1; kparam_block_sysfs_write(dsp); - mutex_lock(&hostaudio_mutex); + lock_kernel(); ret = os_open_file(dsp, of_set_rw(OPENFLAGS(), r, w), 0); - mutex_unlock(&hostaudio_mutex); + unlock_kernel(); kparam_unblock_sysfs_write(dsp); if (ret < 0) { @@ -261,9 +259,9 @@ static int hostmixer_open_mixdev(struct inode *inode, struct file *file) w = 1; kparam_block_sysfs_write(mixer); - mutex_lock(&hostaudio_mutex); + lock_kernel(); ret = os_open_file(mixer, of_set_rw(OPENFLAGS(), r, w), 0); - mutex_unlock(&hostaudio_mutex); + unlock_kernel(); kparam_unblock_sysfs_write(mixer); if (ret < 0) { diff --git a/trunk/arch/um/drivers/mconsole_kern.c b/trunk/arch/um/drivers/mconsole_kern.c index 975613b23dcf..ebc680717e59 100644 --- a/trunk/arch/um/drivers/mconsole_kern.c +++ b/trunk/arch/um/drivers/mconsole_kern.c @@ -843,7 +843,6 @@ static ssize_t mconsole_proc_write(struct file *file, static const struct file_operations mconsole_proc_fops = { .owner = THIS_MODULE, .write = mconsole_proc_write, - .llseek = noop_llseek, }; static int create_proc_mconsole(void) diff --git a/trunk/arch/um/drivers/mmapper_kern.c b/trunk/arch/um/drivers/mmapper_kern.c index 8501e7d0015c..7158393b6793 100644 --- a/trunk/arch/um/drivers/mmapper_kern.c +++ b/trunk/arch/um/drivers/mmapper_kern.c @@ -93,7 +93,6 @@ static const struct file_operations mmapper_fops = { .mmap = mmapper_mmap, .open = mmapper_open, .release = mmapper_release, - .llseek = default_llseek, }; /* diff --git a/trunk/arch/um/drivers/random.c b/trunk/arch/um/drivers/random.c index 981085a93f30..4949044773ba 100644 --- a/trunk/arch/um/drivers/random.c +++ b/trunk/arch/um/drivers/random.c @@ -100,7 +100,6 @@ static const struct file_operations rng_chrdev_ops = { .owner = THIS_MODULE, .open = rng_dev_open, .read = rng_dev_read, - .llseek = noop_llseek, }; /* rng_init shouldn't be called more than once at boot time */ diff --git a/trunk/arch/um/drivers/ubd_kern.c b/trunk/arch/um/drivers/ubd_kern.c index ba4a98ba39c0..9734994cba1e 100644 --- a/trunk/arch/um/drivers/ubd_kern.c +++ b/trunk/arch/um/drivers/ubd_kern.c @@ -33,7 +33,7 @@ #include "linux/mm.h" #include "linux/slab.h" #include "linux/vmalloc.h" -#include "linux/mutex.h" +#include "linux/smp_lock.h" #include "linux/blkpg.h" #include "linux/genhd.h" #include "linux/spinlock.h" @@ -100,7 +100,6 @@ 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); @@ -1102,7 +1101,7 @@ static int ubd_open(struct block_device *bdev, fmode_t mode) struct ubd *ubd_dev = disk->private_data; int err = 0; - mutex_lock(&ubd_mutex); + lock_kernel(); if(ubd_dev->count == 0){ err = ubd_open_dev(ubd_dev); if(err){ @@ -1121,7 +1120,7 @@ static int ubd_open(struct block_device *bdev, fmode_t mode) err = -EROFS; }*/ out: - mutex_unlock(&ubd_mutex); + unlock_kernel(); return err; } @@ -1129,10 +1128,10 @@ static int ubd_release(struct gendisk *disk, fmode_t mode) { struct ubd *ubd_dev = disk->private_data; - mutex_lock(&ubd_mutex); + lock_kernel(); if(--ubd_dev->count == 0) ubd_close_dev(ubd_dev); - mutex_unlock(&ubd_mutex); + unlock_kernel(); return 0; } diff --git a/trunk/arch/um/kernel/exec.c b/trunk/arch/um/kernel/exec.c index 340268be00b5..49b5e1eb3262 100644 --- a/trunk/arch/um/kernel/exec.c +++ b/trunk/arch/um/kernel/exec.c @@ -78,11 +78,13 @@ 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; } diff --git a/trunk/arch/x86/Kconfig.debug b/trunk/arch/x86/Kconfig.debug index b59ee765414e..e5bb96b10f1a 100644 --- a/trunk/arch/x86/Kconfig.debug +++ b/trunk/arch/x86/Kconfig.debug @@ -125,6 +125,16 @@ config DEBUG_NX_TEST and the software setup of this feature. If in doubt, say "N" +config 4KSTACKS + bool "Use 4Kb for kernel stacks instead of 8Kb" + depends on X86_32 + ---help--- + If you say Y here the kernel will use a 4Kb stacksize for the + kernel stack attached to each process/thread. This facilitates + running more threads on a system and also reduces the pressure + on the VM subsystem for higher order allocations. This option + will also use IRQ stacks to compensate for the reduced stackspace. + config DOUBLEFAULT default y bool "Enable doublefault exception handler" if EMBEDDED diff --git a/trunk/arch/x86/include/asm/bitops.h b/trunk/arch/x86/include/asm/bitops.h index 903683b07e42..bafd80defa43 100644 --- a/trunk/arch/x86/include/asm/bitops.h +++ b/trunk/arch/x86/include/asm/bitops.h @@ -440,8 +440,6 @@ static inline int fls(int x) #ifdef __KERNEL__ -#include - #include #define ARCH_HAS_FAST_MULTIPLIER 1 diff --git a/trunk/arch/x86/include/asm/irq.h b/trunk/arch/x86/include/asm/irq.h index 0bf5b0083650..5458380b6ef8 100644 --- a/trunk/arch/x86/include/asm/irq.h +++ b/trunk/arch/x86/include/asm/irq.h @@ -19,16 +19,18 @@ static inline int irq_canonicalize(int irq) # define ARCH_HAS_NMI_WATCHDOG #endif -#ifdef CONFIG_X86_32 -extern void irq_ctx_init(int cpu); -extern void irq_ctx_exit(int cpu); +#ifdef CONFIG_4KSTACKS + extern void irq_ctx_init(int cpu); + extern void irq_ctx_exit(int cpu); +# define __ARCH_HAS_DO_SOFTIRQ #else # define irq_ctx_init(cpu) do { } while (0) # define irq_ctx_exit(cpu) do { } while (0) +# ifdef CONFIG_X86_64 +# define __ARCH_HAS_DO_SOFTIRQ +# endif #endif -#define __ARCH_HAS_DO_SOFTIRQ - #ifdef CONFIG_HOTPLUG_CPU #include extern void fixup_irqs(void); diff --git a/trunk/arch/x86/include/asm/module.h b/trunk/arch/x86/include/asm/module.h index 67763c5d8b4e..3e2ce58a31a3 100644 --- a/trunk/arch/x86/include/asm/module.h +++ b/trunk/arch/x86/include/asm/module.h @@ -60,7 +60,12 @@ #endif #ifdef CONFIG_X86_32 -# define MODULE_ARCH_VERMAGIC MODULE_PROC_FAMILY +# ifdef CONFIG_4KSTACKS +# define MODULE_STACKSIZE "4KSTACKS " +# else +# define MODULE_STACKSIZE "" +# endif +# define MODULE_ARCH_VERMAGIC MODULE_PROC_FAMILY MODULE_STACKSIZE #endif #endif /* _ASM_X86_MODULE_H */ diff --git a/trunk/arch/x86/include/asm/page_32_types.h b/trunk/arch/x86/include/asm/page_32_types.h index ade619ff9e2a..6f1b7331313f 100644 --- a/trunk/arch/x86/include/asm/page_32_types.h +++ b/trunk/arch/x86/include/asm/page_32_types.h @@ -15,7 +15,11 @@ */ #define __PAGE_OFFSET _AC(CONFIG_PAGE_OFFSET, UL) +#ifdef CONFIG_4KSTACKS +#define THREAD_ORDER 0 +#else #define THREAD_ORDER 1 +#endif #define THREAD_SIZE (PAGE_SIZE << THREAD_ORDER) #define STACKFAULT_STACK 0 diff --git a/trunk/arch/x86/kernel/apm_32.c b/trunk/arch/x86/kernel/apm_32.c index fbbc4dadecc4..4c9c67bf09b7 100644 --- a/trunk/arch/x86/kernel/apm_32.c +++ b/trunk/arch/x86/kernel/apm_32.c @@ -1926,7 +1926,6 @@ static const struct file_operations apm_bios_fops = { .unlocked_ioctl = do_ioctl, .open = do_open, .release = do_release, - .llseek = noop_llseek, }; static struct miscdevice apm_device = { diff --git a/trunk/arch/x86/kernel/cpu/mcheck/mce-severity.c b/trunk/arch/x86/kernel/cpu/mcheck/mce-severity.c index 1e8d66c1336a..8a85dd1b1aa1 100644 --- a/trunk/arch/x86/kernel/cpu/mcheck/mce-severity.c +++ b/trunk/arch/x86/kernel/cpu/mcheck/mce-severity.c @@ -192,7 +192,6 @@ static const struct file_operations severities_coverage_fops = { .release = seq_release, .read = seq_read, .write = severities_coverage_write, - .llseek = seq_lseek, }; static int __init severities_debugfs_init(void) diff --git a/trunk/arch/x86/kernel/cpu/mcheck/mce.c b/trunk/arch/x86/kernel/cpu/mcheck/mce.c index 7a35b72d7c03..ed41562909fe 100644 --- a/trunk/arch/x86/kernel/cpu/mcheck/mce.c +++ b/trunk/arch/x86/kernel/cpu/mcheck/mce.c @@ -1665,7 +1665,6 @@ struct file_operations mce_chrdev_ops = { .read = mce_read, .poll = mce_poll, .unlocked_ioctl = mce_ioctl, - .llseek = no_llseek, }; EXPORT_SYMBOL_GPL(mce_chrdev_ops); diff --git a/trunk/arch/x86/kernel/hpet.c b/trunk/arch/x86/kernel/hpet.c index aff0b3c27509..efaf906daf93 100644 --- a/trunk/arch/x86/kernel/hpet.c +++ b/trunk/arch/x86/kernel/hpet.c @@ -380,35 +380,44 @@ static int hpet_next_event(unsigned long delta, struct clock_event_device *evt, int timer) { u32 cnt; - s32 res; cnt = hpet_readl(HPET_COUNTER); cnt += (u32) delta; hpet_writel(cnt, HPET_Tn_CMP(timer)); /* - * HPETs are a complete disaster. The compare register is - * based on a equal comparison and neither provides a less - * than or equal functionality (which would require to take - * the wraparound into account) nor a simple count down event - * mode. Further the write to the comparator register is - * delayed internally up to two HPET clock cycles in certain - * chipsets (ATI, ICH9,10). We worked around that by reading - * back the compare register, but that required another - * workaround for ICH9,10 chips where the first readout after - * write can return the old stale value. We already have a - * minimum delta of 5us enforced, but a NMI or SMI hitting - * between the counter readout and the comparator write can - * move us behind that point easily. Now instead of reading - * the compare register back several times, we make the ETIME - * decision based on the following: Return ETIME if the - * counter value after the write is less than 8 HPET cycles - * away from the event or if the counter is already ahead of - * the event. + * We need to read back the CMP register on certain HPET + * implementations (ATI chipsets) which seem to delay the + * transfer of the compare register into the internal compare + * logic. With small deltas this might actually be too late as + * the counter could already be higher than the compare value + * at that point and we would wait for the next hpet interrupt + * forever. We found out that reading the CMP register back + * forces the transfer so we can rely on the comparison with + * the counter register below. If the read back from the + * compare register does not match the value we programmed + * then we might have a real hardware problem. We can not do + * much about it here, but at least alert the user/admin with + * a prominent warning. + * + * An erratum on some chipsets (ICH9,..), results in + * comparator read immediately following a write returning old + * value. Workaround for this is to read this value second + * time, when first read returns old value. + * + * In fact the write to the comparator register is delayed up + * to two HPET cycles so the workaround we tried to restrict + * the readback to those known to be borked ATI chipsets + * failed miserably. So we give up on optimizations forever + * and penalize all HPET incarnations unconditionally. */ - res = (s32)(cnt - hpet_readl(HPET_COUNTER)); + if (unlikely((u32)hpet_readl(HPET_Tn_CMP(timer)) != cnt)) { + if (hpet_readl(HPET_Tn_CMP(timer)) != cnt) + printk_once(KERN_WARNING + "hpet: compare register read back failed.\n"); + } - return res < 8 ? -ETIME : 0; + return (s32)(hpet_readl(HPET_COUNTER) - cnt) >= 0 ? -ETIME : 0; } static void hpet_legacy_set_mode(enum clock_event_mode mode, diff --git a/trunk/arch/x86/kernel/irq_32.c b/trunk/arch/x86/kernel/irq_32.c index 50fbbe60e507..10709f29d166 100644 --- a/trunk/arch/x86/kernel/irq_32.c +++ b/trunk/arch/x86/kernel/irq_32.c @@ -49,19 +49,20 @@ static inline int check_stack_overflow(void) { return 0; } static inline void print_stack_overflow(void) { } #endif +#ifdef CONFIG_4KSTACKS /* * per-CPU IRQ handling contexts (thread information and stack) */ union irq_ctx { struct thread_info tinfo; u32 stack[THREAD_SIZE/sizeof(u32)]; -} __attribute__((aligned(THREAD_SIZE))); +} __attribute__((aligned(PAGE_SIZE))); static DEFINE_PER_CPU(union irq_ctx *, hardirq_ctx); static DEFINE_PER_CPU(union irq_ctx *, softirq_ctx); -static DEFINE_PER_CPU_MULTIPAGE_ALIGNED(union irq_ctx, hardirq_stack, THREAD_SIZE); -static DEFINE_PER_CPU_MULTIPAGE_ALIGNED(union irq_ctx, softirq_stack, THREAD_SIZE); +static DEFINE_PER_CPU_PAGE_ALIGNED(union irq_ctx, hardirq_stack); +static DEFINE_PER_CPU_PAGE_ALIGNED(union irq_ctx, softirq_stack); static void call_on_stack(void *func, void *stack) { @@ -186,6 +187,11 @@ asmlinkage void do_softirq(void) local_irq_restore(flags); } +#else +static inline int +execute_on_irq_stack(int overflow, struct irq_desc *desc, int irq) { return 0; } +#endif + bool handle_irq(unsigned irq, struct pt_regs *regs) { struct irq_desc *desc; diff --git a/trunk/arch/x86/kernel/kdebugfs.c b/trunk/arch/x86/kernel/kdebugfs.c index 90fcf62854bb..8afd9f321f10 100644 --- a/trunk/arch/x86/kernel/kdebugfs.c +++ b/trunk/arch/x86/kernel/kdebugfs.c @@ -78,7 +78,6 @@ static int setup_data_open(struct inode *inode, struct file *file) static const struct file_operations fops_setup_data = { .read = setup_data_read, .open = setup_data_open, - .llseek = default_llseek, }; static int __init diff --git a/trunk/arch/x86/kernel/microcode_core.c b/trunk/arch/x86/kernel/microcode_core.c index 0b3d37e83606..fa6551d36c10 100644 --- a/trunk/arch/x86/kernel/microcode_core.c +++ b/trunk/arch/x86/kernel/microcode_core.c @@ -232,7 +232,6 @@ static const struct file_operations microcode_fops = { .owner = THIS_MODULE, .write = microcode_write, .open = microcode_open, - .llseek = no_llseek, }; static struct miscdevice microcode_dev = { diff --git a/trunk/arch/x86/kernel/tlb_uv.c b/trunk/arch/x86/kernel/tlb_uv.c index 50ac949c7f1c..312ef0292815 100644 --- a/trunk/arch/x86/kernel/tlb_uv.c +++ b/trunk/arch/x86/kernel/tlb_uv.c @@ -1285,7 +1285,6 @@ static const struct file_operations tunables_fops = { .open = tunables_open, .read = tunables_read, .write = tunables_write, - .llseek = default_llseek, }; static int __init uv_ptc_init(void) diff --git a/trunk/arch/x86/kernel/vmlinux.lds.S b/trunk/arch/x86/kernel/vmlinux.lds.S index e03530aebfd0..38e2b67807e1 100644 --- a/trunk/arch/x86/kernel/vmlinux.lds.S +++ b/trunk/arch/x86/kernel/vmlinux.lds.S @@ -301,7 +301,7 @@ SECTIONS } #if !defined(CONFIG_X86_64) || !defined(CONFIG_SMP) - PERCPU(THREAD_SIZE) + PERCPU(PAGE_SIZE) #endif . = ALIGN(PAGE_SIZE); diff --git a/trunk/arch/x86/xen/debugfs.c b/trunk/arch/x86/xen/debugfs.c index 7c0fedd98ea0..1304bcec8ee5 100644 --- a/trunk/arch/x86/xen/debugfs.c +++ b/trunk/arch/x86/xen/debugfs.c @@ -106,7 +106,6 @@ static const struct file_operations u32_array_fops = { .open = u32_array_open, .release= xen_array_release, .read = u32_array_read, - .llseek = no_llseek, }; struct dentry *xen_debugfs_create_u32_array(const char *name, mode_t mode, diff --git a/trunk/block/bsg.c b/trunk/block/bsg.c index f20d6a789d48..0c00870553a3 100644 --- a/trunk/block/bsg.c +++ b/trunk/block/bsg.c @@ -20,6 +20,7 @@ #include #include #include +#include #include #include @@ -842,7 +843,9 @@ static int bsg_open(struct inode *inode, struct file *file) { struct bsg_device *bd; + lock_kernel(); bd = bsg_get_device(inode, file); + unlock_kernel(); if (IS_ERR(bd)) return PTR_ERR(bd); @@ -965,7 +968,6 @@ static const struct file_operations bsg_fops = { .release = bsg_release, .unlocked_ioctl = bsg_ioctl, .owner = THIS_MODULE, - .llseek = default_llseek, }; void bsg_unregister_queue(struct request_queue *q) diff --git a/trunk/drivers/acpi/apei/erst-dbg.c b/trunk/drivers/acpi/apei/erst-dbg.c index de73caf3cebc..da1228a9a544 100644 --- a/trunk/drivers/acpi/apei/erst-dbg.c +++ b/trunk/drivers/acpi/apei/erst-dbg.c @@ -184,7 +184,6 @@ static const struct file_operations erst_dbg_ops = { .read = erst_dbg_read, .write = erst_dbg_write, .unlocked_ioctl = erst_dbg_ioctl, - .llseek = no_llseek, }; static struct miscdevice erst_dbg_dev = { diff --git a/trunk/drivers/acpi/debugfs.c b/trunk/drivers/acpi/debugfs.c index 6355b575ee5a..7de27d49c4b9 100644 --- a/trunk/drivers/acpi/debugfs.c +++ b/trunk/drivers/acpi/debugfs.c @@ -69,7 +69,6 @@ static ssize_t cm_write(struct file *file, const char __user * user_buf, static const struct file_operations cm_fops = { .write = cm_write, - .llseek = default_llseek, }; int __init acpi_debugfs_init(void) diff --git a/trunk/drivers/acpi/ec_sys.c b/trunk/drivers/acpi/ec_sys.c index 411620ef84c2..0e869b3f81ca 100644 --- a/trunk/drivers/acpi/ec_sys.c +++ b/trunk/drivers/acpi/ec_sys.c @@ -101,7 +101,6 @@ static struct file_operations acpi_ec_io_ops = { .open = acpi_ec_open_io, .read = acpi_ec_read_io, .write = acpi_ec_write_io, - .llseek = default_llseek, }; int acpi_ec_add_debugfs(struct acpi_ec *ec, unsigned int ec_device_count) diff --git a/trunk/drivers/acpi/event.c b/trunk/drivers/acpi/event.c index 85d908993809..d439314a75d8 100644 --- a/trunk/drivers/acpi/event.c +++ b/trunk/drivers/acpi/event.c @@ -110,7 +110,6 @@ static const struct file_operations acpi_system_event_ops = { .read = acpi_system_read_event, .release = acpi_system_close_event, .poll = acpi_system_poll_event, - .llseek = default_llseek, }; #endif /* CONFIG_ACPI_PROC_EVENT */ diff --git a/trunk/drivers/block/DAC960.c b/trunk/drivers/block/DAC960.c index 1f286ab461d3..4e2c367fec11 100644 --- a/trunk/drivers/block/DAC960.c +++ b/trunk/drivers/block/DAC960.c @@ -36,7 +36,7 @@ #include #include #include -#include +#include #include #include #include @@ -54,7 +54,6 @@ #define DAC960_GAM_MINOR 252 -static DEFINE_MUTEX(DAC960_mutex); static DAC960_Controller_T *DAC960_Controllers[DAC960_MaxControllers]; static int DAC960_ControllerCount; static struct proc_dir_entry *DAC960_ProcDirectoryEntry; @@ -82,7 +81,7 @@ static int DAC960_open(struct block_device *bdev, fmode_t mode) int drive_nr = (long)disk->private_data; int ret = -ENXIO; - mutex_lock(&DAC960_mutex); + lock_kernel(); if (p->FirmwareType == DAC960_V1_Controller) { if (p->V1.LogicalDriveInformation[drive_nr]. LogicalDriveState == DAC960_V1_LogicalDrive_Offline) @@ -100,7 +99,7 @@ static int DAC960_open(struct block_device *bdev, fmode_t mode) goto out; ret = 0; out: - mutex_unlock(&DAC960_mutex); + unlock_kernel(); return ret; } @@ -6626,7 +6625,7 @@ static long DAC960_gam_ioctl(struct file *file, unsigned int Request, long ErrorCode = 0; if (!capable(CAP_SYS_ADMIN)) return -EACCES; - mutex_lock(&DAC960_mutex); + lock_kernel(); switch (Request) { case DAC960_IOCTL_GET_CONTROLLER_COUNT: @@ -7057,14 +7056,13 @@ static long DAC960_gam_ioctl(struct file *file, unsigned int Request, default: ErrorCode = -ENOTTY; } - mutex_unlock(&DAC960_mutex); + unlock_kernel(); return ErrorCode; } static const struct file_operations DAC960_gam_fops = { .owner = THIS_MODULE, - .unlocked_ioctl = DAC960_gam_ioctl, - .llseek = noop_llseek, + .unlocked_ioctl = DAC960_gam_ioctl }; static struct miscdevice DAC960_gam_dev = { diff --git a/trunk/drivers/block/amiflop.c b/trunk/drivers/block/amiflop.c index 4b852c962266..76f114f0bba3 100644 --- a/trunk/drivers/block/amiflop.c +++ b/trunk/drivers/block/amiflop.c @@ -60,7 +60,7 @@ #include #include #include -#include +#include #include #include #include @@ -109,7 +109,6 @@ #define FD_HD_3 0x55555555 /* high-density 3.5" (1760K) drive */ #define FD_DD_5 0xaaaaaaaa /* double-density 5.25" (440K) drive */ -static DEFINE_MUTEX(amiflop_mutex); static unsigned long int fd_def_df0 = FD_DD_3; /* default for df0 if it doesn't identify */ module_param(fd_def_df0, ulong, 0); @@ -1507,9 +1506,9 @@ static int fd_ioctl(struct block_device *bdev, fmode_t mode, { int ret; - mutex_lock(&amiflop_mutex); + lock_kernel(); ret = fd_locked_ioctl(bdev, mode, cmd, param); - mutex_unlock(&amiflop_mutex); + unlock_kernel(); return ret; } @@ -1556,11 +1555,11 @@ static int floppy_open(struct block_device *bdev, fmode_t mode) int old_dev; unsigned long flags; - mutex_lock(&amiflop_mutex); + lock_kernel(); old_dev = fd_device[drive]; if (fd_ref[drive] && old_dev != system) { - mutex_unlock(&amiflop_mutex); + unlock_kernel(); return -EBUSY; } @@ -1576,7 +1575,7 @@ static int floppy_open(struct block_device *bdev, fmode_t mode) rel_fdc(); if (wrprot) { - mutex_unlock(&amiflop_mutex); + unlock_kernel(); return -EROFS; } } @@ -1595,7 +1594,7 @@ static int floppy_open(struct block_device *bdev, fmode_t mode) printk(KERN_INFO "fd%d: accessing %s-disk with %s-layout\n",drive, unit[drive].type->name, data_types[system].name); - mutex_unlock(&amiflop_mutex); + unlock_kernel(); return 0; } @@ -1604,7 +1603,7 @@ static int floppy_release(struct gendisk *disk, fmode_t mode) struct amiga_floppy_struct *p = disk->private_data; int drive = p - unit; - mutex_lock(&amiflop_mutex); + lock_kernel(); if (unit[drive].dirty == 1) { del_timer (flush_track_timer + drive); non_int_flush_track (drive); @@ -1618,7 +1617,7 @@ static int floppy_release(struct gendisk *disk, fmode_t mode) /* the mod_use counter is handled this way */ floppy_off (drive | 0x40000000); #endif - mutex_unlock(&amiflop_mutex); + unlock_kernel(); return 0; } diff --git a/trunk/drivers/block/aoe/aoeblk.c b/trunk/drivers/block/aoe/aoeblk.c index f21c237a9e5e..a946929735a5 100644 --- a/trunk/drivers/block/aoe/aoeblk.c +++ b/trunk/drivers/block/aoe/aoeblk.c @@ -12,10 +12,9 @@ #include #include #include -#include +#include #include "aoe.h" -static DEFINE_MUTEX(aoeblk_mutex); static struct kmem_cache *buf_pool_cache; static ssize_t aoedisk_show_state(struct device *dev, @@ -126,16 +125,16 @@ aoeblk_open(struct block_device *bdev, fmode_t mode) struct aoedev *d = bdev->bd_disk->private_data; ulong flags; - mutex_lock(&aoeblk_mutex); + lock_kernel(); spin_lock_irqsave(&d->lock, flags); if (d->flags & DEVFL_UP) { d->nopen++; spin_unlock_irqrestore(&d->lock, flags); - mutex_unlock(&aoeblk_mutex); + unlock_kernel(); return 0; } spin_unlock_irqrestore(&d->lock, flags); - mutex_unlock(&aoeblk_mutex); + unlock_kernel(); return -ENODEV; } diff --git a/trunk/drivers/block/aoe/aoechr.c b/trunk/drivers/block/aoe/aoechr.c index 146296ca4965..4a1b9e7464aa 100644 --- a/trunk/drivers/block/aoe/aoechr.c +++ b/trunk/drivers/block/aoe/aoechr.c @@ -9,7 +9,7 @@ #include #include #include -#include +#include #include #include "aoe.h" @@ -37,7 +37,6 @@ struct ErrMsg { char *msg; }; -static DEFINE_MUTEX(aoechr_mutex); static struct ErrMsg emsgs[NMSG]; static int emsgs_head_idx, emsgs_tail_idx; static struct completion emsgs_comp; @@ -184,16 +183,16 @@ aoechr_open(struct inode *inode, struct file *filp) { int n, i; - mutex_lock(&aoechr_mutex); + lock_kernel(); n = iminor(inode); filp->private_data = (void *) (unsigned long) n; for (i = 0; i < ARRAY_SIZE(chardevs); ++i) if (chardevs[i].minor == n) { - mutex_unlock(&aoechr_mutex); + unlock_kernel(); return 0; } - mutex_unlock(&aoechr_mutex); + unlock_kernel(); return -EINVAL; } @@ -266,7 +265,6 @@ static const struct file_operations aoe_fops = { .open = aoechr_open, .release = aoechr_rel, .owner = THIS_MODULE, - .llseek = noop_llseek, }; static char *aoe_devnode(struct device *dev, mode_t *mode) diff --git a/trunk/drivers/block/ataflop.c b/trunk/drivers/block/ataflop.c index 8c021bb7a991..aceb96476524 100644 --- a/trunk/drivers/block/ataflop.c +++ b/trunk/drivers/block/ataflop.c @@ -67,7 +67,7 @@ #include #include #include -#include +#include #include #include @@ -79,7 +79,6 @@ #undef DEBUG -static DEFINE_MUTEX(ataflop_mutex); static struct request_queue *floppy_queue; static struct request *fd_request; @@ -1672,9 +1671,9 @@ static int fd_ioctl(struct block_device *bdev, fmode_t mode, { int ret; - mutex_lock(&ataflop_mutex); + lock_kernel(); ret = fd_locked_ioctl(bdev, mode, cmd, arg); - mutex_unlock(&ataflop_mutex); + unlock_kernel(); return ret; } @@ -1855,9 +1854,9 @@ static int floppy_unlocked_open(struct block_device *bdev, fmode_t mode) { int ret; - mutex_lock(&ataflop_mutex); + lock_kernel(); ret = floppy_open(bdev, mode); - mutex_unlock(&ataflop_mutex); + unlock_kernel(); return ret; } @@ -1865,14 +1864,14 @@ static int floppy_unlocked_open(struct block_device *bdev, fmode_t mode) static int floppy_release(struct gendisk *disk, fmode_t mode) { struct atari_floppy_struct *p = disk->private_data; - mutex_lock(&ataflop_mutex); + lock_kernel(); if (p->ref < 0) p->ref = 0; else if (!p->ref--) { printk(KERN_ERR "floppy_release with fd_ref == 0"); p->ref = 0; } - mutex_unlock(&ataflop_mutex); + unlock_kernel(); return 0; } diff --git a/trunk/drivers/block/brd.c b/trunk/drivers/block/brd.c index 82bfd5bb4a97..1c7f63792ff8 100644 --- a/trunk/drivers/block/brd.c +++ b/trunk/drivers/block/brd.c @@ -15,7 +15,7 @@ #include #include #include -#include +#include #include #include /* invalidate_bh_lrus() */ #include @@ -55,7 +55,6 @@ struct brd_device { /* * Look up and return a brd's page for a given sector. */ -static DEFINE_MUTEX(brd_mutex); static struct page *brd_lookup_page(struct brd_device *brd, sector_t sector) { pgoff_t idx; @@ -403,7 +402,7 @@ static int brd_ioctl(struct block_device *bdev, fmode_t mode, * ram device BLKFLSBUF has special semantics, we want to actually * release and destroy the ramdisk data. */ - mutex_lock(&brd_mutex); + lock_kernel(); mutex_lock(&bdev->bd_mutex); error = -EBUSY; if (bdev->bd_openers <= 1) { @@ -420,7 +419,7 @@ static int brd_ioctl(struct block_device *bdev, fmode_t mode, error = 0; } mutex_unlock(&bdev->bd_mutex); - mutex_unlock(&brd_mutex); + unlock_kernel(); return error; } diff --git a/trunk/drivers/block/cciss.c b/trunk/drivers/block/cciss.c index c484c96e22a6..5e4fadcdece9 100644 --- a/trunk/drivers/block/cciss.c +++ b/trunk/drivers/block/cciss.c @@ -26,6 +26,7 @@ #include #include #include +#include #include #include #include @@ -65,7 +66,6 @@ MODULE_SUPPORTED_DEVICE("HP Smart Array Controllers"); MODULE_VERSION("3.6.26"); MODULE_LICENSE("GPL"); -static DEFINE_MUTEX(cciss_mutex); static int cciss_allow_hpsa; module_param(cciss_allow_hpsa, int, S_IRUGO|S_IWUSR); MODULE_PARM_DESC(cciss_allow_hpsa, @@ -1059,9 +1059,9 @@ static int cciss_unlocked_open(struct block_device *bdev, fmode_t mode) { int ret; - mutex_lock(&cciss_mutex); + lock_kernel(); ret = cciss_open(bdev, mode); - mutex_unlock(&cciss_mutex); + unlock_kernel(); return ret; } @@ -1074,13 +1074,13 @@ static int cciss_release(struct gendisk *disk, fmode_t mode) ctlr_info_t *h; drive_info_struct *drv; - mutex_lock(&cciss_mutex); + lock_kernel(); h = get_host(disk); drv = get_drv(disk); dev_dbg(&h->pdev->dev, "cciss_release %s\n", disk->disk_name); drv->usage_count--; h->usage_count--; - mutex_unlock(&cciss_mutex); + unlock_kernel(); return 0; } @@ -1088,9 +1088,9 @@ static int do_ioctl(struct block_device *bdev, fmode_t mode, unsigned cmd, unsigned long arg) { int ret; - mutex_lock(&cciss_mutex); + lock_kernel(); ret = cciss_ioctl(bdev, mode, cmd, arg); - mutex_unlock(&cciss_mutex); + unlock_kernel(); return ret; } diff --git a/trunk/drivers/block/cpqarray.c b/trunk/drivers/block/cpqarray.c index 946dad4caef3..d53b0291c44b 100644 --- a/trunk/drivers/block/cpqarray.c +++ b/trunk/drivers/block/cpqarray.c @@ -35,7 +35,7 @@ #include #include #include -#include +#include #include #include #include @@ -68,7 +68,6 @@ MODULE_LICENSE("GPL"); #define CPQARRAY_DMA_MASK 0xFFFFFFFF /* 32 bit DMA */ -static DEFINE_MUTEX(cpqarray_mutex); static int nr_ctlr; static ctlr_info_t *hba[MAX_CTLR]; @@ -846,9 +845,9 @@ static int ida_unlocked_open(struct block_device *bdev, fmode_t mode) { int ret; - mutex_lock(&cpqarray_mutex); + lock_kernel(); ret = ida_open(bdev, mode); - mutex_unlock(&cpqarray_mutex); + unlock_kernel(); return ret; } @@ -860,10 +859,10 @@ static int ida_release(struct gendisk *disk, fmode_t mode) { ctlr_info_t *host; - mutex_lock(&cpqarray_mutex); + lock_kernel(); host = get_host(disk); host->usage_count--; - mutex_unlock(&cpqarray_mutex); + unlock_kernel(); return 0; } @@ -1218,9 +1217,9 @@ static int ida_ioctl(struct block_device *bdev, fmode_t mode, { int ret; - mutex_lock(&cpqarray_mutex); + lock_kernel(); ret = ida_locked_ioctl(bdev, mode, cmd, param); - mutex_unlock(&cpqarray_mutex); + unlock_kernel(); return ret; } diff --git a/trunk/drivers/block/drbd/drbd_main.c b/trunk/drivers/block/drbd/drbd_main.c index e4b56119866e..fa650dd85b90 100644 --- a/trunk/drivers/block/drbd/drbd_main.c +++ b/trunk/drivers/block/drbd/drbd_main.c @@ -32,7 +32,7 @@ #include #include #include -#include +#include #include #include #include @@ -64,7 +64,6 @@ struct after_state_chg_work { struct completion *done; }; -static DEFINE_MUTEX(drbd_main_mutex); int drbdd_init(struct drbd_thread *); int drbd_worker(struct drbd_thread *); int drbd_asender(struct drbd_thread *); @@ -2537,7 +2536,7 @@ static int drbd_open(struct block_device *bdev, fmode_t mode) unsigned long flags; int rv = 0; - mutex_lock(&drbd_main_mutex); + lock_kernel(); spin_lock_irqsave(&mdev->req_lock, flags); /* to have a stable mdev->state.role * and no race with updating open_cnt */ @@ -2552,7 +2551,7 @@ static int drbd_open(struct block_device *bdev, fmode_t mode) if (!rv) mdev->open_cnt++; spin_unlock_irqrestore(&mdev->req_lock, flags); - mutex_unlock(&drbd_main_mutex); + unlock_kernel(); return rv; } @@ -2560,9 +2559,9 @@ static int drbd_open(struct block_device *bdev, fmode_t mode) static int drbd_release(struct gendisk *gd, fmode_t mode) { struct drbd_conf *mdev = gd->private_data; - mutex_lock(&drbd_main_mutex); + lock_kernel(); mdev->open_cnt--; - mutex_unlock(&drbd_main_mutex); + unlock_kernel(); return 0; } diff --git a/trunk/drivers/block/floppy.c b/trunk/drivers/block/floppy.c index 3b57459bb745..cf04c1b234ed 100644 --- a/trunk/drivers/block/floppy.c +++ b/trunk/drivers/block/floppy.c @@ -178,6 +178,7 @@ static int print_unex = 1; #include #include #include +#include #include #include #include @@ -198,7 +199,6 @@ static int print_unex = 1; * It's been recommended that take about 1/4 of the default speed * in some more extreme cases. */ -static DEFINE_MUTEX(floppy_mutex); static int slow_floppy; #include @@ -3553,9 +3553,9 @@ static int fd_ioctl(struct block_device *bdev, fmode_t mode, { int ret; - mutex_lock(&floppy_mutex); + lock_kernel(); ret = fd_locked_ioctl(bdev, mode, cmd, param); - mutex_unlock(&floppy_mutex); + unlock_kernel(); return ret; } @@ -3616,7 +3616,7 @@ static int floppy_release(struct gendisk *disk, fmode_t mode) { int drive = (long)disk->private_data; - mutex_lock(&floppy_mutex); + lock_kernel(); mutex_lock(&open_lock); if (UDRS->fd_ref < 0) UDRS->fd_ref = 0; @@ -3627,7 +3627,7 @@ static int floppy_release(struct gendisk *disk, fmode_t mode) if (!UDRS->fd_ref) opened_bdev[drive] = NULL; mutex_unlock(&open_lock); - mutex_unlock(&floppy_mutex); + unlock_kernel(); return 0; } @@ -3645,7 +3645,7 @@ static int floppy_open(struct block_device *bdev, fmode_t mode) int res = -EBUSY; char *tmp; - mutex_lock(&floppy_mutex); + lock_kernel(); mutex_lock(&open_lock); old_dev = UDRS->fd_device; if (opened_bdev[drive] && opened_bdev[drive] != bdev) @@ -3722,7 +3722,7 @@ static int floppy_open(struct block_device *bdev, fmode_t mode) goto out; } mutex_unlock(&open_lock); - mutex_unlock(&floppy_mutex); + unlock_kernel(); return 0; out: if (UDRS->fd_ref < 0) @@ -3733,7 +3733,7 @@ static int floppy_open(struct block_device *bdev, fmode_t mode) opened_bdev[drive] = NULL; out2: mutex_unlock(&open_lock); - mutex_unlock(&floppy_mutex); + unlock_kernel(); return res; } diff --git a/trunk/drivers/block/loop.c b/trunk/drivers/block/loop.c index a10c8c9b6b78..91797bbbe702 100644 --- a/trunk/drivers/block/loop.c +++ b/trunk/drivers/block/loop.c @@ -67,7 +67,7 @@ #include #include #include -#include +#include #include #include /* for invalidate_bdev() */ #include @@ -77,7 +77,6 @@ #include -static DEFINE_MUTEX(loop_mutex); static LIST_HEAD(loop_devices); static DEFINE_MUTEX(loop_devices_mutex); @@ -1410,11 +1409,11 @@ static int lo_open(struct block_device *bdev, fmode_t mode) { struct loop_device *lo = bdev->bd_disk->private_data; - mutex_lock(&loop_mutex); + lock_kernel(); mutex_lock(&lo->lo_ctl_mutex); lo->lo_refcnt++; mutex_unlock(&lo->lo_ctl_mutex); - mutex_unlock(&loop_mutex); + unlock_kernel(); return 0; } @@ -1424,7 +1423,7 @@ static int lo_release(struct gendisk *disk, fmode_t mode) struct loop_device *lo = disk->private_data; int err; - mutex_lock(&loop_mutex); + lock_kernel(); mutex_lock(&lo->lo_ctl_mutex); if (--lo->lo_refcnt) @@ -1449,7 +1448,7 @@ static int lo_release(struct gendisk *disk, fmode_t mode) out: mutex_unlock(&lo->lo_ctl_mutex); out_unlocked: - mutex_unlock(&loop_mutex); + lock_kernel(); return 0; } diff --git a/trunk/drivers/block/nbd.c b/trunk/drivers/block/nbd.c index a32fb41246f8..0daa422aa281 100644 --- a/trunk/drivers/block/nbd.c +++ b/trunk/drivers/block/nbd.c @@ -24,7 +24,7 @@ #include #include #include -#include +#include #include #include #include @@ -53,7 +53,6 @@ #define DBG_BLKDEV 0x0100 #define DBG_RX 0x0200 #define DBG_TX 0x0400 -static DEFINE_MUTEX(nbd_mutex); static unsigned int debugflags; #endif /* NDEBUG */ @@ -718,11 +717,11 @@ static int nbd_ioctl(struct block_device *bdev, fmode_t mode, dprintk(DBG_IOCTL, "%s: nbd_ioctl cmd=%s(0x%x) arg=%lu\n", lo->disk->disk_name, ioctl_cmd_to_ascii(cmd), cmd, arg); - mutex_lock(&nbd_mutex); + lock_kernel(); mutex_lock(&lo->tx_lock); error = __nbd_ioctl(bdev, lo, cmd, arg); mutex_unlock(&lo->tx_lock); - mutex_unlock(&nbd_mutex); + unlock_kernel(); return error; } diff --git a/trunk/drivers/block/paride/pcd.c b/trunk/drivers/block/paride/pcd.c index 62cec6afd7ad..76f8565e1e8d 100644 --- a/trunk/drivers/block/paride/pcd.c +++ b/trunk/drivers/block/paride/pcd.c @@ -138,10 +138,9 @@ enum {D_PRT, D_PRO, D_UNI, D_MOD, D_SLV, D_DLY}; #include #include #include -#include +#include #include -static DEFINE_MUTEX(pcd_mutex); static DEFINE_SPINLOCK(pcd_lock); module_param(verbose, bool, 0644); @@ -228,9 +227,9 @@ static int pcd_block_open(struct block_device *bdev, fmode_t mode) struct pcd_unit *cd = bdev->bd_disk->private_data; int ret; - mutex_lock(&pcd_mutex); + lock_kernel(); ret = cdrom_open(&cd->info, bdev, mode); - mutex_unlock(&pcd_mutex); + unlock_kernel(); return ret; } @@ -238,9 +237,9 @@ static int pcd_block_open(struct block_device *bdev, fmode_t mode) static int pcd_block_release(struct gendisk *disk, fmode_t mode) { struct pcd_unit *cd = disk->private_data; - mutex_lock(&pcd_mutex); + lock_kernel(); cdrom_release(&cd->info, mode); - mutex_unlock(&pcd_mutex); + unlock_kernel(); return 0; } @@ -250,9 +249,9 @@ static int pcd_block_ioctl(struct block_device *bdev, fmode_t mode, struct pcd_unit *cd = bdev->bd_disk->private_data; int ret; - mutex_lock(&pcd_mutex); + lock_kernel(); ret = cdrom_ioctl(&cd->info, bdev, mode, cmd, arg); - mutex_unlock(&pcd_mutex); + unlock_kernel(); return ret; } diff --git a/trunk/drivers/block/paride/pd.c b/trunk/drivers/block/paride/pd.c index c0ee1558b9bb..985f0d4f1d1e 100644 --- a/trunk/drivers/block/paride/pd.c +++ b/trunk/drivers/block/paride/pd.c @@ -153,11 +153,10 @@ enum {D_PRT, D_PRO, D_UNI, D_MOD, D_GEO, D_SBY, D_DLY, D_SLV}; #include #include #include -#include +#include #include #include -static DEFINE_MUTEX(pd_mutex); static DEFINE_SPINLOCK(pd_lock); module_param(verbose, bool, 0); @@ -737,14 +736,14 @@ static int pd_open(struct block_device *bdev, fmode_t mode) { struct pd_unit *disk = bdev->bd_disk->private_data; - mutex_lock(&pd_mutex); + lock_kernel(); disk->access++; if (disk->removable) { pd_special_command(disk, pd_media_check); pd_special_command(disk, pd_door_lock); } - mutex_unlock(&pd_mutex); + unlock_kernel(); return 0; } @@ -772,10 +771,10 @@ static int pd_ioctl(struct block_device *bdev, fmode_t mode, switch (cmd) { case CDROMEJECT: - mutex_lock(&pd_mutex); + lock_kernel(); if (disk->access == 1) pd_special_command(disk, pd_eject); - mutex_unlock(&pd_mutex); + unlock_kernel(); return 0; default: return -EINVAL; @@ -786,10 +785,10 @@ static int pd_release(struct gendisk *p, fmode_t mode) { struct pd_unit *disk = p->private_data; - mutex_lock(&pd_mutex); + lock_kernel(); if (!--disk->access && disk->removable) pd_special_command(disk, pd_door_unlock); - mutex_unlock(&pd_mutex); + unlock_kernel(); return 0; } diff --git a/trunk/drivers/block/paride/pf.c b/trunk/drivers/block/paride/pf.c index 635f25dd9e10..4457b494882a 100644 --- a/trunk/drivers/block/paride/pf.c +++ b/trunk/drivers/block/paride/pf.c @@ -152,10 +152,9 @@ enum {D_PRT, D_PRO, D_UNI, D_MOD, D_SLV, D_LUN, D_DLY}; #include #include #include -#include +#include #include -static DEFINE_MUTEX(pf_mutex); static DEFINE_SPINLOCK(pf_spin_lock); module_param(verbose, bool, 0644); @@ -303,7 +302,7 @@ static int pf_open(struct block_device *bdev, fmode_t mode) struct pf_unit *pf = bdev->bd_disk->private_data; int ret; - mutex_lock(&pf_mutex); + lock_kernel(); pf_identify(pf); ret = -ENODEV; @@ -319,7 +318,7 @@ static int pf_open(struct block_device *bdev, fmode_t mode) if (pf->removable) pf_lock(pf, 1); out: - mutex_unlock(&pf_mutex); + unlock_kernel(); return ret; } @@ -350,9 +349,9 @@ static int pf_ioctl(struct block_device *bdev, fmode_t mode, unsigned int cmd, u if (pf->access != 1) return -EBUSY; - mutex_lock(&pf_mutex); + lock_kernel(); pf_eject(pf); - mutex_unlock(&pf_mutex); + unlock_kernel(); return 0; } @@ -361,9 +360,9 @@ static int pf_release(struct gendisk *disk, fmode_t mode) { struct pf_unit *pf = disk->private_data; - mutex_lock(&pf_mutex); + lock_kernel(); if (pf->access <= 0) { - mutex_unlock(&pf_mutex); + unlock_kernel(); return -EINVAL; } @@ -372,7 +371,7 @@ static int pf_release(struct gendisk *disk, fmode_t mode) if (!pf->access && pf->removable) pf_lock(pf, 0); - mutex_unlock(&pf_mutex); + unlock_kernel(); return 0; } diff --git a/trunk/drivers/block/paride/pg.c b/trunk/drivers/block/paride/pg.c index 6b9a2000d56a..c397b3ddba9b 100644 --- a/trunk/drivers/block/paride/pg.c +++ b/trunk/drivers/block/paride/pg.c @@ -162,7 +162,7 @@ enum {D_PRT, D_PRO, D_UNI, D_MOD, D_SLV, D_DLY}; #include #include #include /* current, TASK_* */ -#include +#include #include #include @@ -193,7 +193,6 @@ module_param_array(drive3, int, NULL, 0); #define ATAPI_IDENTIFY 0x12 -static DEFINE_MUTEX(pg_mutex); static int pg_open(struct inode *inode, struct file *file); static int pg_release(struct inode *inode, struct file *file); static ssize_t pg_read(struct file *filp, char __user *buf, @@ -235,7 +234,6 @@ static const struct file_operations pg_fops = { .write = pg_write, .open = pg_open, .release = pg_release, - .llseek = noop_llseek, }; static void pg_init_units(void) @@ -520,7 +518,7 @@ static int pg_open(struct inode *inode, struct file *file) struct pg *dev = &devices[unit]; int ret = 0; - mutex_lock(&pg_mutex); + lock_kernel(); if ((unit >= PG_UNITS) || (!dev->present)) { ret = -ENODEV; goto out; @@ -549,7 +547,7 @@ static int pg_open(struct inode *inode, struct file *file) file->private_data = dev; out: - mutex_unlock(&pg_mutex); + unlock_kernel(); return ret; } diff --git a/trunk/drivers/block/paride/pt.c b/trunk/drivers/block/paride/pt.c index 7179f79d7468..bc5825fdeaab 100644 --- a/trunk/drivers/block/paride/pt.c +++ b/trunk/drivers/block/paride/pt.c @@ -146,7 +146,7 @@ static int (*drives[4])[6] = {&drive0, &drive1, &drive2, &drive3}; #include #include #include /* current, TASK_*, schedule_timeout() */ -#include +#include #include @@ -189,7 +189,6 @@ module_param_array(drive3, int, NULL, 0); #define ATAPI_MODE_SENSE 0x1a #define ATAPI_LOG_SENSE 0x4d -static DEFINE_MUTEX(pt_mutex); static int pt_open(struct inode *inode, struct file *file); static long pt_ioctl(struct file *file, unsigned int cmd, unsigned long arg); static int pt_release(struct inode *inode, struct file *file); @@ -240,7 +239,6 @@ static const struct file_operations pt_fops = { .unlocked_ioctl = pt_ioctl, .open = pt_open, .release = pt_release, - .llseek = noop_llseek, }; /* sysfs class support */ @@ -652,9 +650,9 @@ static int pt_open(struct inode *inode, struct file *file) struct pt_unit *tape = pt + unit; int err; - mutex_lock(&pt_mutex); + lock_kernel(); if (unit >= PT_UNITS || (!tape->present)) { - mutex_unlock(&pt_mutex); + unlock_kernel(); return -ENODEV; } @@ -683,12 +681,12 @@ static int pt_open(struct inode *inode, struct file *file) } file->private_data = tape; - mutex_unlock(&pt_mutex); + unlock_kernel(); return 0; out: atomic_inc(&tape->available); - mutex_unlock(&pt_mutex); + unlock_kernel(); return err; } @@ -706,15 +704,15 @@ static long pt_ioctl(struct file *file, unsigned int cmd, unsigned long arg) switch (mtop.mt_op) { case MTREW: - mutex_lock(&pt_mutex); + lock_kernel(); pt_rewind(tape); - mutex_unlock(&pt_mutex); + unlock_kernel(); return 0; case MTWEOF: - mutex_lock(&pt_mutex); + lock_kernel(); pt_write_fm(tape); - mutex_unlock(&pt_mutex); + unlock_kernel(); return 0; default: diff --git a/trunk/drivers/block/pktcdvd.c b/trunk/drivers/block/pktcdvd.c index ef58fccadad3..37a2bb595076 100644 --- a/trunk/drivers/block/pktcdvd.c +++ b/trunk/drivers/block/pktcdvd.c @@ -57,6 +57,7 @@ #include #include #include +#include #include #include #include @@ -85,7 +86,6 @@ #define ZONE(sector, pd) (((sector) + (pd)->offset) & ~((pd)->settings.size - 1)) -static DEFINE_MUTEX(pktcdvd_mutex); static struct pktcdvd_device *pkt_devs[MAX_WRITERS]; static struct proc_dir_entry *pkt_proc; static int pktdev_major; @@ -2383,7 +2383,7 @@ static int pkt_open(struct block_device *bdev, fmode_t mode) VPRINTK(DRIVER_NAME": entering open\n"); - mutex_lock(&pktcdvd_mutex); + lock_kernel(); mutex_lock(&ctl_mutex); pd = pkt_find_dev_from_minor(MINOR(bdev->bd_dev)); if (!pd) { @@ -2411,7 +2411,7 @@ static int pkt_open(struct block_device *bdev, fmode_t mode) } mutex_unlock(&ctl_mutex); - mutex_unlock(&pktcdvd_mutex); + unlock_kernel(); return 0; out_dec: @@ -2419,7 +2419,7 @@ static int pkt_open(struct block_device *bdev, fmode_t mode) out: VPRINTK(DRIVER_NAME": failed open (%d)\n", ret); mutex_unlock(&ctl_mutex); - mutex_unlock(&pktcdvd_mutex); + unlock_kernel(); return ret; } @@ -2428,7 +2428,7 @@ static int pkt_close(struct gendisk *disk, fmode_t mode) struct pktcdvd_device *pd = disk->private_data; int ret = 0; - mutex_lock(&pktcdvd_mutex); + lock_kernel(); mutex_lock(&ctl_mutex); pd->refcnt--; BUG_ON(pd->refcnt < 0); @@ -2437,7 +2437,7 @@ static int pkt_close(struct gendisk *disk, fmode_t mode) pkt_release_dev(pd, flush); } mutex_unlock(&ctl_mutex); - mutex_unlock(&pktcdvd_mutex); + unlock_kernel(); return ret; } @@ -2773,7 +2773,7 @@ static int pkt_ioctl(struct block_device *bdev, fmode_t mode, unsigned int cmd, VPRINTK("pkt_ioctl: cmd %x, dev %d:%d\n", cmd, MAJOR(bdev->bd_dev), MINOR(bdev->bd_dev)); - mutex_lock(&pktcdvd_mutex); + lock_kernel(); switch (cmd) { case CDROMEJECT: /* @@ -2798,7 +2798,7 @@ static int pkt_ioctl(struct block_device *bdev, fmode_t mode, unsigned int cmd, VPRINTK(DRIVER_NAME": Unknown ioctl for %s (%x)\n", pd->name, cmd); ret = -ENOTTY; } - mutex_unlock(&pktcdvd_mutex); + unlock_kernel(); return ret; } @@ -3046,7 +3046,6 @@ static const struct file_operations pkt_ctl_fops = { .compat_ioctl = pkt_ctl_compat_ioctl, #endif .owner = THIS_MODULE, - .llseek = no_llseek, }; static struct miscdevice pkt_misc = { diff --git a/trunk/drivers/block/swim.c b/trunk/drivers/block/swim.c index 75333d0a3327..2e46815876df 100644 --- a/trunk/drivers/block/swim.c +++ b/trunk/drivers/block/swim.c @@ -20,7 +20,7 @@ #include #include #include -#include +#include #include #include #include @@ -222,7 +222,6 @@ extern int swim_read_sector_header(struct swim __iomem *base, extern int swim_read_sector_data(struct swim __iomem *base, unsigned char *data); -static DEFINE_MUTEX(swim_mutex); static inline void set_swim_mode(struct swim __iomem *base, int enable) { struct iwm __iomem *iwm_base; @@ -667,9 +666,9 @@ static int floppy_unlocked_open(struct block_device *bdev, fmode_t mode) { int ret; - mutex_lock(&swim_mutex); + lock_kernel(); ret = floppy_open(bdev, mode); - mutex_unlock(&swim_mutex); + unlock_kernel(); return ret; } @@ -679,7 +678,7 @@ static int floppy_release(struct gendisk *disk, fmode_t mode) struct floppy_state *fs = disk->private_data; struct swim __iomem *base = fs->swd->base; - mutex_lock(&swim_mutex); + lock_kernel(); if (fs->ref_count < 0) fs->ref_count = 0; else if (fs->ref_count > 0) @@ -687,7 +686,7 @@ static int floppy_release(struct gendisk *disk, fmode_t mode) if (fs->ref_count == 0) swim_motor(base, OFF); - mutex_unlock(&swim_mutex); + unlock_kernel(); return 0; } @@ -705,9 +704,9 @@ static int floppy_ioctl(struct block_device *bdev, fmode_t mode, case FDEJECT: if (fs->ref_count != 1) return -EBUSY; - mutex_lock(&swim_mutex); + lock_kernel(); err = floppy_eject(fs); - mutex_unlock(&swim_mutex); + unlock_kernel(); return err; case FDGETPRM: diff --git a/trunk/drivers/block/swim3.c b/trunk/drivers/block/swim3.c index bf3a5b859299..cc6a3864822c 100644 --- a/trunk/drivers/block/swim3.c +++ b/trunk/drivers/block/swim3.c @@ -25,7 +25,7 @@ #include #include #include -#include +#include #include #include #include @@ -36,7 +36,6 @@ #include #include -static DEFINE_MUTEX(swim3_mutex); static struct request_queue *swim3_queue; static struct gendisk *disks[2]; static struct request *fd_req; @@ -874,9 +873,9 @@ static int floppy_ioctl(struct block_device *bdev, fmode_t mode, { int ret; - mutex_lock(&swim3_mutex); + lock_kernel(); ret = floppy_locked_ioctl(bdev, mode, cmd, param); - mutex_unlock(&swim3_mutex); + unlock_kernel(); return ret; } @@ -954,9 +953,9 @@ static int floppy_unlocked_open(struct block_device *bdev, fmode_t mode) { int ret; - mutex_lock(&swim3_mutex); + lock_kernel(); ret = floppy_open(bdev, mode); - mutex_unlock(&swim3_mutex); + unlock_kernel(); return ret; } @@ -965,13 +964,13 @@ static int floppy_release(struct gendisk *disk, fmode_t mode) { struct floppy_state *fs = disk->private_data; struct swim3 __iomem *sw = fs->swim3; - mutex_lock(&swim3_mutex); + lock_kernel(); if (fs->ref_count > 0 && --fs->ref_count == 0) { swim3_action(fs, MOTOR_OFF); out_8(&sw->control_bic, 0xff); swim3_select(fs, RELAX); } - mutex_unlock(&swim3_mutex); + unlock_kernel(); return 0; } diff --git a/trunk/drivers/block/ub.c b/trunk/drivers/block/ub.c index b5690a045a01..c48e14878582 100644 --- a/trunk/drivers/block/ub.c +++ b/trunk/drivers/block/ub.c @@ -28,7 +28,7 @@ #include #include #include -#include +#include #include #define DRV_NAME "ub" @@ -248,7 +248,6 @@ struct ub_completion { spinlock_t lock; }; -static DEFINE_MUTEX(ub_mutex); static inline void ub_init_completion(struct ub_completion *x) { x->done = 0; @@ -1716,9 +1715,9 @@ static int ub_bd_unlocked_open(struct block_device *bdev, fmode_t mode) { int ret; - mutex_lock(&ub_mutex); + lock_kernel(); ret = ub_bd_open(bdev, mode); - mutex_unlock(&ub_mutex); + unlock_kernel(); return ret; } @@ -1731,9 +1730,9 @@ static int ub_bd_release(struct gendisk *disk, fmode_t mode) struct ub_lun *lun = disk->private_data; struct ub_dev *sc = lun->udev; - mutex_lock(&ub_mutex); + lock_kernel(); ub_put(sc); - mutex_unlock(&ub_mutex); + unlock_kernel(); return 0; } @@ -1748,9 +1747,9 @@ static int ub_bd_ioctl(struct block_device *bdev, fmode_t mode, void __user *usermem = (void __user *) arg; int ret; - mutex_lock(&ub_mutex); + lock_kernel(); ret = scsi_cmd_ioctl(disk->queue, disk, mode, cmd, usermem); - mutex_unlock(&ub_mutex); + unlock_kernel(); return ret; } diff --git a/trunk/drivers/block/viodasd.c b/trunk/drivers/block/viodasd.c index e2ff697697c2..f651e51a3319 100644 --- a/trunk/drivers/block/viodasd.c +++ b/trunk/drivers/block/viodasd.c @@ -41,7 +41,7 @@ #include #include #include -#include +#include #include #include #include @@ -73,7 +73,6 @@ enum { MAX_DISK_NAME = FIELD_SIZEOF(struct gendisk, disk_name) }; -static DEFINE_MUTEX(viodasd_mutex); static DEFINE_SPINLOCK(viodasd_spinlock); #define VIOMAXREQ 16 @@ -181,9 +180,9 @@ static int viodasd_unlocked_open(struct block_device *bdev, fmode_t mode) { int ret; - mutex_lock(&viodasd_mutex); + lock_kernel(); ret = viodasd_open(bdev, mode); - mutex_unlock(&viodasd_mutex); + unlock_kernel(); return ret; } @@ -197,7 +196,7 @@ static int viodasd_release(struct gendisk *disk, fmode_t mode) struct viodasd_device *d = disk->private_data; HvLpEvent_Rc hvrc; - mutex_lock(&viodasd_mutex); + lock_kernel(); /* Send the event to OS/400. We DON'T expect a response */ hvrc = HvCallEvent_signalLpEventFast(viopath_hostLp, HvLpEvent_Type_VirtualIo, @@ -211,7 +210,7 @@ static int viodasd_release(struct gendisk *disk, fmode_t mode) if (hvrc != 0) pr_warning("HV close call failed %d\n", (int)hvrc); - mutex_unlock(&viodasd_mutex); + unlock_kernel(); return 0; } diff --git a/trunk/drivers/block/xd.c b/trunk/drivers/block/xd.c index 4abd2bcd20fb..d5a3cd750561 100644 --- a/trunk/drivers/block/xd.c +++ b/trunk/drivers/block/xd.c @@ -46,7 +46,7 @@ #include #include #include -#include +#include #include #include #include @@ -58,7 +58,6 @@ #include "xd.h" -static DEFINE_MUTEX(xd_mutex); static void __init do_xd_setup (int *integers); #ifdef MODULE static int xd[5] = { -1,-1,-1,-1, }; @@ -382,9 +381,9 @@ static int xd_ioctl(struct block_device *bdev, fmode_t mode, { int ret; - mutex_lock(&xd_mutex); + lock_kernel(); ret = xd_locked_ioctl(bdev, mode, cmd, param); - mutex_unlock(&xd_mutex); + unlock_kernel(); return ret; } diff --git a/trunk/drivers/block/xen-blkfront.c b/trunk/drivers/block/xen-blkfront.c index 3ff06f475eef..ab735a605cf3 100644 --- a/trunk/drivers/block/xen-blkfront.c +++ b/trunk/drivers/block/xen-blkfront.c @@ -41,7 +41,7 @@ #include #include #include -#include +#include #include #include @@ -69,7 +69,6 @@ struct blk_shadow { unsigned long frame[BLKIF_MAX_SEGMENTS_PER_REQUEST]; }; -static DEFINE_MUTEX(blkfront_mutex); static const struct block_device_operations xlvbd_block_fops; #define BLK_RING_SIZE __RING_SIZE((struct blkif_sring *)0, PAGE_SIZE) @@ -1202,7 +1201,7 @@ static int blkif_open(struct block_device *bdev, fmode_t mode) struct blkfront_info *info; int err = 0; - mutex_lock(&blkfront_mutex); + lock_kernel(); info = disk->private_data; if (!info) { @@ -1220,7 +1219,7 @@ static int blkif_open(struct block_device *bdev, fmode_t mode) mutex_unlock(&info->mutex); out: - mutex_unlock(&blkfront_mutex); + unlock_kernel(); return err; } @@ -1230,7 +1229,7 @@ static int blkif_release(struct gendisk *disk, fmode_t mode) struct block_device *bdev; struct xenbus_device *xbdev; - mutex_lock(&blkfront_mutex); + lock_kernel(); bdev = bdget_disk(disk, 0); bdput(bdev); @@ -1264,7 +1263,7 @@ static int blkif_release(struct gendisk *disk, fmode_t mode) } out: - mutex_unlock(&blkfront_mutex); + unlock_kernel(); return 0; } diff --git a/trunk/drivers/block/xsysace.c b/trunk/drivers/block/xsysace.c index 6e968cd4893c..057413bb16e2 100644 --- a/trunk/drivers/block/xsysace.c +++ b/trunk/drivers/block/xsysace.c @@ -89,7 +89,7 @@ #include #include #include -#include +#include #include #include #include @@ -214,7 +214,6 @@ struct ace_device { u16 cf_id[ATA_ID_WORDS]; }; -static DEFINE_MUTEX(xsysace_mutex); static int ace_major; /* --------------------------------------------------------------------- @@ -904,13 +903,13 @@ static int ace_open(struct block_device *bdev, fmode_t mode) dev_dbg(ace->dev, "ace_open() users=%i\n", ace->users + 1); - mutex_lock(&xsysace_mutex); + lock_kernel(); spin_lock_irqsave(&ace->lock, flags); ace->users++; spin_unlock_irqrestore(&ace->lock, flags); check_disk_change(bdev); - mutex_unlock(&xsysace_mutex); + unlock_kernel(); return 0; } @@ -923,7 +922,7 @@ static int ace_release(struct gendisk *disk, fmode_t mode) dev_dbg(ace->dev, "ace_release() users=%i\n", ace->users - 1); - mutex_lock(&xsysace_mutex); + lock_kernel(); spin_lock_irqsave(&ace->lock, flags); ace->users--; if (ace->users == 0) { @@ -931,7 +930,7 @@ static int ace_release(struct gendisk *disk, fmode_t mode) ace_out(ace, ACE_CTRL, val & ~ACE_CTRL_LOCKREQ); } spin_unlock_irqrestore(&ace->lock, flags); - mutex_unlock(&xsysace_mutex); + unlock_kernel(); return 0; } diff --git a/trunk/drivers/block/z2ram.c b/trunk/drivers/block/z2ram.c index dcd4cfcf4126..d75b2bb601ad 100644 --- a/trunk/drivers/block/z2ram.c +++ b/trunk/drivers/block/z2ram.c @@ -33,7 +33,7 @@ #include #include #include -#include +#include #include #include @@ -57,7 +57,6 @@ extern struct mem_info m68k_memory[NUM_MEMINFO]; #define Z2RAM_CHUNK1024 ( Z2RAM_CHUNKSIZE >> 10 ) -static DEFINE_MUTEX(z2ram_mutex); static u_long *z2ram_map = NULL; static u_long z2ram_size = 0; static int z2_count = 0; @@ -155,7 +154,7 @@ static int z2_open(struct block_device *bdev, fmode_t mode) device = MINOR(bdev->bd_dev); - mutex_lock(&z2ram_mutex); + lock_kernel(); if ( current_device != -1 && current_device != device ) { rc = -EBUSY; @@ -297,25 +296,25 @@ static int z2_open(struct block_device *bdev, fmode_t mode) set_capacity(z2ram_gendisk, z2ram_size >> 9); } - mutex_unlock(&z2ram_mutex); + unlock_kernel(); return 0; err_out_kfree: kfree(z2ram_map); err_out: - mutex_unlock(&z2ram_mutex); + unlock_kernel(); return rc; } static int z2_release(struct gendisk *disk, fmode_t mode) { - mutex_lock(&z2ram_mutex); + lock_kernel(); if ( current_device == -1 ) { - mutex_unlock(&z2ram_mutex); + unlock_kernel(); return 0; } - mutex_unlock(&z2ram_mutex); + unlock_kernel(); /* * FIXME: unmap memory */ diff --git a/trunk/drivers/bluetooth/btmrvl_debugfs.c b/trunk/drivers/bluetooth/btmrvl_debugfs.c index fd6305bf953e..54739b08c308 100644 --- a/trunk/drivers/bluetooth/btmrvl_debugfs.c +++ b/trunk/drivers/bluetooth/btmrvl_debugfs.c @@ -92,7 +92,6 @@ static const struct file_operations btmrvl_hscfgcmd_fops = { .read = btmrvl_hscfgcmd_read, .write = btmrvl_hscfgcmd_write, .open = btmrvl_open_generic, - .llseek = default_llseek, }; static ssize_t btmrvl_psmode_write(struct file *file, const char __user *ubuf, @@ -131,7 +130,6 @@ static const struct file_operations btmrvl_psmode_fops = { .read = btmrvl_psmode_read, .write = btmrvl_psmode_write, .open = btmrvl_open_generic, - .llseek = default_llseek, }; static ssize_t btmrvl_pscmd_write(struct file *file, const char __user *ubuf, @@ -175,7 +173,6 @@ static const struct file_operations btmrvl_pscmd_fops = { .read = btmrvl_pscmd_read, .write = btmrvl_pscmd_write, .open = btmrvl_open_generic, - .llseek = default_llseek, }; static ssize_t btmrvl_gpiogap_write(struct file *file, const char __user *ubuf, @@ -214,7 +211,6 @@ static const struct file_operations btmrvl_gpiogap_fops = { .read = btmrvl_gpiogap_read, .write = btmrvl_gpiogap_write, .open = btmrvl_open_generic, - .llseek = default_llseek, }; static ssize_t btmrvl_hscmd_write(struct file *file, const char __user *ubuf, @@ -256,7 +252,6 @@ static const struct file_operations btmrvl_hscmd_fops = { .read = btmrvl_hscmd_read, .write = btmrvl_hscmd_write, .open = btmrvl_open_generic, - .llseek = default_llseek, }; static ssize_t btmrvl_hsmode_write(struct file *file, const char __user *ubuf, @@ -294,7 +289,6 @@ static const struct file_operations btmrvl_hsmode_fops = { .read = btmrvl_hsmode_read, .write = btmrvl_hsmode_write, .open = btmrvl_open_generic, - .llseek = default_llseek, }; static ssize_t btmrvl_curpsmode_read(struct file *file, char __user *userbuf, @@ -312,7 +306,6 @@ static ssize_t btmrvl_curpsmode_read(struct file *file, char __user *userbuf, static const struct file_operations btmrvl_curpsmode_fops = { .read = btmrvl_curpsmode_read, .open = btmrvl_open_generic, - .llseek = default_llseek, }; static ssize_t btmrvl_psstate_read(struct file *file, char __user * userbuf, @@ -330,7 +323,6 @@ static ssize_t btmrvl_psstate_read(struct file *file, char __user * userbuf, static const struct file_operations btmrvl_psstate_fops = { .read = btmrvl_psstate_read, .open = btmrvl_open_generic, - .llseek = default_llseek, }; static ssize_t btmrvl_hsstate_read(struct file *file, char __user *userbuf, @@ -348,7 +340,6 @@ static ssize_t btmrvl_hsstate_read(struct file *file, char __user *userbuf, static const struct file_operations btmrvl_hsstate_fops = { .read = btmrvl_hsstate_read, .open = btmrvl_open_generic, - .llseek = default_llseek, }; static ssize_t btmrvl_txdnldready_read(struct file *file, char __user *userbuf, @@ -367,7 +358,6 @@ static ssize_t btmrvl_txdnldready_read(struct file *file, char __user *userbuf, static const struct file_operations btmrvl_txdnldready_fops = { .read = btmrvl_txdnldready_read, .open = btmrvl_open_generic, - .llseek = default_llseek, }; void btmrvl_debugfs_init(struct hci_dev *hdev) diff --git a/trunk/drivers/bluetooth/hci_ldisc.c b/trunk/drivers/bluetooth/hci_ldisc.c index 17361bad46dd..998833d93c13 100644 --- a/trunk/drivers/bluetooth/hci_ldisc.c +++ b/trunk/drivers/bluetooth/hci_ldisc.c @@ -256,16 +256,9 @@ static int hci_uart_tty_open(struct tty_struct *tty) BT_DBG("tty %p", tty); - /* FIXME: This btw is bogus, nothing requires the old ldisc to clear - the pointer */ if (hu) return -EEXIST; - /* Error if the tty has no write op instead of leaving an exploitable - hole */ - if (tty->ops->write == NULL) - return -EOPNOTSUPP; - if (!(hu = kzalloc(sizeof(struct hci_uart), GFP_KERNEL))) { BT_ERR("Can't allocate control structure"); return -ENFILE; diff --git a/trunk/drivers/bluetooth/hci_vhci.c b/trunk/drivers/bluetooth/hci_vhci.c index 67c180c2c1e0..3aa7b2a54b6f 100644 --- a/trunk/drivers/bluetooth/hci_vhci.c +++ b/trunk/drivers/bluetooth/hci_vhci.c @@ -282,7 +282,6 @@ static const struct file_operations vhci_fops = { .poll = vhci_poll, .open = vhci_open, .release = vhci_release, - .llseek = no_llseek, }; static struct miscdevice vhci_miscdev= { diff --git a/trunk/drivers/cdrom/gdrom.c b/trunk/drivers/cdrom/gdrom.c index 3af6516919b7..261107d1457c 100644 --- a/trunk/drivers/cdrom/gdrom.c +++ b/trunk/drivers/cdrom/gdrom.c @@ -34,7 +34,7 @@ #include #include #include -#include +#include #include #include #include @@ -81,7 +81,6 @@ #define GDROM_DEFAULT_TIMEOUT (HZ * 7) -static DEFINE_MUTEX(gdrom_mutex); static const struct { int sense_key; const char * const text; @@ -495,17 +494,17 @@ static struct cdrom_device_ops gdrom_ops = { static int gdrom_bdops_open(struct block_device *bdev, fmode_t mode) { int ret; - mutex_lock(&gdrom_mutex); + lock_kernel(); ret = cdrom_open(gd.cd_info, bdev, mode); - mutex_unlock(&gdrom_mutex); + unlock_kernel(); return ret; } static int gdrom_bdops_release(struct gendisk *disk, fmode_t mode) { - mutex_lock(&gdrom_mutex); + lock_kernel(); cdrom_release(gd.cd_info, mode); - mutex_unlock(&gdrom_mutex); + unlock_kernel(); return 0; } @@ -519,9 +518,9 @@ static int gdrom_bdops_ioctl(struct block_device *bdev, fmode_t mode, { int ret; - mutex_lock(&gdrom_mutex); + lock_kernel(); ret = cdrom_ioctl(gd.cd_info, bdev, mode, cmd, arg); - mutex_unlock(&gdrom_mutex); + unlock_kernel(); return ret; } diff --git a/trunk/drivers/cdrom/viocd.c b/trunk/drivers/cdrom/viocd.c index be73a9b493a6..56bf9f44700c 100644 --- a/trunk/drivers/cdrom/viocd.c +++ b/trunk/drivers/cdrom/viocd.c @@ -42,7 +42,7 @@ #include #include #include -#include +#include #include #include @@ -61,7 +61,6 @@ */ #define VIOCD_MAX_CD HVMAXARCHITECTEDVIRTUALCDROMS -static DEFINE_MUTEX(viocd_mutex); static const struct vio_error_entry viocd_err_table[] = { {0x0201, EINVAL, "Invalid Range"}, {0x0202, EINVAL, "Invalid Token"}, @@ -157,9 +156,9 @@ static int viocd_blk_open(struct block_device *bdev, fmode_t mode) struct disk_info *di = bdev->bd_disk->private_data; int ret; - mutex_lock(&viocd_mutex); + lock_kernel(); ret = cdrom_open(&di->viocd_info, bdev, mode); - mutex_unlock(&viocd_mutex); + unlock_kernel(); return ret; } @@ -167,9 +166,9 @@ static int viocd_blk_open(struct block_device *bdev, fmode_t mode) static int viocd_blk_release(struct gendisk *disk, fmode_t mode) { struct disk_info *di = disk->private_data; - mutex_lock(&viocd_mutex); + lock_kernel(); cdrom_release(&di->viocd_info, mode); - mutex_unlock(&viocd_mutex); + unlock_kernel(); return 0; } @@ -179,9 +178,9 @@ static int viocd_blk_ioctl(struct block_device *bdev, fmode_t mode, struct disk_info *di = bdev->bd_disk->private_data; int ret; - mutex_lock(&viocd_mutex); + lock_kernel(); ret = cdrom_ioctl(&di->viocd_info, bdev, mode, cmd, arg); - mutex_unlock(&viocd_mutex); + unlock_kernel(); return ret; } diff --git a/trunk/drivers/char/apm-emulation.c b/trunk/drivers/char/apm-emulation.c index 3022801669b1..033e1505fca9 100644 --- a/trunk/drivers/char/apm-emulation.c +++ b/trunk/drivers/char/apm-emulation.c @@ -13,7 +13,7 @@ #include #include #include -#include +#include #include #include #include @@ -126,7 +126,6 @@ struct apm_user { /* * Local variables */ -static DEFINE_MUTEX(apm_mutex); static atomic_t suspend_acks_pending = ATOMIC_INIT(0); static atomic_t userspace_notification_inhibit = ATOMIC_INIT(0); static int apm_disabled; @@ -275,7 +274,7 @@ apm_ioctl(struct file *filp, u_int cmd, u_long arg) if (!as->suser || !as->writer) return -EPERM; - mutex_lock(&apm_mutex); + lock_kernel(); switch (cmd) { case APM_IOC_SUSPEND: mutex_lock(&state_lock); @@ -336,7 +335,7 @@ apm_ioctl(struct file *filp, u_int cmd, u_long arg) mutex_unlock(&state_lock); break; } - mutex_unlock(&apm_mutex); + unlock_kernel(); return err; } @@ -371,7 +370,7 @@ static int apm_open(struct inode * inode, struct file * filp) { struct apm_user *as; - mutex_lock(&apm_mutex); + lock_kernel(); as = kzalloc(sizeof(*as), GFP_KERNEL); if (as) { /* @@ -391,7 +390,7 @@ static int apm_open(struct inode * inode, struct file * filp) filp->private_data = as; } - mutex_unlock(&apm_mutex); + unlock_kernel(); return as ? 0 : -ENOMEM; } @@ -403,7 +402,6 @@ static const struct file_operations apm_bios_fops = { .unlocked_ioctl = apm_ioctl, .open = apm_open, .release = apm_release, - .llseek = noop_llseek, }; static struct miscdevice apm_device = { diff --git a/trunk/drivers/char/applicom.c b/trunk/drivers/char/applicom.c index e7ba774beda6..f4ae0e0fb631 100644 --- a/trunk/drivers/char/applicom.c +++ b/trunk/drivers/char/applicom.c @@ -26,7 +26,7 @@ #include #include #include -#include +#include #include #include #include @@ -60,7 +60,6 @@ #define PCI_DEVICE_ID_APPLICOM_PCI2000PFB 0x0003 #endif -static DEFINE_MUTEX(ac_mutex); static char *applicom_pci_devnames[] = { "PCI board", "PCI2000IBS / PCI2000CAN", @@ -708,7 +707,7 @@ static long ac_ioctl(struct file *file, unsigned int cmd, unsigned long arg) if (IS_ERR(adgl)) return PTR_ERR(adgl); - mutex_lock(&ac_mutex); + lock_kernel(); IndexCard = adgl->num_card-1; if(cmd != 6 && ((IndexCard >= MAX_BOARD) || !apbs[IndexCard].RamIO)) { @@ -718,7 +717,7 @@ static long ac_ioctl(struct file *file, unsigned int cmd, unsigned long arg) warncount--; } kfree(adgl); - mutex_unlock(&ac_mutex); + unlock_kernel(); return -EINVAL; } @@ -836,7 +835,7 @@ static long ac_ioctl(struct file *file, unsigned int cmd, unsigned long arg) } Dummy = readb(apbs[IndexCard].RamIO + VERS); kfree(adgl); - mutex_unlock(&ac_mutex); + unlock_kernel(); return 0; } diff --git a/trunk/drivers/char/bfin-otp.c b/trunk/drivers/char/bfin-otp.c index 44660f1c4849..836d4f0a876f 100644 --- a/trunk/drivers/char/bfin-otp.c +++ b/trunk/drivers/char/bfin-otp.c @@ -222,7 +222,6 @@ static const struct file_operations bfin_otp_fops = { .unlocked_ioctl = bfin_otp_ioctl, .read = bfin_otp_read, .write = bfin_otp_write, - .llseek = default_llseek, }; static struct miscdevice bfin_otp_misc_device = { diff --git a/trunk/drivers/char/briq_panel.c b/trunk/drivers/char/briq_panel.c index f6718f05dad4..d5fa113afe37 100644 --- a/trunk/drivers/char/briq_panel.c +++ b/trunk/drivers/char/briq_panel.c @@ -186,7 +186,6 @@ static const struct file_operations briq_panel_fops = { .write = briq_panel_write, .open = briq_panel_open, .release = briq_panel_release, - .llseek = noop_llseek, }; static struct miscdevice briq_panel_miscdev = { diff --git a/trunk/drivers/char/bsr.c b/trunk/drivers/char/bsr.c index a4a6c2f044b5..91917133ae0a 100644 --- a/trunk/drivers/char/bsr.c +++ b/trunk/drivers/char/bsr.c @@ -155,7 +155,6 @@ static const struct file_operations bsr_fops = { .owner = THIS_MODULE, .mmap = bsr_mmap, .open = bsr_open, - .llseek = noop_llseek, }; static void bsr_cleanup_devs(void) diff --git a/trunk/drivers/char/cs5535_gpio.c b/trunk/drivers/char/cs5535_gpio.c index 0cf1e5fad9ab..4d830dc482ef 100644 --- a/trunk/drivers/char/cs5535_gpio.c +++ b/trunk/drivers/char/cs5535_gpio.c @@ -169,8 +169,7 @@ static const struct file_operations cs5535_gpio_fops = { .owner = THIS_MODULE, .write = cs5535_gpio_write, .read = cs5535_gpio_read, - .open = cs5535_gpio_open, - .llseek = no_llseek, + .open = cs5535_gpio_open }; static int __init cs5535_gpio_init(void) diff --git a/trunk/drivers/char/ds1302.c b/trunk/drivers/char/ds1302.c index ed8303f9890c..170693c93c73 100644 --- a/trunk/drivers/char/ds1302.c +++ b/trunk/drivers/char/ds1302.c @@ -20,7 +20,7 @@ #include #include #include -#include +#include #include #include @@ -32,7 +32,6 @@ #define RTC_MAJOR_NR 121 /* local major, change later */ -static DEFINE_MUTEX(rtc_mutex); static const char ds1302_name[] = "ds1302"; /* Send 8 bits. */ @@ -165,9 +164,9 @@ static long rtc_ioctl(struct file *file, unsigned int cmd, unsigned long arg) struct rtc_time rtc_tm; memset(&rtc_tm, 0, sizeof (struct rtc_time)); - mutex_lock(&rtc_mutex); + lock_kernel(); get_rtc_time(&rtc_tm); - mutex_unlock(&rtc_mutex); + unlock_kernel(); if (copy_to_user((struct rtc_time*)arg, &rtc_tm, sizeof(struct rtc_time))) return -EFAULT; return 0; @@ -219,7 +218,7 @@ static long rtc_ioctl(struct file *file, unsigned int cmd, unsigned long arg) mon = bin2bcd(mon); yrs = bin2bcd(yrs); - mutex_lock(&rtc_mutex); + lock_kernel(); local_irq_save(flags); CMOS_WRITE(yrs, RTC_YEAR); CMOS_WRITE(mon, RTC_MONTH); @@ -228,7 +227,7 @@ static long rtc_ioctl(struct file *file, unsigned int cmd, unsigned long arg) CMOS_WRITE(min, RTC_MINUTES); CMOS_WRITE(sec, RTC_SECONDS); local_irq_restore(flags); - mutex_unlock(&rtc_mutex); + unlock_kernel(); /* Notice that at this point, the RTC is updated but * the kernel is still running with the old time. @@ -248,10 +247,10 @@ static long rtc_ioctl(struct file *file, unsigned int cmd, unsigned long arg) if(copy_from_user(&tcs_val, (int*)arg, sizeof(int))) return -EFAULT; - mutex_lock(&rtc_mutex); + lock_kernel(); tcs_val = RTC_TCR_PATTERN | (tcs_val & 0x0F); ds1302_writereg(RTC_TRICKLECHARGER, tcs_val); - mutex_unlock(&rtc_mutex); + unlock_kernel(); return 0; } default: @@ -289,7 +288,6 @@ get_rtc_status(char *buf) static const struct file_operations rtc_fops = { .owner = THIS_MODULE, .unlocked_ioctl = rtc_ioctl, - .llseek = noop_llseek, }; /* Probe for the chip by writing something to its RAM and try reading it back. */ diff --git a/trunk/drivers/char/ds1620.c b/trunk/drivers/char/ds1620.c index aab9605f0b43..dbee8688f75c 100644 --- a/trunk/drivers/char/ds1620.c +++ b/trunk/drivers/char/ds1620.c @@ -8,7 +8,7 @@ #include #include #include -#include +#include #include #include @@ -34,7 +34,6 @@ #define CFG_CPU 2 #define CFG_1SHOT 1 -static DEFINE_MUTEX(ds1620_mutex); static const char *fan_state[] = { "off", "on", "on (hardwired)" }; /* @@ -211,6 +210,7 @@ static void ds1620_read_state(struct therm *therm) static int ds1620_open(struct inode *inode, struct file *file) { + cycle_kernel_lock(); return nonseekable_open(inode, file); } @@ -321,9 +321,9 @@ ds1620_unlocked_ioctl(struct file *file, unsigned int cmd, unsigned long arg) { int ret; - mutex_lock(&ds1620_mutex); + lock_kernel(); ret = ds1620_ioctl(file, cmd, arg); - mutex_unlock(&ds1620_mutex); + unlock_kernel(); return ret; } @@ -357,7 +357,6 @@ static const struct file_operations ds1620_fops = { .open = ds1620_open, .read = ds1620_read, .unlocked_ioctl = ds1620_unlocked_ioctl, - .llseek = no_llseek, }; static struct miscdevice ds1620_miscdev = { diff --git a/trunk/drivers/char/dsp56k.c b/trunk/drivers/char/dsp56k.c index 052797b32bd3..8a1b28a10ef0 100644 --- a/trunk/drivers/char/dsp56k.c +++ b/trunk/drivers/char/dsp56k.c @@ -32,7 +32,7 @@ #include #include #include -#include +#include #include #include #include /* For put_user and get_user */ @@ -94,7 +94,6 @@ } \ } -static DEFINE_MUTEX(dsp56k_mutex); static struct dsp56k_device { unsigned long in_use; long maxio, timeout; @@ -331,9 +330,9 @@ static long dsp56k_ioctl(struct file *file, unsigned int cmd, if (len > DSP56K_MAX_BINARY_LENGTH) { return -EINVAL; } - mutex_lock(&dsp56k_mutex); + lock_kernel(); r = dsp56k_upload(bin, len); - mutex_unlock(&dsp56k_mutex); + unlock_kernel(); if (r < 0) { return r; } @@ -343,16 +342,16 @@ static long dsp56k_ioctl(struct file *file, unsigned int cmd, case DSP56K_SET_TX_WSIZE: if (arg > 4 || arg < 1) return -EINVAL; - mutex_lock(&dsp56k_mutex); + lock_kernel(); dsp56k.tx_wsize = (int) arg; - mutex_unlock(&dsp56k_mutex); + unlock_kernel(); break; case DSP56K_SET_RX_WSIZE: if (arg > 4 || arg < 1) return -EINVAL; - mutex_lock(&dsp56k_mutex); + lock_kernel(); dsp56k.rx_wsize = (int) arg; - mutex_unlock(&dsp56k_mutex); + unlock_kernel(); break; case DSP56K_HOST_FLAGS: { @@ -364,7 +363,7 @@ static long dsp56k_ioctl(struct file *file, unsigned int cmd, if(get_user(out, &hf->out) < 0) return -EFAULT; - mutex_lock(&dsp56k_mutex); + lock_kernel(); if ((dir & 0x1) && (out & 0x1)) dsp56k_host_interface.icr |= DSP56K_ICR_HF0; else if (dir & 0x1) @@ -379,16 +378,16 @@ static long dsp56k_ioctl(struct file *file, unsigned int cmd, if (dsp56k_host_interface.icr & DSP56K_ICR_HF1) status |= 0x2; if (dsp56k_host_interface.isr & DSP56K_ISR_HF2) status |= 0x4; if (dsp56k_host_interface.isr & DSP56K_ISR_HF3) status |= 0x8; - mutex_unlock(&dsp56k_mutex); + unlock_kernel(); return put_user(status, &hf->status); } case DSP56K_HOST_CMD: if (arg > 31 || arg < 0) return -EINVAL; - mutex_lock(&dsp56k_mutex); + lock_kernel(); dsp56k_host_interface.cvr = (u_char)((arg & DSP56K_CVR_HV_MASK) | DSP56K_CVR_HC); - mutex_unlock(&dsp56k_mutex); + unlock_kernel(); break; default: return -EINVAL; @@ -428,7 +427,7 @@ static int dsp56k_open(struct inode *inode, struct file *file) int dev = iminor(inode) & 0x0f; int ret = 0; - mutex_lock(&dsp56k_mutex); + lock_kernel(); switch(dev) { case DSP56K_DEV_56001: @@ -455,7 +454,7 @@ static int dsp56k_open(struct inode *inode, struct file *file) ret = -ENODEV; } out: - mutex_unlock(&dsp56k_mutex); + unlock_kernel(); return ret; } @@ -483,7 +482,6 @@ static const struct file_operations dsp56k_fops = { .unlocked_ioctl = dsp56k_ioctl, .open = dsp56k_open, .release = dsp56k_release, - .llseek = noop_llseek, }; diff --git a/trunk/drivers/char/dtlk.c b/trunk/drivers/char/dtlk.c index 85156dd0caee..e3859d4eaead 100644 --- a/trunk/drivers/char/dtlk.c +++ b/trunk/drivers/char/dtlk.c @@ -57,7 +57,7 @@ #include /* for request_region */ #include /* for loops_per_jiffy */ #include -#include +#include /* cycle_kernel_lock() */ #include /* for inb_p, outb_p, inb, outb, etc. */ #include /* for get_user, etc. */ #include /* for wait_queue */ @@ -73,7 +73,6 @@ #define TRACE_RET ((void) 0) #endif /* TRACING */ -static DEFINE_MUTEX(dtlk_mutex); static void dtlk_timer_tick(unsigned long data); static int dtlk_major; @@ -106,7 +105,6 @@ static const struct file_operations dtlk_fops = .unlocked_ioctl = dtlk_ioctl, .open = dtlk_open, .release = dtlk_release, - .llseek = no_llseek, }; /* local prototypes */ @@ -277,9 +275,9 @@ static long dtlk_ioctl(struct file *file, switch (cmd) { case DTLK_INTERROGATE: - mutex_lock(&dtlk_mutex); + lock_kernel(); sp = dtlk_interrogate(); - mutex_unlock(&dtlk_mutex); + unlock_kernel(); if (copy_to_user(argp, sp, sizeof(struct dtlk_settings))) return -EINVAL; return 0; @@ -298,6 +296,7 @@ static int dtlk_open(struct inode *inode, struct file *file) { TRACE_TEXT("(dtlk_open"); + cycle_kernel_lock(); nonseekable_open(inode, file); switch (iminor(inode)) { case DTLK_MINOR: diff --git a/trunk/drivers/char/generic_nvram.c b/trunk/drivers/char/generic_nvram.c index 0e941b57482e..82b5a88a82d7 100644 --- a/trunk/drivers/char/generic_nvram.c +++ b/trunk/drivers/char/generic_nvram.c @@ -19,7 +19,7 @@ #include #include #include -#include +#include #include #include #ifdef CONFIG_PPC_PMAC @@ -28,7 +28,6 @@ #define NVRAM_SIZE 8192 -static DEFINE_MUTEX(nvram_mutex); static ssize_t nvram_len; static loff_t nvram_llseek(struct file *file, loff_t offset, int origin) @@ -121,9 +120,9 @@ static long nvram_unlocked_ioctl(struct file *file, unsigned int cmd, unsigned l { int ret; - mutex_lock(&nvram_mutex); + lock_kernel(); ret = nvram_ioctl(file, cmd, arg); - mutex_unlock(&nvram_mutex); + unlock_kernel(); return ret; } diff --git a/trunk/drivers/char/genrtc.c b/trunk/drivers/char/genrtc.c index f773a9dd14f3..b6c2cc167c11 100644 --- a/trunk/drivers/char/genrtc.c +++ b/trunk/drivers/char/genrtc.c @@ -52,7 +52,7 @@ #include #include #include -#include +#include #include #include @@ -66,7 +66,6 @@ * ioctls. */ -static DEFINE_MUTEX(gen_rtc_mutex); static DECLARE_WAIT_QUEUE_HEAD(gen_rtc_wait); /* @@ -338,9 +337,9 @@ static long gen_rtc_unlocked_ioctl(struct file *file, unsigned int cmd, { int ret; - mutex_lock(&gen_rtc_mutex); + lock_kernel(); ret = gen_rtc_ioctl(file, cmd, arg); - mutex_unlock(&gen_rtc_mutex); + unlock_kernel(); return ret; } @@ -353,16 +352,16 @@ static long gen_rtc_unlocked_ioctl(struct file *file, unsigned int cmd, static int gen_rtc_open(struct inode *inode, struct file *file) { - mutex_lock(&gen_rtc_mutex); + lock_kernel(); if (gen_rtc_status & RTC_IS_OPEN) { - mutex_unlock(&gen_rtc_mutex); + unlock_kernel(); return -EBUSY; } gen_rtc_status |= RTC_IS_OPEN; gen_rtc_irq_data = 0; irq_active = 0; - mutex_unlock(&gen_rtc_mutex); + unlock_kernel(); return 0; } @@ -498,7 +497,6 @@ static const struct file_operations gen_rtc_fops = { .unlocked_ioctl = gen_rtc_unlocked_ioctl, .open = gen_rtc_open, .release = gen_rtc_release, - .llseek = noop_llseek, }; static struct miscdevice rtc_gen_dev = diff --git a/trunk/drivers/char/hpet.c b/trunk/drivers/char/hpet.c index a4eee324eb1e..a0a1829d3198 100644 --- a/trunk/drivers/char/hpet.c +++ b/trunk/drivers/char/hpet.c @@ -30,7 +30,6 @@ #include #include #include -#include #include #include @@ -68,7 +67,6 @@ #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 */ @@ -252,7 +250,7 @@ static int hpet_open(struct inode *inode, struct file *file) if (file->f_mode & FMODE_WRITE) return -EINVAL; - mutex_lock(&hpet_mutex); + lock_kernel(); spin_lock_irq(&hpet_lock); for (devp = NULL, hpetp = hpets; hpetp && !devp; hpetp = hpetp->hp_next) @@ -266,7 +264,7 @@ static int hpet_open(struct inode *inode, struct file *file) if (!devp) { spin_unlock_irq(&hpet_lock); - mutex_unlock(&hpet_mutex); + unlock_kernel(); return -EBUSY; } @@ -274,7 +272,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); - mutex_unlock(&hpet_mutex); + unlock_kernel(); hpet_timer_set_irq(devp); @@ -431,6 +429,22 @@ 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; @@ -539,8 +553,7 @@ static inline unsigned long hpet_time_div(struct hpets *hpets, } static int -hpet_ioctl_common(struct hpet_dev *devp, int cmd, unsigned long arg, - struct hpet_info *info) +hpet_ioctl_common(struct hpet_dev *devp, int cmd, unsigned long arg, int kernel) { struct hpet_timer __iomem *timer; struct hpet __iomem *hpet; @@ -581,15 +594,23 @@ hpet_ioctl_common(struct hpet_dev *devp, int cmd, unsigned long arg, 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; + 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; break; } case HPET_EPI: @@ -615,7 +636,7 @@ hpet_ioctl_common(struct hpet_dev *devp, int cmd, unsigned long arg, devp->hd_flags &= ~HPET_PERIODIC; break; case HPET_IRQFREQ: - if ((arg > hpet_max_freq) && + if (!kernel && (arg > hpet_max_freq) && !capable(CAP_SYS_RESOURCE)) { err = -EACCES; break; @@ -632,63 +653,12 @@ hpet_ioctl_common(struct hpet_dev *devp, int cmd, unsigned long arg, 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, diff --git a/trunk/drivers/char/hw_random/core.c b/trunk/drivers/char/hw_random/core.c index 788da05190cc..3d9c61e5acbf 100644 --- a/trunk/drivers/char/hw_random/core.c +++ b/trunk/drivers/char/hw_random/core.c @@ -170,7 +170,6 @@ static const struct file_operations rng_chrdev_ops = { .owner = THIS_MODULE, .open = rng_dev_open, .read = rng_dev_read, - .llseek = noop_llseek, }; static struct miscdevice rng_miscdev = { diff --git a/trunk/drivers/char/i8k.c b/trunk/drivers/char/i8k.c index 3bc0eef88717..4cd8b227c11f 100644 --- a/trunk/drivers/char/i8k.c +++ b/trunk/drivers/char/i8k.c @@ -23,7 +23,7 @@ #include #include #include -#include +#include #include #include @@ -56,7 +56,6 @@ #define I8K_TEMPERATURE_BUG 1 -static DEFINE_MUTEX(i8k_mutex); static char bios_version[4]; MODULE_AUTHOR("Massimo Dal Zotto (dz@debian.org)"); @@ -400,9 +399,9 @@ static long i8k_ioctl(struct file *fp, unsigned int cmd, unsigned long arg) { long ret; - mutex_lock(&i8k_mutex); + lock_kernel(); ret = i8k_ioctl_unlocked(fp, cmd, arg); - mutex_unlock(&i8k_mutex); + unlock_kernel(); return ret; } diff --git a/trunk/drivers/char/ip2/ip2main.c b/trunk/drivers/char/ip2/ip2main.c index 64a439ce2f89..d4b71e8d0d23 100644 --- a/trunk/drivers/char/ip2/ip2main.c +++ b/trunk/drivers/char/ip2/ip2main.c @@ -98,7 +98,7 @@ #include #include #include -#include +#include #include #include @@ -138,7 +138,6 @@ #include #include -static DEFINE_MUTEX(ip2_mutex); static const struct file_operations ip2mem_proc_fops; static const struct file_operations ip2_proc_fops; @@ -237,7 +236,6 @@ static const struct file_operations ip2_ipl = { .write = ip2_ipl_write, .unlocked_ioctl = ip2_ipl_ioctl, .open = ip2_ipl_open, - .llseek = noop_llseek, }; static unsigned long irq_counter; @@ -2899,7 +2897,7 @@ ip2_ipl_ioctl (struct file *pFile, UINT cmd, ULONG arg ) printk (KERN_DEBUG "IP2IPL: ioctl cmd %d, arg %ld\n", cmd, arg ); #endif - mutex_lock(&ip2_mutex); + lock_kernel(); switch ( iplminor ) { case 0: // IPL device @@ -2963,7 +2961,7 @@ ip2_ipl_ioctl (struct file *pFile, UINT cmd, ULONG arg ) rc = -ENODEV; break; } - mutex_unlock(&ip2_mutex); + unlock_kernel(); return rc; } @@ -2984,6 +2982,7 @@ ip2_ipl_open( struct inode *pInode, struct file *pFile ) #ifdef IP2DEBUG_IPL printk (KERN_DEBUG "IP2IPL: open\n" ); #endif + cycle_kernel_lock(); return 0; } diff --git a/trunk/drivers/char/ipmi/ipmi_devintf.c b/trunk/drivers/char/ipmi/ipmi_devintf.c index 1fc8876af1f5..d8ec92a38980 100644 --- a/trunk/drivers/char/ipmi/ipmi_devintf.c +++ b/trunk/drivers/char/ipmi/ipmi_devintf.c @@ -44,6 +44,7 @@ #include #include #include +#include struct ipmi_file_private { @@ -58,7 +59,6 @@ struct ipmi_file_private unsigned int default_retry_time_ms; }; -static DEFINE_MUTEX(ipmi_mutex); static void file_receive_handler(struct ipmi_recv_msg *msg, void *handler_data) { @@ -102,9 +102,9 @@ static int ipmi_fasync(int fd, struct file *file, int on) struct ipmi_file_private *priv = file->private_data; int result; - mutex_lock(&ipmi_mutex); /* could race against open() otherwise */ + lock_kernel(); /* could race against open() otherwise */ result = fasync_helper(fd, file, on, &priv->fasync_queue); - mutex_unlock(&ipmi_mutex); + unlock_kernel(); return (result); } @@ -125,7 +125,7 @@ static int ipmi_open(struct inode *inode, struct file *file) if (!priv) return -ENOMEM; - mutex_lock(&ipmi_mutex); + lock_kernel(); priv->file = file; rv = ipmi_create_user(if_num, @@ -150,7 +150,7 @@ static int ipmi_open(struct inode *inode, struct file *file) priv->default_retry_time_ms = 0; out: - mutex_unlock(&ipmi_mutex); + unlock_kernel(); return rv; } @@ -639,9 +639,9 @@ static long ipmi_unlocked_ioctl(struct file *file, { int ret; - mutex_lock(&ipmi_mutex); + lock_kernel(); ret = ipmi_ioctl(file, cmd, data); - mutex_unlock(&ipmi_mutex); + unlock_kernel(); return ret; } @@ -850,7 +850,6 @@ static const struct file_operations ipmi_fops = { .release = ipmi_release, .fasync = ipmi_fasync, .poll = ipmi_poll, - .llseek = noop_llseek, }; #define DEVICE_NAME "ipmidev" diff --git a/trunk/drivers/char/ipmi/ipmi_watchdog.c b/trunk/drivers/char/ipmi/ipmi_watchdog.c index f4d334f2536e..654d566ca57c 100644 --- a/trunk/drivers/char/ipmi/ipmi_watchdog.c +++ b/trunk/drivers/char/ipmi/ipmi_watchdog.c @@ -35,7 +35,7 @@ #include #include #include -#include +#include #include #include #include @@ -149,7 +149,6 @@ #define WDIOC_GET_PRETIMEOUT _IOW(WATCHDOG_IOCTL_BASE, 22, int) #endif -static DEFINE_MUTEX(ipmi_watchdog_mutex); static int nowayout = WATCHDOG_NOWAYOUT; static ipmi_user_t watchdog_user; @@ -749,9 +748,9 @@ static long ipmi_unlocked_ioctl(struct file *file, { int ret; - mutex_lock(&ipmi_watchdog_mutex); + lock_kernel(); ret = ipmi_ioctl(file, cmd, arg); - mutex_unlock(&ipmi_watchdog_mutex); + unlock_kernel(); return ret; } @@ -845,6 +844,7 @@ static int ipmi_open(struct inode *ino, struct file *filep) if (test_and_set_bit(0, &ipmi_wdog_open)) return -EBUSY; + cycle_kernel_lock(); /* * Don't start the timer now, let it start on the @@ -909,7 +909,6 @@ static const struct file_operations ipmi_wdog_fops = { .open = ipmi_open, .release = ipmi_close, .fasync = ipmi_fasync, - .llseek = no_llseek, }; static struct miscdevice ipmi_wdog_miscdev = { diff --git a/trunk/drivers/char/istallion.c b/trunk/drivers/char/istallion.c index 667abd23ad6a..be28391adb79 100644 --- a/trunk/drivers/char/istallion.c +++ b/trunk/drivers/char/istallion.c @@ -704,7 +704,6 @@ static const struct file_operations stli_fsiomem = { .read = stli_memread, .write = stli_memwrite, .unlocked_ioctl = stli_memioctl, - .llseek = default_llseek, }; /*****************************************************************************/ diff --git a/trunk/drivers/char/lp.c b/trunk/drivers/char/lp.c index 97c3edb95ae7..938a3a273886 100644 --- a/trunk/drivers/char/lp.c +++ b/trunk/drivers/char/lp.c @@ -126,7 +126,7 @@ #include #include #include -#include +#include #include #include @@ -140,7 +140,6 @@ /* if you have more than 8 printers, remember to increase LP_NO */ #define LP_NO 8 -static DEFINE_MUTEX(lp_mutex); static struct lp_struct lp_table[LP_NO]; static unsigned int lp_count = 0; @@ -494,7 +493,7 @@ static int lp_open(struct inode * inode, struct file * file) unsigned int minor = iminor(inode); int ret = 0; - mutex_lock(&lp_mutex); + lock_kernel(); if (minor >= LP_NO) { ret = -ENXIO; goto out; @@ -555,7 +554,7 @@ static int lp_open(struct inode * inode, struct file * file) lp_release_parport (&lp_table[minor]); lp_table[minor].current_mode = IEEE1284_MODE_COMPAT; out: - mutex_unlock(&lp_mutex); + unlock_kernel(); return ret; } @@ -681,7 +680,7 @@ static long lp_ioctl(struct file *file, unsigned int cmd, int ret; minor = iminor(file->f_path.dentry->d_inode); - mutex_lock(&lp_mutex); + lock_kernel(); switch (cmd) { case LPSETTIMEOUT: if (copy_from_user(&par_timeout, (void __user *)arg, @@ -695,7 +694,7 @@ static long lp_ioctl(struct file *file, unsigned int cmd, ret = lp_do_ioctl(minor, cmd, arg, (void __user *)arg); break; } - mutex_unlock(&lp_mutex); + unlock_kernel(); return ret; } @@ -710,7 +709,7 @@ static long lp_compat_ioctl(struct file *file, unsigned int cmd, int ret; minor = iminor(file->f_path.dentry->d_inode); - mutex_lock(&lp_mutex); + lock_kernel(); switch (cmd) { case LPSETTIMEOUT: tc = compat_ptr(arg); @@ -731,7 +730,7 @@ static long lp_compat_ioctl(struct file *file, unsigned int cmd, ret = lp_do_ioctl(minor, cmd, arg, compat_ptr(arg)); break; } - mutex_unlock(&lp_mutex); + unlock_kernel(); return ret; } @@ -749,7 +748,6 @@ static const struct file_operations lp_fops = { #ifdef CONFIG_PARPORT_1284 .read = lp_read, #endif - .llseek = noop_llseek, }; /* --- support for console on the line printer ----------------- */ diff --git a/trunk/drivers/char/mbcs.c b/trunk/drivers/char/mbcs.c index 1aeaaba680d2..83bef4efe376 100644 --- a/trunk/drivers/char/mbcs.c +++ b/trunk/drivers/char/mbcs.c @@ -25,6 +25,7 @@ #include #include #include +#include #include #include #include @@ -41,7 +42,6 @@ #else #define DBG(fmt...) #endif -static DEFINE_MUTEX(mbcs_mutex); static int mbcs_major; static LIST_HEAD(soft_list); @@ -385,19 +385,19 @@ static int mbcs_open(struct inode *ip, struct file *fp) struct mbcs_soft *soft; int minor; - mutex_lock(&mbcs_mutex); + lock_kernel(); minor = iminor(ip); /* Nothing protects access to this list... */ list_for_each_entry(soft, &soft_list, list) { if (soft->nasid == minor) { fp->private_data = soft->cxdev; - mutex_unlock(&mbcs_mutex); + unlock_kernel(); return 0; } } - mutex_unlock(&mbcs_mutex); + unlock_kernel(); return -ENODEV; } diff --git a/trunk/drivers/char/mem.c b/trunk/drivers/char/mem.c index e985b1c2730e..1f528fad3516 100644 --- a/trunk/drivers/char/mem.c +++ b/trunk/drivers/char/mem.c @@ -805,7 +805,6 @@ static const struct file_operations full_fops = { static const struct file_operations oldmem_fops = { .read = read_oldmem, .open = open_oldmem, - .llseek = default_llseek, }; #endif @@ -832,7 +831,6 @@ static ssize_t kmsg_write(struct file *file, const char __user *buf, static const struct file_operations kmsg_fops = { .write = kmsg_write, - .llseek = noop_llseek, }; static const struct memdev { @@ -884,7 +882,6 @@ static int memory_open(struct inode *inode, struct file *filp) static const struct file_operations memory_fops = { .open = memory_open, - .llseek = noop_llseek, }; static char *mem_devnode(struct device *dev, mode_t *mode) diff --git a/trunk/drivers/char/misc.c b/trunk/drivers/char/misc.c index 778273c93242..abdafd488980 100644 --- a/trunk/drivers/char/misc.c +++ b/trunk/drivers/char/misc.c @@ -162,7 +162,6 @@ static struct class *misc_class; static const struct file_operations misc_fops = { .owner = THIS_MODULE, .open = misc_open, - .llseek = noop_llseek, }; /** diff --git a/trunk/drivers/char/mmtimer.c b/trunk/drivers/char/mmtimer.c index c070b53984e4..ea7c99fa978f 100644 --- a/trunk/drivers/char/mmtimer.c +++ b/trunk/drivers/char/mmtimer.c @@ -32,7 +32,7 @@ #include #include #include -#include +#include #include #include @@ -59,7 +59,6 @@ extern unsigned long sn_rtc_cycles_per_second; #define rtc_time() (*RTC_COUNTER_ADDR) -static DEFINE_MUTEX(mmtimer_mutex); static long mmtimer_ioctl(struct file *file, unsigned int cmd, unsigned long arg); static int mmtimer_mmap(struct file *file, struct vm_area_struct *vma); @@ -73,7 +72,6 @@ static const struct file_operations mmtimer_fops = { .owner = THIS_MODULE, .mmap = mmtimer_mmap, .unlocked_ioctl = mmtimer_ioctl, - .llseek = noop_llseek, }; /* @@ -373,7 +371,7 @@ static long mmtimer_ioctl(struct file *file, unsigned int cmd, { int ret = 0; - mutex_lock(&mmtimer_mutex); + lock_kernel(); switch (cmd) { case MMTIMER_GETOFFSET: /* offset of the counter */ @@ -416,7 +414,7 @@ static long mmtimer_ioctl(struct file *file, unsigned int cmd, ret = -ENOTTY; break; } - mutex_unlock(&mmtimer_mutex); + unlock_kernel(); return ret; } diff --git a/trunk/drivers/char/mspec.c b/trunk/drivers/char/mspec.c index 966a95bc974b..ecb89d798e35 100644 --- a/trunk/drivers/char/mspec.c +++ b/trunk/drivers/char/mspec.c @@ -316,8 +316,7 @@ uncached_mmap(struct file *file, struct vm_area_struct *vma) static const struct file_operations fetchop_fops = { .owner = THIS_MODULE, - .mmap = fetchop_mmap, - .llseek = noop_llseek, + .mmap = fetchop_mmap }; static struct miscdevice fetchop_miscdev = { @@ -328,8 +327,7 @@ static struct miscdevice fetchop_miscdev = { static const struct file_operations cached_fops = { .owner = THIS_MODULE, - .mmap = cached_mmap, - .llseek = noop_llseek, + .mmap = cached_mmap }; static struct miscdevice cached_miscdev = { @@ -340,8 +338,7 @@ static struct miscdevice cached_miscdev = { static const struct file_operations uncached_fops = { .owner = THIS_MODULE, - .mmap = uncached_mmap, - .llseek = noop_llseek, + .mmap = uncached_mmap }; static struct miscdevice uncached_miscdev = { diff --git a/trunk/drivers/char/mwave/mwavedd.c b/trunk/drivers/char/mwave/mwavedd.c index 1d82d5838f0c..a4ec50c95072 100644 --- a/trunk/drivers/char/mwave/mwavedd.c +++ b/trunk/drivers/char/mwave/mwavedd.c @@ -56,7 +56,7 @@ #include #include #include -#include +#include #include #include #include "smapi.h" @@ -73,7 +73,6 @@ MODULE_LICENSE("GPL"); * checks are made against other devices (ie. superio) for conflicts. * We'll depend on users using the tpctl utility to do that for now */ -static DEFINE_MUTEX(mwave_mutex); int mwave_debug = 0; int mwave_3780i_irq = 0; int mwave_3780i_io = 0; @@ -102,6 +101,7 @@ static int mwave_open(struct inode *inode, struct file *file) PRINTK_2(TRACE_MWAVE, "mwavedd::mwave_open, exit return retval %x\n", retval); + cycle_kernel_lock(); return retval; } @@ -136,9 +136,9 @@ static long mwave_ioctl(struct file *file, unsigned int iocmd, PRINTK_1(TRACE_MWAVE, "mwavedd::mwave_ioctl, IOCTL_MW_RESET" " calling tp3780I_ResetDSP\n"); - mutex_lock(&mwave_mutex); + lock_kernel(); retval = tp3780I_ResetDSP(&pDrvData->rBDData); - mutex_unlock(&mwave_mutex); + unlock_kernel(); PRINTK_2(TRACE_MWAVE, "mwavedd::mwave_ioctl, IOCTL_MW_RESET" " retval %x from tp3780I_ResetDSP\n", @@ -149,9 +149,9 @@ static long mwave_ioctl(struct file *file, unsigned int iocmd, PRINTK_1(TRACE_MWAVE, "mwavedd::mwave_ioctl, IOCTL_MW_RUN" " calling tp3780I_StartDSP\n"); - mutex_lock(&mwave_mutex); + lock_kernel(); retval = tp3780I_StartDSP(&pDrvData->rBDData); - mutex_unlock(&mwave_mutex); + unlock_kernel(); PRINTK_2(TRACE_MWAVE, "mwavedd::mwave_ioctl, IOCTL_MW_RUN" " retval %x from tp3780I_StartDSP\n", @@ -165,10 +165,10 @@ static long mwave_ioctl(struct file *file, unsigned int iocmd, "mwavedd::mwave_ioctl," " IOCTL_MW_DSP_ABILITIES calling" " tp3780I_QueryAbilities\n"); - mutex_lock(&mwave_mutex); + lock_kernel(); retval = tp3780I_QueryAbilities(&pDrvData->rBDData, &rAbilities); - mutex_unlock(&mwave_mutex); + unlock_kernel(); PRINTK_2(TRACE_MWAVE, "mwavedd::mwave_ioctl, IOCTL_MW_DSP_ABILITIES" " retval %x from tp3780I_QueryAbilities\n", @@ -199,13 +199,13 @@ static long mwave_ioctl(struct file *file, unsigned int iocmd, "mwavedd::mwave_ioctl IOCTL_MW_READ_DATA," " size %lx, ioarg %lx pusBuffer %p\n", rReadData.ulDataLength, ioarg, pusBuffer); - mutex_lock(&mwave_mutex); + lock_kernel(); retval = tp3780I_ReadWriteDspDStore(&pDrvData->rBDData, iocmd, pusBuffer, rReadData.ulDataLength, rReadData.usDspAddress); - mutex_unlock(&mwave_mutex); + unlock_kernel(); } break; @@ -223,12 +223,12 @@ static long mwave_ioctl(struct file *file, unsigned int iocmd, " size %lx, ioarg %lx pusBuffer %p\n", rReadData.ulDataLength / 2, ioarg, pusBuffer); - mutex_lock(&mwave_mutex); + lock_kernel(); retval = tp3780I_ReadWriteDspDStore(&pDrvData->rBDData, iocmd, pusBuffer, rReadData.ulDataLength / 2, rReadData.usDspAddress); - mutex_unlock(&mwave_mutex); + unlock_kernel(); } break; @@ -246,12 +246,12 @@ static long mwave_ioctl(struct file *file, unsigned int iocmd, " size %lx, ioarg %lx pusBuffer %p\n", rWriteData.ulDataLength, ioarg, pusBuffer); - mutex_lock(&mwave_mutex); + lock_kernel(); retval = tp3780I_ReadWriteDspDStore(&pDrvData->rBDData, iocmd, pusBuffer, rWriteData.ulDataLength, rWriteData.usDspAddress); - mutex_unlock(&mwave_mutex); + unlock_kernel(); } break; @@ -269,12 +269,12 @@ static long mwave_ioctl(struct file *file, unsigned int iocmd, " size %lx, ioarg %lx pusBuffer %p\n", rWriteData.ulDataLength, ioarg, pusBuffer); - mutex_lock(&mwave_mutex); + lock_kernel(); retval = tp3780I_ReadWriteDspIStore(&pDrvData->rBDData, iocmd, pusBuffer, rWriteData.ulDataLength, rWriteData.usDspAddress); - mutex_unlock(&mwave_mutex); + unlock_kernel(); } break; @@ -295,10 +295,10 @@ static long mwave_ioctl(struct file *file, unsigned int iocmd, ipcnum, pDrvData->IPCs[ipcnum].usIntCount); - mutex_lock(&mwave_mutex); + lock_kernel(); pDrvData->IPCs[ipcnum].bIsHere = FALSE; pDrvData->IPCs[ipcnum].bIsEnabled = TRUE; - mutex_unlock(&mwave_mutex); + unlock_kernel(); PRINTK_2(TRACE_MWAVE, "mwavedd::mwave_ioctl IOCTL_MW_REGISTER_IPC" @@ -323,7 +323,7 @@ static long mwave_ioctl(struct file *file, unsigned int iocmd, ipcnum, pDrvData->IPCs[ipcnum].usIntCount); - mutex_lock(&mwave_mutex); + lock_kernel(); if (pDrvData->IPCs[ipcnum].bIsEnabled == TRUE) { DECLARE_WAITQUEUE(wait, current); @@ -364,7 +364,7 @@ static long mwave_ioctl(struct file *file, unsigned int iocmd, " processing\n", ipcnum); } - mutex_unlock(&mwave_mutex); + unlock_kernel(); } break; @@ -383,14 +383,14 @@ static long mwave_ioctl(struct file *file, unsigned int iocmd, ipcnum); return -EINVAL; } - mutex_lock(&mwave_mutex); + lock_kernel(); if (pDrvData->IPCs[ipcnum].bIsEnabled == TRUE) { pDrvData->IPCs[ipcnum].bIsEnabled = FALSE; if (pDrvData->IPCs[ipcnum].bIsHere == TRUE) { wake_up_interruptible(&pDrvData->IPCs[ipcnum].ipc_wait_queue); } } - mutex_unlock(&mwave_mutex); + unlock_kernel(); } break; @@ -479,8 +479,7 @@ static const struct file_operations mwave_fops = { .write = mwave_write, .unlocked_ioctl = mwave_ioctl, .open = mwave_open, - .release = mwave_close, - .llseek = default_llseek, + .release = mwave_close }; diff --git a/trunk/drivers/char/nvram.c b/trunk/drivers/char/nvram.c index 166f1e7aaa7e..66d2917b003f 100644 --- a/trunk/drivers/char/nvram.c +++ b/trunk/drivers/char/nvram.c @@ -109,11 +109,10 @@ #include #include #include -#include +#include #include -static DEFINE_MUTEX(nvram_mutex); static DEFINE_SPINLOCK(nvram_state_lock); static int nvram_open_cnt; /* #times opened */ static int nvram_open_mode; /* special open modes */ @@ -309,7 +308,7 @@ static long nvram_ioctl(struct file *file, unsigned int cmd, if (!capable(CAP_SYS_ADMIN)) return -EACCES; - mutex_lock(&nvram_mutex); + lock_kernel(); spin_lock_irq(&rtc_lock); for (i = 0; i < NVRAM_BYTES; ++i) @@ -317,7 +316,7 @@ static long nvram_ioctl(struct file *file, unsigned int cmd, __nvram_set_checksum(); spin_unlock_irq(&rtc_lock); - mutex_unlock(&nvram_mutex); + unlock_kernel(); return 0; case NVRAM_SETCKS: @@ -326,11 +325,11 @@ static long nvram_ioctl(struct file *file, unsigned int cmd, if (!capable(CAP_SYS_ADMIN)) return -EACCES; - mutex_lock(&nvram_mutex); + lock_kernel(); spin_lock_irq(&rtc_lock); __nvram_set_checksum(); spin_unlock_irq(&rtc_lock); - mutex_unlock(&nvram_mutex); + unlock_kernel(); return 0; default: diff --git a/trunk/drivers/char/nwbutton.c b/trunk/drivers/char/nwbutton.c index 8994ce32e6c7..2604246501e4 100644 --- a/trunk/drivers/char/nwbutton.c +++ b/trunk/drivers/char/nwbutton.c @@ -182,7 +182,6 @@ static int button_read (struct file *filp, char __user *buffer, static const struct file_operations button_fops = { .owner = THIS_MODULE, .read = button_read, - .llseek = noop_llseek, }; /* diff --git a/trunk/drivers/char/nwflash.c b/trunk/drivers/char/nwflash.c index a12f52400dbc..043a1c7b86be 100644 --- a/trunk/drivers/char/nwflash.c +++ b/trunk/drivers/char/nwflash.c @@ -25,6 +25,7 @@ #include #include #include +#include #include #include @@ -40,7 +41,6 @@ #define NWFLASH_VERSION "6.4" -static DEFINE_MUTEX(flash_mutex); static void kick_open(void); static int get_flash_id(void); static int erase_block(int nBlock); @@ -96,7 +96,7 @@ static int get_flash_id(void) static long flash_ioctl(struct file *filep, unsigned int cmd, unsigned long arg) { - mutex_lock(&flash_mutex); + lock_kernel(); switch (cmd) { case CMD_WRITE_DISABLE: gbWriteBase64Enable = 0; @@ -114,10 +114,10 @@ static long flash_ioctl(struct file *filep, unsigned int cmd, unsigned long arg) default: gbWriteBase64Enable = 0; gbWriteEnable = 0; - mutex_unlock(&flash_mutex); + unlock_kernel(); return -EINVAL; } - mutex_unlock(&flash_mutex); + unlock_kernel(); return 0; } @@ -282,7 +282,7 @@ static loff_t flash_llseek(struct file *file, loff_t offset, int orig) { loff_t ret; - mutex_lock(&flash_mutex); + lock_kernel(); if (flashdebug) printk(KERN_DEBUG "flash_llseek: offset=0x%X, orig=0x%X.\n", (unsigned int) offset, orig); @@ -317,7 +317,7 @@ static loff_t flash_llseek(struct file *file, loff_t offset, int orig) default: ret = -EINVAL; } - mutex_unlock(&flash_mutex); + unlock_kernel(); return ret; } diff --git a/trunk/drivers/char/pc8736x_gpio.c b/trunk/drivers/char/pc8736x_gpio.c index b304ec052501..8ecbcc174c15 100644 --- a/trunk/drivers/char/pc8736x_gpio.c +++ b/trunk/drivers/char/pc8736x_gpio.c @@ -234,7 +234,6 @@ static const struct file_operations pc8736x_gpio_fileops = { .open = pc8736x_gpio_open, .write = nsc_gpio_write, .read = nsc_gpio_read, - .llseek = no_llseek, }; static void __init pc8736x_init_shadow(void) diff --git a/trunk/drivers/char/pcmcia/cm4000_cs.c b/trunk/drivers/char/pcmcia/cm4000_cs.c index 6835c23e9a51..c7b482d15e2a 100644 --- a/trunk/drivers/char/pcmcia/cm4000_cs.c +++ b/trunk/drivers/char/pcmcia/cm4000_cs.c @@ -30,7 +30,7 @@ #include #include #include -#include +#include #include #include @@ -54,8 +54,6 @@ __func__ , ## args); \ } while (0) -static DEFINE_MUTEX(cmm_mutex); - #define T_1SEC (HZ) #define T_10MSEC msecs_to_jiffies(10) #define T_20MSEC msecs_to_jiffies(20) @@ -1417,7 +1415,7 @@ static long cmm_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) iminor(inode), ioctl_names[_IOC_NR(cmd)]); #endif - mutex_lock(&cmm_mutex); + lock_kernel(); rc = -ENODEV; link = dev_table[iminor(inode)]; if (!pcmcia_dev_present(link)) { @@ -1625,7 +1623,7 @@ static long cmm_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) rc = -ENOTTY; } out: - mutex_unlock(&cmm_mutex); + unlock_kernel(); return rc; } @@ -1639,7 +1637,7 @@ static int cmm_open(struct inode *inode, struct file *filp) if (minor >= CM4000_MAX_DEV) return -ENODEV; - mutex_lock(&cmm_mutex); + lock_kernel(); link = dev_table[minor]; if (link == NULL || !pcmcia_dev_present(link)) { ret = -ENODEV; @@ -1684,7 +1682,7 @@ static int cmm_open(struct inode *inode, struct file *filp) DEBUGP(2, dev, "<- cmm_open\n"); ret = nonseekable_open(inode, filp); out: - mutex_unlock(&cmm_mutex); + unlock_kernel(); return ret; } @@ -1866,7 +1864,6 @@ static const struct file_operations cm4000_fops = { .unlocked_ioctl = cmm_ioctl, .open = cmm_open, .release= cmm_close, - .llseek = no_llseek, }; static struct pcmcia_device_id cm4000_ids[] = { diff --git a/trunk/drivers/char/pcmcia/cm4040_cs.c b/trunk/drivers/char/pcmcia/cm4040_cs.c index 5d8d59e865f4..bf2f046fc2c1 100644 --- a/trunk/drivers/char/pcmcia/cm4040_cs.c +++ b/trunk/drivers/char/pcmcia/cm4040_cs.c @@ -24,7 +24,7 @@ #include #include #include -#include +#include #include #include #include @@ -48,8 +48,6 @@ __func__ , ## args); \ } while (0) -static DEFINE_MUTEX(cm4040_mutex); - #define CCID_DRIVER_BULK_DEFAULT_TIMEOUT (150*HZ) #define CCID_DRIVER_ASYNC_POWERUP_TIMEOUT (35*HZ) #define CCID_DRIVER_MINIMUM_TIMEOUT (3*HZ) @@ -442,7 +440,7 @@ static int cm4040_open(struct inode *inode, struct file *filp) if (minor >= CM_MAX_DEV) return -ENODEV; - mutex_lock(&cm4040_mutex); + lock_kernel(); link = dev_table[minor]; if (link == NULL || !pcmcia_dev_present(link)) { ret = -ENODEV; @@ -471,7 +469,7 @@ static int cm4040_open(struct inode *inode, struct file *filp) DEBUGP(2, dev, "<- cm4040_open (successfully)\n"); ret = nonseekable_open(inode, filp); out: - mutex_unlock(&cm4040_mutex); + unlock_kernel(); return ret; } @@ -630,7 +628,6 @@ static const struct file_operations reader_fops = { .open = cm4040_open, .release = cm4040_close, .poll = cm4040_poll, - .llseek = no_llseek, }; static struct pcmcia_device_id cm4040_ids[] = { diff --git a/trunk/drivers/char/ppdev.c b/trunk/drivers/char/ppdev.c index 723152d978a9..02abfddce45a 100644 --- a/trunk/drivers/char/ppdev.c +++ b/trunk/drivers/char/ppdev.c @@ -67,7 +67,7 @@ #include #include #include -#include +#include #include #define PP_VERSION "ppdev: user-space parallel port driver" @@ -97,7 +97,6 @@ struct pp_struct { /* ROUND_UP macro from fs/select.c */ #define ROUND_UP(x,y) (((x)+(y)-1)/(y)) -static DEFINE_MUTEX(pp_do_mutex); static inline void pp_enable_irq (struct pp_struct *pp) { struct parport *port = pp->pdev->port; @@ -631,9 +630,9 @@ static int pp_do_ioctl(struct file *file, unsigned int cmd, unsigned long arg) static long pp_ioctl(struct file *file, unsigned int cmd, unsigned long arg) { long ret; - mutex_lock(&pp_do_mutex); + lock_kernel(); ret = pp_do_ioctl(file, cmd, arg); - mutex_unlock(&pp_do_mutex); + unlock_kernel(); return ret; } @@ -642,6 +641,7 @@ static int pp_open (struct inode * inode, struct file * file) unsigned int minor = iminor(inode); struct pp_struct *pp; + cycle_kernel_lock(); if (minor >= PARPORT_MAX) return -ENXIO; diff --git a/trunk/drivers/char/random.c b/trunk/drivers/char/random.c index 5a1aa64f4e76..caef35a46890 100644 --- a/trunk/drivers/char/random.c +++ b/trunk/drivers/char/random.c @@ -1165,7 +1165,6 @@ const struct file_operations random_fops = { .poll = random_poll, .unlocked_ioctl = random_ioctl, .fasync = random_fasync, - .llseek = noop_llseek, }; const struct file_operations urandom_fops = { @@ -1173,7 +1172,6 @@ const struct file_operations urandom_fops = { .write = random_write, .unlocked_ioctl = random_ioctl, .fasync = random_fasync, - .llseek = noop_llseek, }; /*************************************************************** diff --git a/trunk/drivers/char/raw.c b/trunk/drivers/char/raw.c index bfe25ea9766b..b38942f6bf31 100644 --- a/trunk/drivers/char/raw.c +++ b/trunk/drivers/char/raw.c @@ -19,8 +19,8 @@ #include #include #include +#include #include -#include #include @@ -55,6 +55,7 @@ static int raw_open(struct inode *inode, struct file *filp) return 0; } + lock_kernel(); mutex_lock(&raw_mutex); /* @@ -81,6 +82,7 @@ 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: @@ -89,6 +91,7 @@ static int raw_open(struct inode *inode, struct file *filp) blkdev_put(bdev, filp->f_mode); out: mutex_unlock(&raw_mutex); + unlock_kernel(); return err; } @@ -122,84 +125,20 @@ static long raw_ioctl(struct file *filp, unsigned int command, unsigned long arg) { struct block_device *bdev = filp->private_data; - 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; - - if (number <= 0 || number >= MAX_RAW_MINORS) - return -EINVAL; - - 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. - */ + int ret; - if (MAJOR(dev) == 0 && dev != 0) - return -EINVAL; + lock_kernel(); + ret = blkdev_ioctl(bdev, 0, command, arg); + unlock_kernel(); - 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; + return ret; } -static int bind_get(int number, dev_t *dev) +static void bind_device(struct raw_config_request *rq) { - 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; + 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); } /* @@ -210,78 +149,105 @@ static long raw_ctl_ioctl(struct file *filp, unsigned int command, unsigned long arg) { struct raw_config_request rq; - dev_t dev; - int err; - - 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; - - 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((void __user *)arg, &rq, sizeof(rq))) - return -EFAULT; - - return 0; - } - - 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; + struct raw_device_data *rawdev; int err = 0; - switch (cmd) { + lock_kernel(); + switch (command) { 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); + /* First, find out which raw minor we want */ - if (copy_to_user(user_req, &rq, sizeof(rq))) - return -EFAULT; + if (copy_from_user(&rq, (void __user *) arg, sizeof(rq))) { + err = -EFAULT; + goto out; + } - return 0; + 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; } - - return -EINVAL; +out: + unlock_kernel(); + return err; } -#endif static const struct file_operations raw_fops = { .read = do_sync_read, @@ -292,18 +258,13 @@ static const struct file_operations raw_fops = { .open = raw_open, .release = raw_release, .unlocked_ioctl = raw_ioctl, - .llseek = default_llseek, .owner = THIS_MODULE, }; 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, - .llseek = noop_llseek, }; static struct cdev raw_cdev; diff --git a/trunk/drivers/char/rio/rio_linux.c b/trunk/drivers/char/rio/rio_linux.c index 5e33293d24e3..d58c2eb07f07 100644 --- a/trunk/drivers/char/rio/rio_linux.c +++ b/trunk/drivers/char/rio/rio_linux.c @@ -44,7 +44,7 @@ #include #include #include -#include +#include #include #include @@ -122,7 +122,6 @@ more than 512 ports.... */ /* These constants are derived from SCO Source */ -static DEFINE_MUTEX(rio_fw_mutex); static struct Conf RIOConf = { /* locator */ "RIO Config here", @@ -242,7 +241,6 @@ static struct real_driver rio_real_driver = { static const struct file_operations rio_fw_fops = { .owner = THIS_MODULE, .unlocked_ioctl = rio_fw_ioctl, - .llseek = noop_llseek, }; static struct miscdevice rio_fw_device = { @@ -568,9 +566,9 @@ static long rio_fw_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) func_enter(); /* The "dev" argument isn't used. */ - mutex_lock(&rio_fw_mutex); + lock_kernel(); rc = riocontrol(p, 0, cmd, arg, capable(CAP_SYS_ADMIN)); - mutex_unlock(&rio_fw_mutex); + unlock_kernel(); func_exit(); return rc; diff --git a/trunk/drivers/char/scx200_gpio.c b/trunk/drivers/char/scx200_gpio.c index 0bc135b9b16f..99e5272e3c53 100644 --- a/trunk/drivers/char/scx200_gpio.c +++ b/trunk/drivers/char/scx200_gpio.c @@ -67,7 +67,6 @@ static const struct file_operations scx200_gpio_fileops = { .read = nsc_gpio_read, .open = scx200_gpio_open, .release = scx200_gpio_release, - .llseek = no_llseek, }; static struct cdev scx200_gpio_cdev; /* use 1 cdev for all pins */ diff --git a/trunk/drivers/char/snsc.c b/trunk/drivers/char/snsc.c index 5816b39ff5a9..32b74de18f5f 100644 --- a/trunk/drivers/char/snsc.c +++ b/trunk/drivers/char/snsc.c @@ -21,7 +21,7 @@ #include #include #include -#include +#include #include #include #include @@ -34,7 +34,6 @@ #define SCDRV_BUFSZ 2048 #define SCDRV_TIMEOUT 1000 -static DEFINE_MUTEX(scdrv_mutex); static irqreturn_t scdrv_interrupt(int irq, void *subch_data) { @@ -106,7 +105,7 @@ scdrv_open(struct inode *inode, struct file *file) file->private_data = sd; /* hook this subchannel up to the system controller interrupt */ - mutex_lock(&scdrv_mutex); + lock_kernel(); rv = request_irq(SGI_UART_VECTOR, scdrv_interrupt, IRQF_SHARED | IRQF_DISABLED, SYSCTL_BASENAME, sd); @@ -114,10 +113,10 @@ scdrv_open(struct inode *inode, struct file *file) ia64_sn_irtr_close(sd->sd_nasid, sd->sd_subch); kfree(sd); printk("%s: irq request failed (%d)\n", __func__, rv); - mutex_unlock(&scdrv_mutex); + unlock_kernel(); return -EBUSY; } - mutex_unlock(&scdrv_mutex); + unlock_kernel(); return 0; } @@ -358,7 +357,6 @@ static const struct file_operations scdrv_fops = { .poll = scdrv_poll, .open = scdrv_open, .release = scdrv_release, - .llseek = noop_llseek, }; static struct class *snsc_class; diff --git a/trunk/drivers/char/stallion.c b/trunk/drivers/char/stallion.c index 8ef16490810c..f2167f8e5aab 100644 --- a/trunk/drivers/char/stallion.c +++ b/trunk/drivers/char/stallion.c @@ -608,7 +608,6 @@ static unsigned int sc26198_baudtable[] = { static const struct file_operations stl_fsiomem = { .owner = THIS_MODULE, .unlocked_ioctl = stl_memioctl, - .llseek = noop_llseek, }; static struct class *stallion_class; diff --git a/trunk/drivers/char/sx.c b/trunk/drivers/char/sx.c index e53f16865397..5b24db4ff7f1 100644 --- a/trunk/drivers/char/sx.c +++ b/trunk/drivers/char/sx.c @@ -397,7 +397,6 @@ static struct real_driver sx_real_driver = { static const struct file_operations sx_fw_fops = { .owner = THIS_MODULE, .unlocked_ioctl = sx_fw_ioctl, - .llseek = noop_llseek, }; static struct miscdevice sx_fw_device = { diff --git a/trunk/drivers/char/sysrq.c b/trunk/drivers/char/sysrq.c index f3019f53e875..ef31bb81e843 100644 --- a/trunk/drivers/char/sysrq.c +++ b/trunk/drivers/char/sysrq.c @@ -772,7 +772,6 @@ static ssize_t write_sysrq_trigger(struct file *file, const char __user *buf, static const struct file_operations proc_sysrq_trigger_operations = { .write = write_sysrq_trigger, - .llseek = noop_llseek, }; static void sysrq_init_procfs(void) diff --git a/trunk/drivers/char/tb0219.c b/trunk/drivers/char/tb0219.c index ad264185eb10..cad4eb65f13d 100644 --- a/trunk/drivers/char/tb0219.c +++ b/trunk/drivers/char/tb0219.c @@ -261,7 +261,6 @@ static const struct file_operations tb0219_fops = { .write = tanbac_tb0219_write, .open = tanbac_tb0219_open, .release = tanbac_tb0219_release, - .llseek = no_llseek, }; static void tb0219_restart(char *command) diff --git a/trunk/drivers/char/tlclk.c b/trunk/drivers/char/tlclk.c index 0c964cdcc223..80ea6bcfffdc 100644 --- a/trunk/drivers/char/tlclk.c +++ b/trunk/drivers/char/tlclk.c @@ -37,7 +37,7 @@ #include #include #include -#include +#include #include #include #include @@ -206,7 +206,7 @@ static int tlclk_open(struct inode *inode, struct file *filp) { int result; - mutex_lock(&tlclk_mutex); + lock_kernel(); 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: - mutex_unlock(&tlclk_mutex); + unlock_kernel(); return result; } @@ -267,7 +267,6 @@ static const struct file_operations tlclk_fops = { .read = tlclk_read, .open = tlclk_open, .release = tlclk_release, - .llseek = noop_llseek, }; diff --git a/trunk/drivers/char/toshiba.c b/trunk/drivers/char/toshiba.c index 014c9d90d297..f8bc79f6de34 100644 --- a/trunk/drivers/char/toshiba.c +++ b/trunk/drivers/char/toshiba.c @@ -68,7 +68,7 @@ #include #include #include -#include +#include #include #define TOSH_MINOR_DEV 181 @@ -78,7 +78,6 @@ MODULE_AUTHOR("Jonathan Buzzard "); MODULE_DESCRIPTION("Toshiba laptop SMM driver"); MODULE_SUPPORTED_DEVICE("toshiba"); -static DEFINE_MUTEX(tosh_mutex); static int tosh_fn; module_param_named(fn, tosh_fn, int, 0); MODULE_PARM_DESC(fn, "User specified Fn key detection port"); @@ -96,7 +95,6 @@ static long tosh_ioctl(struct file *, unsigned int, static const struct file_operations tosh_fops = { .owner = THIS_MODULE, .unlocked_ioctl = tosh_ioctl, - .llseek = noop_llseek, }; static struct miscdevice tosh_device = { @@ -276,16 +274,16 @@ static long tosh_ioctl(struct file *fp, unsigned int cmd, unsigned long arg) return -EINVAL; /* do we need to emulate the fan ? */ - mutex_lock(&tosh_mutex); + lock_kernel(); if (tosh_fan==1) { if (((ax==0xf300) || (ax==0xf400)) && (bx==0x0004)) { err = tosh_emulate_fan(®s); - mutex_unlock(&tosh_mutex); + unlock_kernel(); break; } } err = tosh_smm(®s); - mutex_unlock(&tosh_mutex); + unlock_kernel(); break; default: return -EINVAL; diff --git a/trunk/drivers/char/uv_mmtimer.c b/trunk/drivers/char/uv_mmtimer.c index 493b47a0d511..c7072ba14f48 100644 --- a/trunk/drivers/char/uv_mmtimer.c +++ b/trunk/drivers/char/uv_mmtimer.c @@ -52,7 +52,6 @@ static const struct file_operations uv_mmtimer_fops = { .owner = THIS_MODULE, .mmap = uv_mmtimer_mmap, .unlocked_ioctl = uv_mmtimer_ioctl, - .llseek = noop_llseek, }; /** diff --git a/trunk/drivers/char/viotape.c b/trunk/drivers/char/viotape.c index ad6e64a2912d..42f7fa442ff8 100644 --- a/trunk/drivers/char/viotape.c +++ b/trunk/drivers/char/viotape.c @@ -46,7 +46,7 @@ #include #include #include -#include +#include #include #include @@ -64,7 +64,6 @@ #define VIOTAPE_KERN_WARN KERN_WARNING "viotape: " #define VIOTAPE_KERN_INFO KERN_INFO "viotape: " -static DEFINE_MUTEX(proc_viotape_mutex); static int viotape_numdev; /* @@ -685,9 +684,9 @@ static long viotap_unlocked_ioctl(struct file *file, { long rc; - mutex_lock(&proc_viotape_mutex); + lock_kernel(); rc = viotap_ioctl(file->f_path.dentry->d_inode, file, cmd, arg); - mutex_unlock(&proc_viotape_mutex); + unlock_kernel(); return rc; } @@ -701,7 +700,7 @@ static int viotap_open(struct inode *inode, struct file *file) if (op == NULL) return -ENOMEM; - mutex_lock(&proc_viotape_mutex); + lock_kernel(); get_dev_info(file->f_path.dentry->d_inode, &devi); /* Note: We currently only support one mode! */ @@ -732,7 +731,7 @@ static int viotap_open(struct inode *inode, struct file *file) free_op: free_op_struct(op); - mutex_unlock(&proc_viotape_mutex); + unlock_kernel(); return ret; } @@ -805,7 +804,6 @@ const struct file_operations viotap_fops = { .unlocked_ioctl = viotap_unlocked_ioctl, .open = viotap_open, .release = viotap_release, - .llseek = noop_llseek, }; /* Handle interrupt events for tape */ diff --git a/trunk/drivers/char/xilinx_hwicap/xilinx_hwicap.c b/trunk/drivers/char/xilinx_hwicap/xilinx_hwicap.c index 9f2272e6de1c..b663d573aad9 100644 --- a/trunk/drivers/char/xilinx_hwicap/xilinx_hwicap.c +++ b/trunk/drivers/char/xilinx_hwicap/xilinx_hwicap.c @@ -81,6 +81,7 @@ #include #include #include +#include #include #include #include @@ -111,7 +112,6 @@ #define HWICAP_DEVICES 1 /* An array, which is set to true when the device is registered. */ -static DEFINE_MUTEX(hwicap_mutex); static bool probed_devices[HWICAP_DEVICES]; static struct mutex icap_sem; @@ -502,7 +502,7 @@ static int hwicap_open(struct inode *inode, struct file *file) struct hwicap_drvdata *drvdata; int status; - mutex_lock(&hwicap_mutex); + lock_kernel(); drvdata = container_of(inode->i_cdev, struct hwicap_drvdata, cdev); status = mutex_lock_interruptible(&drvdata->sem); @@ -528,7 +528,7 @@ static int hwicap_open(struct inode *inode, struct file *file) error: mutex_unlock(&drvdata->sem); out: - mutex_unlock(&hwicap_mutex); + unlock_kernel(); return status; } @@ -567,7 +567,6 @@ static const struct file_operations hwicap_fops = { .read = hwicap_read, .open = hwicap_open, .release = hwicap_release, - .llseek = noop_llseek, }; static int __devinit hwicap_setup(struct device *dev, int id, diff --git a/trunk/drivers/dma/coh901318.c b/trunk/drivers/dma/coh901318.c index ae2b8714d190..557e2272e5b3 100644 --- a/trunk/drivers/dma/coh901318.c +++ b/trunk/drivers/dma/coh901318.c @@ -157,7 +157,6 @@ static const struct file_operations coh901318_debugfs_status_operations = { .owner = THIS_MODULE, .open = coh901318_debugfs_open, .read = coh901318_debugfs_read, - .llseek = default_llseek, }; diff --git a/trunk/drivers/firewire/nosy.c b/trunk/drivers/firewire/nosy.c index bf184fb59a5e..8528b10763ed 100644 --- a/trunk/drivers/firewire/nosy.c +++ b/trunk/drivers/firewire/nosy.c @@ -405,7 +405,6 @@ static const struct file_operations nosy_ops = { .poll = nosy_poll, .open = nosy_open, .release = nosy_release, - .llseek = noop_llseek, }; #define PHY_PACKET_SIZE 12 /* 1 payload, 1 inverse, 1 ack = 3 quadlets */ diff --git a/trunk/drivers/gpu/drm/Kconfig b/trunk/drivers/gpu/drm/Kconfig index 7af443672626..4cab0c6397e3 100644 --- a/trunk/drivers/gpu/drm/Kconfig +++ b/trunk/drivers/gpu/drm/Kconfig @@ -73,8 +73,7 @@ source "drivers/gpu/drm/radeon/Kconfig" config DRM_I810 tristate "Intel I810" - # BKL usage in order to avoid AB-BA deadlocks, may become BROKEN_ON_SMP - depends on DRM && AGP && AGP_INTEL && BKL + depends on DRM && AGP && AGP_INTEL 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 @@ -87,8 +86,6 @@ 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 diff --git a/trunk/drivers/gpu/drm/drm_drv.c b/trunk/drivers/gpu/drm/drm_drv.c index ff6690f4fc87..84da748555bc 100644 --- a/trunk/drivers/gpu/drm/drm_drv.c +++ b/trunk/drivers/gpu/drm/drm_drv.c @@ -284,8 +284,7 @@ EXPORT_SYMBOL(drm_exit); /** File operations structure */ static const struct file_operations drm_stub_fops = { .owner = THIS_MODULE, - .open = drm_stub_open, - .llseek = noop_llseek, + .open = drm_stub_open }; static int __init drm_core_init(void) diff --git a/trunk/drivers/gpu/drm/i810/i810_dma.c b/trunk/drivers/gpu/drm/i810/i810_dma.c index ff33e53bbbf8..fb07e73581e8 100644 --- a/trunk/drivers/gpu/drm/i810/i810_dma.c +++ b/trunk/drivers/gpu/drm/i810/i810_dma.c @@ -119,7 +119,6 @@ static const struct file_operations i810_buffer_fops = { .unlocked_ioctl = i810_ioctl, .mmap = i810_mmap_buffers, .fasync = drm_fasync, - .llseek = noop_llseek, }; static int i810_map_buffer(struct drm_buf *buf, struct drm_file *file_priv) diff --git a/trunk/drivers/gpu/drm/i810/i810_drv.c b/trunk/drivers/gpu/drm/i810/i810_drv.c index fe69914ce507..b4250b2cac1f 100644 --- a/trunk/drivers/gpu/drm/i810/i810_drv.c +++ b/trunk/drivers/gpu/drm/i810/i810_drv.c @@ -63,7 +63,6 @@ static struct drm_driver driver = { .mmap = drm_mmap, .poll = drm_poll, .fasync = drm_fasync, - .llseek = noop_llseek, }, .pci_driver = { diff --git a/trunk/drivers/gpu/drm/i830/i830_dma.c b/trunk/drivers/gpu/drm/i830/i830_dma.c index ca6f31ff0eec..cc92c7e6236f 100644 --- a/trunk/drivers/gpu/drm/i830/i830_dma.c +++ b/trunk/drivers/gpu/drm/i830/i830_dma.c @@ -121,7 +121,6 @@ static const struct file_operations i830_buffer_fops = { .unlocked_ioctl = i830_ioctl, .mmap = i830_mmap_buffers, .fasync = drm_fasync, - .llseek = noop_llseek, }; static int i830_map_buffer(struct drm_buf *buf, struct drm_file *file_priv) diff --git a/trunk/drivers/gpu/drm/i830/i830_drv.c b/trunk/drivers/gpu/drm/i830/i830_drv.c index 5b6298b24e24..a5c66aa82f0c 100644 --- a/trunk/drivers/gpu/drm/i830/i830_drv.c +++ b/trunk/drivers/gpu/drm/i830/i830_drv.c @@ -74,7 +74,6 @@ static struct drm_driver driver = { .mmap = drm_mmap, .poll = drm_poll, .fasync = drm_fasync, - .llseek = noop_llseek, }, .pci_driver = { diff --git a/trunk/drivers/gpu/drm/i915/i915_debugfs.c b/trunk/drivers/gpu/drm/i915/i915_debugfs.c index 048149748fdc..5e43d7076789 100644 --- a/trunk/drivers/gpu/drm/i915/i915_debugfs.c +++ b/trunk/drivers/gpu/drm/i915/i915_debugfs.c @@ -782,7 +782,6 @@ static const struct file_operations i915_wedged_fops = { .open = i915_wedged_open, .read = i915_wedged_read, .write = i915_wedged_write, - .llseek = default_llseek, }; /* As the drm_debugfs_init() routines are called before dev->dev_private is diff --git a/trunk/drivers/gpu/drm/i915/i915_drv.c b/trunk/drivers/gpu/drm/i915/i915_drv.c index 895ab896e336..6dbe14cc4f74 100644 --- a/trunk/drivers/gpu/drm/i915/i915_drv.c +++ b/trunk/drivers/gpu/drm/i915/i915_drv.c @@ -548,7 +548,6 @@ static struct drm_driver driver = { #ifdef CONFIG_COMPAT .compat_ioctl = i915_compat_ioctl, #endif - .llseek = noop_llseek, }, .pci_driver = { diff --git a/trunk/drivers/gpu/drm/mga/mga_drv.c b/trunk/drivers/gpu/drm/mga/mga_drv.c index ac64f0b0392e..26d0d8ced80d 100644 --- a/trunk/drivers/gpu/drm/mga/mga_drv.c +++ b/trunk/drivers/gpu/drm/mga/mga_drv.c @@ -75,7 +75,6 @@ static struct drm_driver driver = { #ifdef CONFIG_COMPAT .compat_ioctl = mga_compat_ioctl, #endif - .llseek = noop_llseek, }, .pci_driver = { .name = DRIVER_NAME, diff --git a/trunk/drivers/gpu/drm/nouveau/nouveau_drv.c b/trunk/drivers/gpu/drm/nouveau/nouveau_drv.c index eb15345162a0..1de5eb53e016 100644 --- a/trunk/drivers/gpu/drm/nouveau/nouveau_drv.c +++ b/trunk/drivers/gpu/drm/nouveau/nouveau_drv.c @@ -393,7 +393,6 @@ static struct drm_driver driver = { #if defined(CONFIG_COMPAT) .compat_ioctl = nouveau_compat_ioctl, #endif - .llseek = noop_llseek, }, .pci_driver = { .name = DRIVER_NAME, diff --git a/trunk/drivers/gpu/drm/r128/r128_drv.c b/trunk/drivers/gpu/drm/r128/r128_drv.c index d42c76c23714..1e2971f13aa1 100644 --- a/trunk/drivers/gpu/drm/r128/r128_drv.c +++ b/trunk/drivers/gpu/drm/r128/r128_drv.c @@ -71,7 +71,6 @@ static struct drm_driver driver = { #ifdef CONFIG_COMPAT .compat_ioctl = r128_compat_ioctl, #endif - .llseek = noop_llseek, }, .pci_driver = { .name = DRIVER_NAME, diff --git a/trunk/drivers/gpu/drm/radeon/radeon_drv.c b/trunk/drivers/gpu/drm/radeon/radeon_drv.c index 29c1237c2e7b..795403b0e2cd 100644 --- a/trunk/drivers/gpu/drm/radeon/radeon_drv.c +++ b/trunk/drivers/gpu/drm/radeon/radeon_drv.c @@ -219,7 +219,6 @@ static struct drm_driver driver_old = { #ifdef CONFIG_COMPAT .compat_ioctl = radeon_compat_ioctl, #endif - .llseek = noop_llseek, }, .pci_driver = { diff --git a/trunk/drivers/gpu/drm/savage/savage_drv.c b/trunk/drivers/gpu/drm/savage/savage_drv.c index 2a2830f5a840..021de44c15ab 100644 --- a/trunk/drivers/gpu/drm/savage/savage_drv.c +++ b/trunk/drivers/gpu/drm/savage/savage_drv.c @@ -54,7 +54,6 @@ static struct drm_driver driver = { .mmap = drm_mmap, .poll = drm_poll, .fasync = drm_fasync, - .llseek = noop_llseek, }, .pci_driver = { diff --git a/trunk/drivers/gpu/drm/sis/sis_drv.c b/trunk/drivers/gpu/drm/sis/sis_drv.c index 4bb10ef6676a..776bf9e9ea1a 100644 --- a/trunk/drivers/gpu/drm/sis/sis_drv.c +++ b/trunk/drivers/gpu/drm/sis/sis_drv.c @@ -83,7 +83,6 @@ static struct drm_driver driver = { .mmap = drm_mmap, .poll = drm_poll, .fasync = drm_fasync, - .llseek = noop_llseek, }, .pci_driver = { .name = DRIVER_NAME, diff --git a/trunk/drivers/gpu/drm/tdfx/tdfx_drv.c b/trunk/drivers/gpu/drm/tdfx/tdfx_drv.c index 640567ef713d..ec5a43e65722 100644 --- a/trunk/drivers/gpu/drm/tdfx/tdfx_drv.c +++ b/trunk/drivers/gpu/drm/tdfx/tdfx_drv.c @@ -52,7 +52,6 @@ static struct drm_driver driver = { .mmap = drm_mmap, .poll = drm_poll, .fasync = drm_fasync, - .llseek = noop_llseek, }, .pci_driver = { .name = DRIVER_NAME, diff --git a/trunk/drivers/gpu/drm/via/via_drv.c b/trunk/drivers/gpu/drm/via/via_drv.c index b8984a5ae521..7a1b210401e0 100644 --- a/trunk/drivers/gpu/drm/via/via_drv.c +++ b/trunk/drivers/gpu/drm/via/via_drv.c @@ -62,7 +62,6 @@ static struct drm_driver driver = { .mmap = drm_mmap, .poll = drm_poll, .fasync = drm_fasync, - .llseek = noop_llseek, }, .pci_driver = { .name = DRIVER_NAME, diff --git a/trunk/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c b/trunk/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c index 2ef93df9e8ae..a96ed6d9d010 100644 --- a/trunk/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c +++ b/trunk/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c @@ -820,7 +820,6 @@ static struct drm_driver driver = { #if defined(CONFIG_COMPAT) .compat_ioctl = drm_compat_ioctl, #endif - .llseek = noop_llseek, }, .pci_driver = { .name = VMWGFX_DRIVER_NAME, diff --git a/trunk/drivers/gpu/vga/vgaarb.c b/trunk/drivers/gpu/vga/vgaarb.c index c380c65da417..f366f968155a 100644 --- a/trunk/drivers/gpu/vga/vgaarb.c +++ b/trunk/drivers/gpu/vga/vgaarb.c @@ -1211,7 +1211,6 @@ static const struct file_operations vga_arb_device_fops = { .poll = vga_arb_fpoll, .open = vga_arb_open, .release = vga_arb_release, - .llseek = noop_llseek, }; static struct miscdevice vga_arb_device = { diff --git a/trunk/drivers/hid/hid-debug.c b/trunk/drivers/hid/hid-debug.c index 61a3e572224a..850d02a7a925 100644 --- a/trunk/drivers/hid/hid-debug.c +++ b/trunk/drivers/hid/hid-debug.c @@ -1051,7 +1051,6 @@ static const struct file_operations hid_debug_events_fops = { .read = hid_debug_events_read, .poll = hid_debug_events_poll, .release = hid_debug_events_release, - .llseek = noop_llseek, }; diff --git a/trunk/drivers/hid/hid-roccat.c b/trunk/drivers/hid/hid-roccat.c index 5a6879e235ac..f6e80c7ca61e 100644 --- a/trunk/drivers/hid/hid-roccat.c +++ b/trunk/drivers/hid/hid-roccat.c @@ -384,7 +384,6 @@ static const struct file_operations roccat_ops = { .poll = roccat_poll, .open = roccat_open, .release = roccat_release, - .llseek = noop_llseek, }; static int __init roccat_init(void) diff --git a/trunk/drivers/hid/hidraw.c b/trunk/drivers/hid/hidraw.c index 925992f549f0..a3866b5c0c43 100644 --- a/trunk/drivers/hid/hidraw.c +++ b/trunk/drivers/hid/hidraw.c @@ -340,7 +340,6 @@ static const struct file_operations hidraw_ops = { .open = hidraw_open, .release = hidraw_release, .unlocked_ioctl = hidraw_ioctl, - .llseek = noop_llseek, }; void hidraw_report_event(struct hid_device *hid, u8 *data, int len) diff --git a/trunk/drivers/hid/usbhid/hiddev.c b/trunk/drivers/hid/usbhid/hiddev.c index dfcb27613ec5..681e620eb95b 100644 --- a/trunk/drivers/hid/usbhid/hiddev.c +++ b/trunk/drivers/hid/usbhid/hiddev.c @@ -847,7 +847,6 @@ static const struct file_operations hiddev_fops = { #ifdef CONFIG_COMPAT .compat_ioctl = hiddev_compat_ioctl, #endif - .llseek = noop_llseek, }; static char *hiddev_devnode(struct device *dev, mode_t *mode) diff --git a/trunk/drivers/hwmon/asus_atk0110.c b/trunk/drivers/hwmon/asus_atk0110.c index 23b8555215d2..653db1bda934 100644 --- a/trunk/drivers/hwmon/asus_atk0110.c +++ b/trunk/drivers/hwmon/asus_atk0110.c @@ -762,7 +762,6 @@ static const struct file_operations atk_debugfs_ggrp_fops = { .read = atk_debugfs_ggrp_read, .open = atk_debugfs_ggrp_open, .release = atk_debugfs_ggrp_release, - .llseek = no_llseek, }; static void atk_debugfs_init(struct atk_data *data) diff --git a/trunk/drivers/hwmon/fschmd.c b/trunk/drivers/hwmon/fschmd.c index d4d4ca65d371..b7ca2a9676cf 100644 --- a/trunk/drivers/hwmon/fschmd.c +++ b/trunk/drivers/hwmon/fschmd.c @@ -38,6 +38,7 @@ #include #include #include +#include #include #include #include @@ -49,7 +50,6 @@ #include /* Addresses to scan */ -static DEFINE_MUTEX(watchdog_mutex); static const unsigned short normal_i2c[] = { 0x73, I2C_CLIENT_END }; /* Insmod parameters */ @@ -858,7 +858,7 @@ static long watchdog_ioctl(struct file *filp, unsigned int cmd, unsigned long ar int i, ret = 0; struct fschmd_data *data = filp->private_data; - mutex_lock(&watchdog_mutex); + lock_kernel(); switch (cmd) { case WDIOC_GETSUPPORT: ident.firmware_version = data->revision; @@ -915,7 +915,7 @@ static long watchdog_ioctl(struct file *filp, unsigned int cmd, unsigned long ar default: ret = -ENOTTY; } - mutex_unlock(&watchdog_mutex); + unlock_kernel(); return ret; } diff --git a/trunk/drivers/hwmon/w83793.c b/trunk/drivers/hwmon/w83793.c index 8e540ada47d2..697202e27891 100644 --- a/trunk/drivers/hwmon/w83793.c +++ b/trunk/drivers/hwmon/w83793.c @@ -35,6 +35,7 @@ #include #include #include +#include #include #include #include @@ -51,7 +52,6 @@ #define WATCHDOG_TIMEOUT 2 /* 2 minute default timeout */ /* Addresses to scan */ -static DEFINE_MUTEX(watchdog_mutex); static const unsigned short normal_i2c[] = { 0x2c, 0x2d, 0x2e, 0x2f, I2C_CLIENT_END }; @@ -1333,7 +1333,7 @@ static long watchdog_ioctl(struct file *filp, unsigned int cmd, int val, ret = 0; struct w83793_data *data = filp->private_data; - mutex_lock(&watchdog_mutex); + lock_kernel(); switch (cmd) { case WDIOC_GETSUPPORT: if (!nowayout) @@ -1387,7 +1387,7 @@ static long watchdog_ioctl(struct file *filp, unsigned int cmd, default: ret = -ENOTTY; } - mutex_unlock(&watchdog_mutex); + unlock_kernel(); return ret; } diff --git a/trunk/drivers/ide/ide-cd.c b/trunk/drivers/ide/ide-cd.c index 0c73fe39a236..31fc76960a8f 100644 --- a/trunk/drivers/ide/ide-cd.c +++ b/trunk/drivers/ide/ide-cd.c @@ -31,6 +31,7 @@ #include #include #include +#include #include #include #include @@ -51,7 +52,6 @@ #include "ide-cd.h" -static DEFINE_MUTEX(ide_cd_mutex); static DEFINE_MUTEX(idecd_ref_mutex); static void ide_cd_release(struct device *); @@ -1602,7 +1602,7 @@ static int idecd_open(struct block_device *bdev, fmode_t mode) struct cdrom_info *info; int rc = -ENXIO; - mutex_lock(&ide_cd_mutex); + lock_kernel(); info = ide_cd_get(bdev->bd_disk); if (!info) goto out; @@ -1611,7 +1611,7 @@ static int idecd_open(struct block_device *bdev, fmode_t mode) if (rc < 0) ide_cd_put(info); out: - mutex_unlock(&ide_cd_mutex); + unlock_kernel(); return rc; } @@ -1619,11 +1619,11 @@ static int idecd_release(struct gendisk *disk, fmode_t mode) { struct cdrom_info *info = ide_drv_g(disk, cdrom_info); - mutex_lock(&ide_cd_mutex); + lock_kernel(); cdrom_release(&info->devinfo, mode); ide_cd_put(info); - mutex_unlock(&ide_cd_mutex); + unlock_kernel(); return 0; } @@ -1694,9 +1694,9 @@ static int idecd_ioctl(struct block_device *bdev, fmode_t mode, { int ret; - mutex_lock(&ide_cd_mutex); + lock_kernel(); ret = idecd_locked_ioctl(bdev, mode, cmd, arg); - mutex_unlock(&ide_cd_mutex); + unlock_kernel(); return ret; } diff --git a/trunk/drivers/ide/ide-disk_ioctl.c b/trunk/drivers/ide/ide-disk_ioctl.c index da36f729ff32..ec94c66918f6 100644 --- a/trunk/drivers/ide/ide-disk_ioctl.c +++ b/trunk/drivers/ide/ide-disk_ioctl.c @@ -1,11 +1,10 @@ #include #include #include -#include +#include #include "ide-disk.h" -static DEFINE_MUTEX(ide_disk_ioctl_mutex); static const struct ide_ioctl_devset ide_disk_ioctl_settings[] = { { HDIO_GET_ADDRESS, HDIO_SET_ADDRESS, &ide_devset_address }, { HDIO_GET_MULTCOUNT, HDIO_SET_MULTCOUNT, &ide_devset_multcount }, @@ -20,13 +19,13 @@ int ide_disk_ioctl(ide_drive_t *drive, struct block_device *bdev, fmode_t mode, { int err; - mutex_lock(&ide_disk_ioctl_mutex); + lock_kernel(); err = ide_setting_ioctl(drive, bdev, cmd, arg, ide_disk_ioctl_settings); if (err != -EOPNOTSUPP) goto out; err = generic_ide_ioctl(drive, bdev, cmd, arg); out: - mutex_unlock(&ide_disk_ioctl_mutex); + unlock_kernel(); return err; } diff --git a/trunk/drivers/ide/ide-floppy_ioctl.c b/trunk/drivers/ide/ide-floppy_ioctl.c index d267b7affad6..fd3d05ab3417 100644 --- a/trunk/drivers/ide/ide-floppy_ioctl.c +++ b/trunk/drivers/ide/ide-floppy_ioctl.c @@ -5,7 +5,7 @@ #include #include #include -#include +#include #include @@ -32,7 +32,6 @@ * On exit we set nformats to the number of records we've actually initialized. */ -static DEFINE_MUTEX(ide_floppy_ioctl_mutex); static int ide_floppy_get_format_capacities(ide_drive_t *drive, struct ide_atapi_pc *pc, int __user *arg) @@ -277,7 +276,7 @@ int ide_floppy_ioctl(ide_drive_t *drive, struct block_device *bdev, void __user *argp = (void __user *)arg; int err; - mutex_lock(&ide_floppy_ioctl_mutex); + lock_kernel(); if (cmd == CDROMEJECT || cmd == CDROM_LOCKDOOR) { err = ide_floppy_lockdoor(drive, &pc, arg, cmd); goto out; @@ -299,6 +298,6 @@ int ide_floppy_ioctl(ide_drive_t *drive, struct block_device *bdev, err = generic_ide_ioctl(drive, bdev, cmd, arg); out: - mutex_unlock(&ide_floppy_ioctl_mutex); + unlock_kernel(); return err; } diff --git a/trunk/drivers/ide/ide-gd.c b/trunk/drivers/ide/ide-gd.c index 35c4b43585e3..70aeeb18833e 100644 --- a/trunk/drivers/ide/ide-gd.c +++ b/trunk/drivers/ide/ide-gd.c @@ -1,3 +1,4 @@ +#include #include #include #include @@ -22,7 +23,6 @@ #define IDE_GD_VERSION "1.18" /* module parameters */ -static DEFINE_MUTEX(ide_gd_mutex); static unsigned long debug_mask; module_param(debug_mask, ulong, 0644); @@ -242,9 +242,9 @@ static int ide_gd_unlocked_open(struct block_device *bdev, fmode_t mode) { int ret; - mutex_lock(&ide_gd_mutex); + lock_kernel(); ret = ide_gd_open(bdev, mode); - mutex_unlock(&ide_gd_mutex); + unlock_kernel(); return ret; } @@ -257,7 +257,7 @@ static int ide_gd_release(struct gendisk *disk, fmode_t mode) ide_debug_log(IDE_DBG_FUNC, "enter"); - mutex_lock(&ide_gd_mutex); + lock_kernel(); if (idkp->openers == 1) drive->disk_ops->flush(drive); @@ -269,7 +269,7 @@ static int ide_gd_release(struct gendisk *disk, fmode_t mode) idkp->openers--; ide_disk_put(idkp); - mutex_unlock(&ide_gd_mutex); + unlock_kernel(); return 0; } diff --git a/trunk/drivers/ide/ide-tape.c b/trunk/drivers/ide/ide-tape.c index 7ecb1ade8874..6d622cb5ac81 100644 --- a/trunk/drivers/ide/ide-tape.c +++ b/trunk/drivers/ide/ide-tape.c @@ -32,9 +32,11 @@ #include #include #include +#include #include #include #include +#include #include #include #include @@ -218,7 +220,6 @@ typedef struct ide_tape_obj { char write_prot; } idetape_tape_t; -static DEFINE_MUTEX(ide_tape_mutex); static DEFINE_MUTEX(idetape_ref_mutex); static DEFINE_MUTEX(idetape_chrdev_mutex); @@ -1425,9 +1426,9 @@ static long idetape_chrdev_ioctl(struct file *file, unsigned int cmd, unsigned long arg) { long ret; - mutex_lock(&ide_tape_mutex); + lock_kernel(); ret = do_idetape_chrdev_ioctl(file, cmd, arg); - mutex_unlock(&ide_tape_mutex); + unlock_kernel(); return ret; } @@ -1902,16 +1903,15 @@ static const struct file_operations idetape_fops = { .unlocked_ioctl = idetape_chrdev_ioctl, .open = idetape_chrdev_open, .release = idetape_chrdev_release, - .llseek = noop_llseek, }; static int idetape_open(struct block_device *bdev, fmode_t mode) { struct ide_tape_obj *tape; - mutex_lock(&ide_tape_mutex); + lock_kernel(); tape = ide_tape_get(bdev->bd_disk, false, 0); - mutex_unlock(&ide_tape_mutex); + unlock_kernel(); if (!tape) return -ENXIO; @@ -1923,9 +1923,9 @@ static int idetape_release(struct gendisk *disk, fmode_t mode) { struct ide_tape_obj *tape = ide_drv_g(disk, ide_tape_obj); - mutex_lock(&ide_tape_mutex); + lock_kernel(); ide_tape_put(tape); - mutex_unlock(&ide_tape_mutex); + unlock_kernel(); return 0; } @@ -1937,11 +1937,11 @@ static int idetape_ioctl(struct block_device *bdev, fmode_t mode, ide_drive_t *drive = tape->drive; int err; - mutex_lock(&ide_tape_mutex); + lock_kernel(); err = generic_ide_ioctl(drive, bdev, cmd, arg); if (err == -EINVAL) err = idetape_blkdev_ioctl(drive, cmd, arg); - mutex_unlock(&ide_tape_mutex); + unlock_kernel(); return err; } diff --git a/trunk/drivers/idle/i7300_idle.c b/trunk/drivers/idle/i7300_idle.c index c976285d313e..15341fc1c68b 100644 --- a/trunk/drivers/idle/i7300_idle.c +++ b/trunk/drivers/idle/i7300_idle.c @@ -536,7 +536,6 @@ static ssize_t stats_read_ul(struct file *fp, char __user *ubuf, size_t count, static const struct file_operations idle_fops = { .open = stats_open_generic, .read = stats_read_ul, - .llseek = default_llseek, }; struct debugfs_file_info { diff --git a/trunk/drivers/infiniband/hw/ipath/ipath_diag.c b/trunk/drivers/infiniband/hw/ipath/ipath_diag.c index daef61d5e5bb..d4ce8b63e19e 100644 --- a/trunk/drivers/infiniband/hw/ipath/ipath_diag.c +++ b/trunk/drivers/infiniband/hw/ipath/ipath_diag.c @@ -65,8 +65,7 @@ static const struct file_operations diag_file_ops = { .write = ipath_diag_write, .read = ipath_diag_read, .open = ipath_diag_open, - .release = ipath_diag_release, - .llseek = default_llseek, + .release = ipath_diag_release }; static ssize_t ipath_diagpkt_write(struct file *fp, @@ -76,7 +75,6 @@ static ssize_t ipath_diagpkt_write(struct file *fp, static const struct file_operations diagpkt_file_ops = { .owner = THIS_MODULE, .write = ipath_diagpkt_write, - .llseek = noop_llseek, }; static atomic_t diagpkt_count = ATOMIC_INIT(0); diff --git a/trunk/drivers/infiniband/hw/ipath/ipath_file_ops.c b/trunk/drivers/infiniband/hw/ipath/ipath_file_ops.c index 6078992da3f0..65eb8929db22 100644 --- a/trunk/drivers/infiniband/hw/ipath/ipath_file_ops.c +++ b/trunk/drivers/infiniband/hw/ipath/ipath_file_ops.c @@ -63,8 +63,7 @@ static const struct file_operations ipath_file_ops = { .open = ipath_open, .release = ipath_close, .poll = ipath_poll, - .mmap = ipath_mmap, - .llseek = noop_llseek, + .mmap = ipath_mmap }; /* diff --git a/trunk/drivers/infiniband/hw/ipath/ipath_fs.c b/trunk/drivers/infiniband/hw/ipath/ipath_fs.c index d13e72685dcf..2fca70836dae 100644 --- a/trunk/drivers/infiniband/hw/ipath/ipath_fs.c +++ b/trunk/drivers/infiniband/hw/ipath/ipath_fs.c @@ -103,7 +103,6 @@ static ssize_t atomic_stats_read(struct file *file, char __user *buf, static const struct file_operations atomic_stats_ops = { .read = atomic_stats_read, - .llseek = default_llseek, }; static ssize_t atomic_counters_read(struct file *file, char __user *buf, @@ -121,7 +120,6 @@ static ssize_t atomic_counters_read(struct file *file, char __user *buf, static const struct file_operations atomic_counters_ops = { .read = atomic_counters_read, - .llseek = default_llseek, }; static ssize_t flash_read(struct file *file, char __user *buf, @@ -226,7 +224,6 @@ static ssize_t flash_write(struct file *file, const char __user *buf, static const struct file_operations flash_ops = { .read = flash_read, .write = flash_write, - .llseek = default_llseek, }; static int create_device_files(struct super_block *sb, diff --git a/trunk/drivers/infiniband/hw/qib/qib_diag.c b/trunk/drivers/infiniband/hw/qib/qib_diag.c index 204c4dd9dce0..05dcf0d9a7d3 100644 --- a/trunk/drivers/infiniband/hw/qib/qib_diag.c +++ b/trunk/drivers/infiniband/hw/qib/qib_diag.c @@ -136,8 +136,7 @@ static const struct file_operations diag_file_ops = { .write = qib_diag_write, .read = qib_diag_read, .open = qib_diag_open, - .release = qib_diag_release, - .llseek = default_llseek, + .release = qib_diag_release }; static atomic_t diagpkt_count = ATOMIC_INIT(0); @@ -150,7 +149,6 @@ static ssize_t qib_diagpkt_write(struct file *fp, const char __user *data, static const struct file_operations diagpkt_file_ops = { .owner = THIS_MODULE, .write = qib_diagpkt_write, - .llseek = noop_llseek, }; int qib_diag_add(struct qib_devdata *dd) diff --git a/trunk/drivers/infiniband/hw/qib/qib_file_ops.c b/trunk/drivers/infiniband/hw/qib/qib_file_ops.c index aa2be214270f..6b11645edf35 100644 --- a/trunk/drivers/infiniband/hw/qib/qib_file_ops.c +++ b/trunk/drivers/infiniband/hw/qib/qib_file_ops.c @@ -63,8 +63,7 @@ static const struct file_operations qib_file_ops = { .open = qib_open, .release = qib_close, .poll = qib_poll, - .mmap = qib_mmapf, - .llseek = noop_llseek, + .mmap = qib_mmapf }; /* diff --git a/trunk/drivers/infiniband/hw/qib/qib_fs.c b/trunk/drivers/infiniband/hw/qib/qib_fs.c index a0e6613e8be6..9f989c0ba9d3 100644 --- a/trunk/drivers/infiniband/hw/qib/qib_fs.c +++ b/trunk/drivers/infiniband/hw/qib/qib_fs.c @@ -367,7 +367,6 @@ static ssize_t flash_write(struct file *file, const char __user *buf, static const struct file_operations flash_ops = { .read = flash_read, .write = flash_write, - .llseek = default_llseek, }; static int add_cntr_files(struct super_block *sb, struct qib_devdata *dd) diff --git a/trunk/drivers/input/evdev.c b/trunk/drivers/input/evdev.c index 535fea4fe67f..af9ee313c10b 100644 --- a/trunk/drivers/input/evdev.c +++ b/trunk/drivers/input/evdev.c @@ -767,8 +767,7 @@ static const struct file_operations evdev_fops = { .compat_ioctl = evdev_ioctl_compat, #endif .fasync = evdev_fasync, - .flush = evdev_flush, - .llseek = no_llseek, + .flush = evdev_flush }; static int evdev_install_chrdev(struct evdev *evdev) diff --git a/trunk/drivers/input/input.c b/trunk/drivers/input/input.c index 7919c2537225..ab6982056518 100644 --- a/trunk/drivers/input/input.c +++ b/trunk/drivers/input/input.c @@ -2047,7 +2047,6 @@ static int input_open_file(struct inode *inode, struct file *file) static const struct file_operations input_fops = { .owner = THIS_MODULE, .open = input_open_file, - .llseek = noop_llseek, }; static int __init input_init(void) diff --git a/trunk/drivers/input/joydev.c b/trunk/drivers/input/joydev.c index 9d424cebfd2c..22239e988498 100644 --- a/trunk/drivers/input/joydev.c +++ b/trunk/drivers/input/joydev.c @@ -739,7 +739,6 @@ static const struct file_operations joydev_fops = { .compat_ioctl = joydev_compat_ioctl, #endif .fasync = joydev_fasync, - .llseek = no_llseek, }; static int joydev_install_chrdev(struct joydev *joydev) diff --git a/trunk/drivers/input/misc/hp_sdc_rtc.c b/trunk/drivers/input/misc/hp_sdc_rtc.c index 0b4f54265f62..7e2c12a5b839 100644 --- a/trunk/drivers/input/misc/hp_sdc_rtc.c +++ b/trunk/drivers/input/misc/hp_sdc_rtc.c @@ -43,7 +43,7 @@ #include #include #include -#include +#include #include MODULE_AUTHOR("Brian S. Julin "); @@ -52,7 +52,6 @@ MODULE_LICENSE("Dual BSD/GPL"); #define RTC_VERSION "1.10d" -static DEFINE_MUTEX(hp_sdc_rtc_mutex); static unsigned long epoch = 2000; static struct semaphore i8042tregs; @@ -666,9 +665,9 @@ static long hp_sdc_rtc_unlocked_ioctl(struct file *file, { int ret; - mutex_lock(&hp_sdc_rtc_mutex); + lock_kernel(); ret = hp_sdc_rtc_ioctl(file, cmd, arg); - mutex_unlock(&hp_sdc_rtc_mutex); + unlock_kernel(); return ret; } diff --git a/trunk/drivers/input/misc/uinput.c b/trunk/drivers/input/misc/uinput.c index b9410784e6a1..360698553eb5 100644 --- a/trunk/drivers/input/misc/uinput.c +++ b/trunk/drivers/input/misc/uinput.c @@ -811,7 +811,6 @@ static const struct file_operations uinput_fops = { #ifdef CONFIG_COMPAT .compat_ioctl = uinput_compat_ioctl, #endif - .llseek = no_llseek, }; static struct miscdevice uinput_misc = { diff --git a/trunk/drivers/input/mousedev.c b/trunk/drivers/input/mousedev.c index 31ec7265aac6..d528a2dba064 100644 --- a/trunk/drivers/input/mousedev.c +++ b/trunk/drivers/input/mousedev.c @@ -792,7 +792,6 @@ static const struct file_operations mousedev_fops = { .open = mousedev_open, .release = mousedev_release, .fasync = mousedev_fasync, - .llseek = noop_llseek, }; static int mousedev_install_chrdev(struct mousedev *mousedev) diff --git a/trunk/drivers/input/serio/serio_raw.c b/trunk/drivers/input/serio/serio_raw.c index cd82bb125915..998664854440 100644 --- a/trunk/drivers/input/serio/serio_raw.c +++ b/trunk/drivers/input/serio/serio_raw.c @@ -243,7 +243,6 @@ static const struct file_operations serio_raw_fops = { .write = serio_raw_write, .poll = serio_raw_poll, .fasync = serio_raw_fasync, - .llseek = noop_llseek, }; diff --git a/trunk/drivers/isdn/mISDN/timerdev.c b/trunk/drivers/isdn/mISDN/timerdev.c index 859c81e9483b..de43c8c70ad0 100644 --- a/trunk/drivers/isdn/mISDN/timerdev.c +++ b/trunk/drivers/isdn/mISDN/timerdev.c @@ -267,7 +267,6 @@ static const struct file_operations mISDN_fops = { .unlocked_ioctl = mISDN_ioctl, .open = mISDN_open, .release = mISDN_close, - .llseek = no_llseek, }; static struct miscdevice mISDNtimer = { diff --git a/trunk/drivers/lguest/lguest_user.c b/trunk/drivers/lguest/lguest_user.c index 3c781cdddda9..85b714df8eae 100644 --- a/trunk/drivers/lguest/lguest_user.c +++ b/trunk/drivers/lguest/lguest_user.c @@ -514,7 +514,6 @@ static const struct file_operations lguest_fops = { .release = close, .write = write, .read = read, - .llseek = default_llseek, }; /* diff --git a/trunk/drivers/macintosh/adb.c b/trunk/drivers/macintosh/adb.c index 75049e765191..bf64e49d996a 100644 --- a/trunk/drivers/macintosh/adb.c +++ b/trunk/drivers/macintosh/adb.c @@ -24,6 +24,7 @@ #include #include #include +#include #include #include #include @@ -54,7 +55,6 @@ extern struct adb_driver adb_iop_driver; extern struct adb_driver via_pmu_driver; extern struct adb_driver macio_adb_driver; -static DEFINE_MUTEX(adb_mutex); static struct adb_driver *adb_driver_list[] = { #ifdef CONFIG_ADB_MACII &via_macii_driver, @@ -647,7 +647,7 @@ static int adb_open(struct inode *inode, struct file *file) struct adbdev_state *state; int ret = 0; - mutex_lock(&adb_mutex); + lock_kernel(); if (iminor(inode) > 0 || adb_controller == NULL) { ret = -ENXIO; goto out; @@ -665,7 +665,7 @@ static int adb_open(struct inode *inode, struct file *file) state->inuse = 1; out: - mutex_unlock(&adb_mutex); + unlock_kernel(); return ret; } @@ -674,7 +674,7 @@ static int adb_release(struct inode *inode, struct file *file) struct adbdev_state *state = file->private_data; unsigned long flags; - mutex_lock(&adb_mutex); + lock_kernel(); if (state) { file->private_data = NULL; spin_lock_irqsave(&state->lock, flags); @@ -687,7 +687,7 @@ static int adb_release(struct inode *inode, struct file *file) spin_unlock_irqrestore(&state->lock, flags); } } - mutex_unlock(&adb_mutex); + unlock_kernel(); return 0; } diff --git a/trunk/drivers/macintosh/ans-lcd.c b/trunk/drivers/macintosh/ans-lcd.c index 1a57e88a38f7..a3d25da2f275 100644 --- a/trunk/drivers/macintosh/ans-lcd.c +++ b/trunk/drivers/macintosh/ans-lcd.c @@ -137,7 +137,6 @@ const struct file_operations anslcd_fops = { .write = anslcd_write, .unlocked_ioctl = anslcd_ioctl, .open = anslcd_open, - .llseek = default_llseek, }; static struct miscdevice anslcd_dev = { diff --git a/trunk/drivers/macintosh/smu.c b/trunk/drivers/macintosh/smu.c index 290cb325a94c..e58c3d33e035 100644 --- a/trunk/drivers/macintosh/smu.c +++ b/trunk/drivers/macintosh/smu.c @@ -19,6 +19,7 @@ * the userland interface */ +#include #include #include #include @@ -96,7 +97,6 @@ struct smu_device { * I don't think there will ever be more than one SMU, so * for now, just hard code that */ -static DEFINE_MUTEX(smu_mutex); static struct smu_device *smu; static DEFINE_MUTEX(smu_part_access); static int smu_irq_inited; @@ -1095,12 +1095,12 @@ static int smu_open(struct inode *inode, struct file *file) pp->mode = smu_file_commands; init_waitqueue_head(&pp->wait); - mutex_lock(&smu_mutex); + lock_kernel(); spin_lock_irqsave(&smu_clist_lock, flags); list_add(&pp->list, &smu_clist); spin_unlock_irqrestore(&smu_clist_lock, flags); file->private_data = pp; - mutex_unlock(&smu_mutex); + unlock_kernel(); return 0; } diff --git a/trunk/drivers/macintosh/via-pmu.c b/trunk/drivers/macintosh/via-pmu.c index cd29c8248386..2d17e76066bd 100644 --- a/trunk/drivers/macintosh/via-pmu.c +++ b/trunk/drivers/macintosh/via-pmu.c @@ -18,7 +18,7 @@ * */ #include -#include +#include #include #include #include @@ -73,7 +73,6 @@ /* How many iterations between battery polls */ #define BATTERY_POLLING_COUNT 2 -static DEFINE_MUTEX(pmu_info_proc_mutex); static volatile unsigned char __iomem *via; /* VIA registers - spaced 0x200 bytes apart */ @@ -2079,7 +2078,7 @@ pmu_open(struct inode *inode, struct file *file) pp->rb_get = pp->rb_put = 0; spin_lock_init(&pp->lock); init_waitqueue_head(&pp->wait); - mutex_lock(&pmu_info_proc_mutex); + lock_kernel(); spin_lock_irqsave(&all_pvt_lock, flags); #if defined(CONFIG_INPUT_ADBHID) && defined(CONFIG_PMAC_BACKLIGHT) pp->backlight_locker = 0; @@ -2087,7 +2086,7 @@ pmu_open(struct inode *inode, struct file *file) list_add(&pp->list, &all_pmu_pvt); spin_unlock_irqrestore(&all_pvt_lock, flags); file->private_data = pp; - mutex_unlock(&pmu_info_proc_mutex); + unlock_kernel(); return 0; } @@ -2344,9 +2343,9 @@ static long pmu_unlocked_ioctl(struct file *filp, { int ret; - mutex_lock(&pmu_info_proc_mutex); + lock_kernel(); ret = pmu_ioctl(filp, cmd, arg); - mutex_unlock(&pmu_info_proc_mutex); + unlock_kernel(); return ret; } @@ -2399,7 +2398,6 @@ static const struct file_operations pmu_device_fops = { #endif .open = pmu_open, .release = pmu_release, - .llseek = noop_llseek, }; static struct miscdevice pmu_device = { diff --git a/trunk/drivers/md/dm-ioctl.c b/trunk/drivers/md/dm-ioctl.c index 4b54618b4159..3e39193e5036 100644 --- a/trunk/drivers/md/dm-ioctl.c +++ b/trunk/drivers/md/dm-ioctl.c @@ -1596,7 +1596,6 @@ static const struct file_operations _ctl_fops = { .unlocked_ioctl = dm_ctl_ioctl, .compat_ioctl = dm_compat_ctl_ioctl, .owner = THIS_MODULE, - .llseek = noop_llseek, }; static struct miscdevice _dm_misc = { diff --git a/trunk/drivers/md/dm.c b/trunk/drivers/md/dm.c index 7967eca5a2d5..ac384b2a6a33 100644 --- a/trunk/drivers/md/dm.c +++ b/trunk/drivers/md/dm.c @@ -15,6 +15,7 @@ #include #include #include +#include #include #include #include @@ -32,7 +33,6 @@ #define DM_COOKIE_ENV_VAR_NAME "DM_COOKIE" #define DM_COOKIE_LENGTH 24 -static DEFINE_MUTEX(dm_mutex); static const char *_name = DM_NAME; static unsigned int major = 0; @@ -344,7 +344,7 @@ static int dm_blk_open(struct block_device *bdev, fmode_t mode) { struct mapped_device *md; - mutex_lock(&dm_mutex); + lock_kernel(); spin_lock(&_minor_lock); md = bdev->bd_disk->private_data; @@ -362,7 +362,7 @@ static int dm_blk_open(struct block_device *bdev, fmode_t mode) out: spin_unlock(&_minor_lock); - mutex_unlock(&dm_mutex); + unlock_kernel(); return md ? 0 : -ENXIO; } @@ -371,10 +371,10 @@ static int dm_blk_close(struct gendisk *disk, fmode_t mode) { struct mapped_device *md = disk->private_data; - mutex_lock(&dm_mutex); + lock_kernel(); atomic_dec(&md->open_count); dm_put(md); - mutex_unlock(&dm_mutex); + unlock_kernel(); return 0; } diff --git a/trunk/drivers/md/md.c b/trunk/drivers/md/md.c index dbf822df942a..f20d13e717d5 100644 --- a/trunk/drivers/md/md.c +++ b/trunk/drivers/md/md.c @@ -36,7 +36,7 @@ #include #include #include -#include +#include #include /* for invalidate_bdev */ #include #include @@ -57,7 +57,6 @@ #define DEBUG 0 #define dprintk(x...) ((void)(DEBUG && printk(x))) -static DEFINE_MUTEX(md_mutex); #ifndef MODULE static void autostart_arrays(int part); @@ -5952,7 +5951,7 @@ static int md_open(struct block_device *bdev, fmode_t mode) mddev_t *mddev = mddev_find(bdev->bd_dev); int err; - mutex_lock(&md_mutex); + lock_kernel(); if (mddev->gendisk != bdev->bd_disk) { /* we are racing with mddev_put which is discarding this * bd_disk. @@ -5961,7 +5960,7 @@ static int md_open(struct block_device *bdev, fmode_t mode) /* Wait until bdev->bd_disk is definitely gone */ flush_scheduled_work(); /* Then retry the open from the top */ - mutex_unlock(&md_mutex); + unlock_kernel(); return -ERESTARTSYS; } BUG_ON(mddev != bdev->bd_disk->private_data); @@ -5975,7 +5974,7 @@ static int md_open(struct block_device *bdev, fmode_t mode) check_disk_size_change(mddev->gendisk, bdev); out: - mutex_unlock(&md_mutex); + unlock_kernel(); return err; } @@ -5984,10 +5983,10 @@ static int md_release(struct gendisk *disk, fmode_t mode) mddev_t *mddev = disk->private_data; BUG_ON(!mddev); - mutex_lock(&md_mutex); + lock_kernel(); atomic_dec(&mddev->openers); mddev_put(mddev); - mutex_unlock(&md_mutex); + unlock_kernel(); return 0; } diff --git a/trunk/drivers/media/IR/imon.c b/trunk/drivers/media/IR/imon.c index faed5a332c71..c185422ef28c 100644 --- a/trunk/drivers/media/IR/imon.c +++ b/trunk/drivers/media/IR/imon.c @@ -151,8 +151,7 @@ static const struct file_operations vfd_fops = { .owner = THIS_MODULE, .open = &display_open, .write = &vfd_write, - .release = &display_close, - .llseek = noop_llseek, + .release = &display_close }; /* lcd character device file operations */ @@ -160,8 +159,7 @@ static const struct file_operations lcd_fops = { .owner = THIS_MODULE, .open = &display_open, .write = &lcd_write, - .release = &display_close, - .llseek = noop_llseek, + .release = &display_close }; enum { diff --git a/trunk/drivers/media/IR/ir-lirc-codec.c b/trunk/drivers/media/IR/ir-lirc-codec.c index 1983cd3f3994..e63f757d5d72 100644 --- a/trunk/drivers/media/IR/ir-lirc-codec.c +++ b/trunk/drivers/media/IR/ir-lirc-codec.c @@ -235,7 +235,6 @@ static struct file_operations lirc_fops = { .poll = lirc_dev_fop_poll, .open = lirc_dev_fop_open, .release = lirc_dev_fop_close, - .llseek = no_llseek, }; static int ir_lirc_register(struct input_dev *input_dev) diff --git a/trunk/drivers/media/IR/lirc_dev.c b/trunk/drivers/media/IR/lirc_dev.c index 0acf6396e068..899891bec352 100644 --- a/trunk/drivers/media/IR/lirc_dev.c +++ b/trunk/drivers/media/IR/lirc_dev.c @@ -163,7 +163,6 @@ static struct file_operations fops = { .unlocked_ioctl = lirc_dev_fop_ioctl, .open = lirc_dev_fop_open, .release = lirc_dev_fop_close, - .llseek = noop_llseek, }; static int lirc_cdev_add(struct irctl *ir) @@ -461,8 +460,6 @@ int lirc_dev_fop_open(struct inode *inode, struct file *file) mutex_unlock(&lirc_dev_lock); - nonseekable_open(inode, file); - return retval; } EXPORT_SYMBOL(lirc_dev_fop_open); diff --git a/trunk/drivers/media/Kconfig b/trunk/drivers/media/Kconfig index bad2cedb8d96..a28541b2b1a2 100644 --- a/trunk/drivers/media/Kconfig +++ b/trunk/drivers/media/Kconfig @@ -19,7 +19,6 @@ 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. diff --git a/trunk/drivers/media/dvb/bt8xx/dst_ca.c b/trunk/drivers/media/dvb/bt8xx/dst_ca.c index 48e48e8af55a..cf8705162845 100644 --- a/trunk/drivers/media/dvb/bt8xx/dst_ca.c +++ b/trunk/drivers/media/dvb/bt8xx/dst_ca.c @@ -22,7 +22,7 @@ #include #include #include -#include +#include #include #include #include "dvbdev.h" @@ -52,7 +52,6 @@ } 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)"); @@ -565,7 +564,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; - mutex_lock(&dst_ca_mutex); + lock_kernel(); dvbdev = file->private_data; state = (struct dst_state *)dvbdev->priv; p_ca_message = kmalloc(sizeof (struct ca_msg), GFP_KERNEL); @@ -653,7 +652,7 @@ static long dst_ca_ioctl(struct file *file, unsigned int cmd, unsigned long ioct kfree (p_ca_slot_info); kfree (p_ca_caps); - mutex_unlock(&dst_ca_mutex); + unlock_kernel(); return result; } @@ -695,8 +694,7 @@ static const struct file_operations dst_ca_fops = { .open = dst_ca_open, .release = dst_ca_release, .read = dst_ca_read, - .write = dst_ca_write, - .llseek = noop_llseek, + .write = dst_ca_write }; static struct dvb_device dvbdev_ca = { diff --git a/trunk/drivers/media/dvb/dvb-core/dmxdev.c b/trunk/drivers/media/dvb/dvb-core/dmxdev.c index ad1f61d301e1..0042306ea11b 100644 --- a/trunk/drivers/media/dvb/dvb-core/dmxdev.c +++ b/trunk/drivers/media/dvb/dvb-core/dmxdev.c @@ -25,6 +25,7 @@ #include #include #include +#include #include #include #include @@ -1087,7 +1088,13 @@ static int dvb_demux_do_ioctl(struct file *file, static long dvb_demux_ioctl(struct file *file, unsigned int cmd, unsigned long arg) { - return dvb_usercopy(file, cmd, arg, dvb_demux_do_ioctl); + int ret; + + lock_kernel(); + ret = dvb_usercopy(file, cmd, arg, dvb_demux_do_ioctl); + unlock_kernel(); + + return ret; } static unsigned int dvb_demux_poll(struct file *file, poll_table *wait) @@ -1143,7 +1150,6 @@ static const struct file_operations dvb_demux_fops = { .open = dvb_demux_open, .release = dvb_demux_release, .poll = dvb_demux_poll, - .llseek = default_llseek, }; static struct dvb_device dvbdev_demux = { @@ -1180,7 +1186,13 @@ static int dvb_dvr_do_ioctl(struct file *file, static long dvb_dvr_ioctl(struct file *file, unsigned int cmd, unsigned long arg) { - return dvb_usercopy(file, cmd, arg, dvb_dvr_do_ioctl); + int ret; + + lock_kernel(); + ret = dvb_usercopy(file, cmd, arg, dvb_dvr_do_ioctl); + unlock_kernel(); + + return ret; } static unsigned int dvb_dvr_poll(struct file *file, poll_table *wait) @@ -1213,7 +1225,6 @@ static const struct file_operations dvb_dvr_fops = { .open = dvb_dvr_open, .release = dvb_dvr_release, .poll = dvb_dvr_poll, - .llseek = default_llseek, }; static struct dvb_device dvbdev_dvr = { diff --git a/trunk/drivers/media/dvb/dvb-core/dvb_ca_en50221.c b/trunk/drivers/media/dvb/dvb-core/dvb_ca_en50221.c index 4d0646da6087..cb97e6b85432 100644 --- a/trunk/drivers/media/dvb/dvb-core/dvb_ca_en50221.c +++ b/trunk/drivers/media/dvb/dvb-core/dvb_ca_en50221.c @@ -1259,7 +1259,13 @@ 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) { - return dvb_usercopy(file, cmd, arg, dvb_ca_en50221_io_do_ioctl); + int ret; + + lock_kernel(); + ret = dvb_usercopy(file, cmd, arg, dvb_ca_en50221_io_do_ioctl); + unlock_kernel(); + + return ret; } @@ -1622,7 +1628,6 @@ static const struct file_operations dvb_ca_fops = { .open = dvb_ca_en50221_io_open, .release = dvb_ca_en50221_io_release, .poll = dvb_ca_en50221_io_poll, - .llseek = noop_llseek, }; static struct dvb_device dvbdev_ca = { diff --git a/trunk/drivers/media/dvb/dvb-core/dvb_frontend.c b/trunk/drivers/media/dvb/dvb-core/dvb_frontend.c index 970c9b8882d4..4d45b7d6b3fb 100644 --- a/trunk/drivers/media/dvb/dvb-core/dvb_frontend.c +++ b/trunk/drivers/media/dvb/dvb-core/dvb_frontend.c @@ -2034,8 +2034,7 @@ static const struct file_operations dvb_frontend_fops = { .unlocked_ioctl = dvb_generic_ioctl, .poll = dvb_frontend_poll, .open = dvb_frontend_open, - .release = dvb_frontend_release, - .llseek = noop_llseek, + .release = dvb_frontend_release }; int dvb_register_frontend(struct dvb_adapter* dvb, diff --git a/trunk/drivers/media/dvb/dvb-core/dvb_net.c b/trunk/drivers/media/dvb/dvb-core/dvb_net.c index 4df42aaae7f7..6c3a8a06ccab 100644 --- a/trunk/drivers/media/dvb/dvb-core/dvb_net.c +++ b/trunk/drivers/media/dvb/dvb-core/dvb_net.c @@ -59,6 +59,7 @@ #include #include #include +#include #include #include #include @@ -1444,7 +1445,13 @@ static int dvb_net_do_ioctl(struct file *file, static long dvb_net_ioctl(struct file *file, unsigned int cmd, unsigned long arg) { - return dvb_usercopy(file, cmd, arg, dvb_net_do_ioctl); + int ret; + + lock_kernel(); + ret = dvb_usercopy(file, cmd, arg, dvb_net_do_ioctl); + unlock_kernel(); + + return ret; } static int dvb_net_close(struct inode *inode, struct file *file) @@ -1468,7 +1475,6 @@ static const struct file_operations dvb_net_fops = { .unlocked_ioctl = dvb_net_ioctl, .open = dvb_generic_open, .release = dvb_net_close, - .llseek = noop_llseek, }; static struct dvb_device dvbdev_net = { diff --git a/trunk/drivers/media/dvb/dvb-core/dvbdev.c b/trunk/drivers/media/dvb/dvb-core/dvbdev.c index f73287775953..b915c39d782f 100644 --- a/trunk/drivers/media/dvb/dvb-core/dvbdev.c +++ b/trunk/drivers/media/dvb/dvb-core/dvbdev.c @@ -32,9 +32,9 @@ #include #include #include +#include #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; - mutex_lock(&dvbdev_mutex); + lock_kernel(); 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); - mutex_unlock(&dvbdev_mutex); + unlock_kernel(); return err; } fail: up_read(&minor_rwsem); - mutex_unlock(&dvbdev_mutex); + unlock_kernel(); return -ENODEV; } @@ -105,7 +105,6 @@ static const struct file_operations dvb_device_fops = { .owner = THIS_MODULE, .open = dvb_device_open, - .llseek = noop_llseek, }; static struct cdev dvb_device_cdev; @@ -159,6 +158,7 @@ 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,7 +166,11 @@ long dvb_generic_ioctl(struct file *file, if (!dvbdev->kernel_ioctl) return -EINVAL; - return dvb_usercopy(file, cmd, arg, dvbdev->kernel_ioctl); + lock_kernel(); + ret = dvb_usercopy(file, cmd, arg, dvbdev->kernel_ioctl); + unlock_kernel(); + + return ret; } EXPORT_SYMBOL(dvb_generic_ioctl); @@ -417,10 +421,8 @@ 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; diff --git a/trunk/drivers/media/dvb/firewire/firedtv-ci.c b/trunk/drivers/media/dvb/firewire/firedtv-ci.c index 8ffb565f0704..d3c2cf60de76 100644 --- a/trunk/drivers/media/dvb/firewire/firedtv-ci.c +++ b/trunk/drivers/media/dvb/firewire/firedtv-ci.c @@ -220,7 +220,6 @@ static const struct file_operations fdtv_ca_fops = { .open = dvb_generic_open, .release = dvb_generic_release, .poll = fdtv_ca_io_poll, - .llseek = noop_llseek, }; static struct dvb_device fdtv_ca = { diff --git a/trunk/drivers/media/dvb/ttpci/av7110.c b/trunk/drivers/media/dvb/ttpci/av7110.c index 893fbc57c72f..a6be529eec5c 100644 --- a/trunk/drivers/media/dvb/ttpci/av7110.c +++ b/trunk/drivers/media/dvb/ttpci/av7110.c @@ -730,7 +730,6 @@ static const struct file_operations dvb_osd_fops = { .unlocked_ioctl = dvb_generic_ioctl, .open = dvb_generic_open, .release = dvb_generic_release, - .llseek = noop_llseek, }; static struct dvb_device dvbdev_osd = { diff --git a/trunk/drivers/media/dvb/ttpci/av7110_av.c b/trunk/drivers/media/dvb/ttpci/av7110_av.c index 6ef3996565ad..13efba942dac 100644 --- a/trunk/drivers/media/dvb/ttpci/av7110_av.c +++ b/trunk/drivers/media/dvb/ttpci/av7110_av.c @@ -1521,7 +1521,6 @@ static const struct file_operations dvb_video_fops = { .open = dvb_video_open, .release = dvb_video_release, .poll = dvb_video_poll, - .llseek = noop_llseek, }; static struct dvb_device dvbdev_video = { @@ -1540,7 +1539,6 @@ static const struct file_operations dvb_audio_fops = { .open = dvb_audio_open, .release = dvb_audio_release, .poll = dvb_audio_poll, - .llseek = noop_llseek, }; static struct dvb_device dvbdev_audio = { diff --git a/trunk/drivers/media/dvb/ttpci/av7110_ca.c b/trunk/drivers/media/dvb/ttpci/av7110_ca.c index 43f61f2eca98..4eba35a018e3 100644 --- a/trunk/drivers/media/dvb/ttpci/av7110_ca.c +++ b/trunk/drivers/media/dvb/ttpci/av7110_ca.c @@ -353,7 +353,6 @@ static const struct file_operations dvb_ca_fops = { .open = dvb_ca_open, .release = dvb_generic_release, .poll = dvb_ca_poll, - .llseek = default_llseek, }; static struct dvb_device dvbdev_ca = { diff --git a/trunk/drivers/media/dvb/ttpci/av7110_ir.c b/trunk/drivers/media/dvb/ttpci/av7110_ir.c index 908f272fe26c..b070e88d8c6b 100644 --- a/trunk/drivers/media/dvb/ttpci/av7110_ir.c +++ b/trunk/drivers/media/dvb/ttpci/av7110_ir.c @@ -312,7 +312,6 @@ static ssize_t av7110_ir_proc_write(struct file *file, const char __user *buffer static const struct file_operations av7110_ir_proc_fops = { .owner = THIS_MODULE, .write = av7110_ir_proc_write, - .llseek = noop_llseek, }; /* interrupt handler */ diff --git a/trunk/drivers/media/video/dabusb.c b/trunk/drivers/media/video/dabusb.c index f3e25e91366d..5b176bd7afdb 100644 --- a/trunk/drivers/media/video/dabusb.c +++ b/trunk/drivers/media/video/dabusb.c @@ -32,6 +32,7 @@ #include #include #include +#include #include #include #include @@ -620,6 +621,7 @@ 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"); @@ -628,17 +630,21 @@ 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)) + if (signal_pending (current)) { + unlock_kernel(); 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; @@ -648,6 +654,7 @@ static int dabusb_open (struct inode *inode, struct file *file) file->private_data = s; r = nonseekable_open(inode, file); + unlock_kernel(); return r; } @@ -682,13 +689,17 @@ static long dabusb_ioctl (struct file *file, unsigned int cmd, unsigned long arg dbg("dabusb_ioctl"); - if (s->remove_pending) + lock_kernel(); + if (s->remove_pending) { + unlock_kernel(); return -EIO; + } mutex_lock(&s->mutex); if (!s->usbdev) { mutex_unlock(&s->mutex); + unlock_kernel(); return -EIO; } @@ -724,6 +735,7 @@ static long dabusb_ioctl (struct file *file, unsigned int cmd, unsigned long arg break; } mutex_unlock(&s->mutex); + unlock_kernel(); return ret; } diff --git a/trunk/drivers/memstick/core/mspro_block.c b/trunk/drivers/memstick/core/mspro_block.c index 02362eccc588..d3f1a087eced 100644 --- a/trunk/drivers/memstick/core/mspro_block.c +++ b/trunk/drivers/memstick/core/mspro_block.c @@ -18,12 +18,11 @@ #include #include #include -#include +#include #include #define DRIVER_NAME "mspro_block" -static DEFINE_MUTEX(mspro_block_mutex); static int major; module_param(major, int, 0644); @@ -181,7 +180,7 @@ static int mspro_block_bd_open(struct block_device *bdev, fmode_t mode) struct mspro_block_data *msb = disk->private_data; int rc = -ENXIO; - mutex_lock(&mspro_block_mutex); + lock_kernel(); mutex_lock(&mspro_block_disk_lock); if (msb && msb->card) { @@ -193,7 +192,7 @@ static int mspro_block_bd_open(struct block_device *bdev, fmode_t mode) } mutex_unlock(&mspro_block_disk_lock); - mutex_unlock(&mspro_block_mutex); + unlock_kernel(); return rc; } @@ -226,9 +225,9 @@ static int mspro_block_disk_release(struct gendisk *disk) static int mspro_block_bd_release(struct gendisk *disk, fmode_t mode) { int ret; - mutex_lock(&mspro_block_mutex); + lock_kernel(); ret = mspro_block_disk_release(disk); - mutex_unlock(&mspro_block_mutex); + unlock_kernel(); return ret; } diff --git a/trunk/drivers/message/fusion/mptctl.c b/trunk/drivers/message/fusion/mptctl.c index a3856ed90aef..d8ddfdf8be14 100644 --- a/trunk/drivers/message/fusion/mptctl.c +++ b/trunk/drivers/message/fusion/mptctl.c @@ -54,7 +54,7 @@ #include #include /* for mdelay */ #include -#include +#include #include #include @@ -83,7 +83,6 @@ MODULE_VERSION(my_VERSION); /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ -static DEFINE_MUTEX(mpctl_mutex); static u8 mptctl_id = MPT_MAX_PROTOCOL_DRIVERS; static u8 mptctl_taskmgmt_id = MPT_MAX_PROTOCOL_DRIVERS; @@ -602,12 +601,12 @@ mptctl_fasync(int fd, struct file *filep, int mode) MPT_ADAPTER *ioc; int ret; - mutex_lock(&mpctl_mutex); + lock_kernel(); list_for_each_entry(ioc, &ioc_list, list) ioc->aen_event_read_flag=0; ret = fasync_helper(fd, filep, mode, &async_queue); - mutex_unlock(&mpctl_mutex); + unlock_kernel(); return ret; } @@ -699,9 +698,9 @@ static long mptctl_ioctl(struct file *file, unsigned int cmd, unsigned long arg) { long ret; - mutex_lock(&mpctl_mutex); + lock_kernel(); ret = __mptctl_ioctl(file, cmd, arg); - mutex_unlock(&mpctl_mutex); + unlock_kernel(); return ret; } @@ -2927,7 +2926,7 @@ compat_mpt_command(struct file *filp, unsigned int cmd, static long compat_mpctl_ioctl(struct file *f, unsigned int cmd, unsigned long arg) { long ret; - mutex_lock(&mpctl_mutex); + lock_kernel(); switch (cmd) { case MPTIOCINFO: case MPTIOCINFO1: @@ -2952,7 +2951,7 @@ static long compat_mpctl_ioctl(struct file *f, unsigned int cmd, unsigned long a ret = -ENOIOCTLCMD; break; } - mutex_unlock(&mpctl_mutex); + unlock_kernel(); return ret; } diff --git a/trunk/drivers/message/i2o/i2o_block.c b/trunk/drivers/message/i2o/i2o_block.c index f87a9d405a5e..f0f1e667000f 100644 --- a/trunk/drivers/message/i2o/i2o_block.c +++ b/trunk/drivers/message/i2o/i2o_block.c @@ -53,7 +53,7 @@ #include #include #include -#include +#include #include @@ -69,7 +69,6 @@ #define OSM_VERSION "1.325" #define OSM_DESCRIPTION "I2O Block Device OSM" -static DEFINE_MUTEX(i2o_block_mutex); static struct i2o_driver i2o_block_driver; /* global Block OSM request mempool */ @@ -579,7 +578,7 @@ static int i2o_block_open(struct block_device *bdev, fmode_t mode) if (!dev->i2o_dev) return -ENODEV; - mutex_lock(&i2o_block_mutex); + lock_kernel(); if (dev->power > 0x1f) i2o_block_device_power(dev, 0x02); @@ -588,7 +587,7 @@ static int i2o_block_open(struct block_device *bdev, fmode_t mode) i2o_block_device_lock(dev->i2o_dev, -1); osm_debug("Ready.\n"); - mutex_unlock(&i2o_block_mutex); + unlock_kernel(); return 0; }; @@ -619,7 +618,7 @@ static int i2o_block_release(struct gendisk *disk, fmode_t mode) if (!dev->i2o_dev) return 0; - mutex_lock(&i2o_block_mutex); + lock_kernel(); i2o_block_device_flush(dev->i2o_dev); i2o_block_device_unlock(dev->i2o_dev, -1); @@ -630,7 +629,7 @@ static int i2o_block_release(struct gendisk *disk, fmode_t mode) operation = 0x24; i2o_block_device_power(dev, operation); - mutex_unlock(&i2o_block_mutex); + unlock_kernel(); return 0; } @@ -665,7 +664,7 @@ static int i2o_block_ioctl(struct block_device *bdev, fmode_t mode, if (!capable(CAP_SYS_ADMIN)) return -EPERM; - mutex_lock(&i2o_block_mutex); + lock_kernel(); switch (cmd) { case BLKI2OGRSTRAT: ret = put_user(dev->rcache, (int __user *)arg); @@ -689,7 +688,7 @@ static int i2o_block_ioctl(struct block_device *bdev, fmode_t mode, ret = 0; break; } - mutex_unlock(&i2o_block_mutex); + unlock_kernel(); return ret; }; diff --git a/trunk/drivers/message/i2o/i2o_config.c b/trunk/drivers/message/i2o/i2o_config.c index 7d3cc575c361..068ba0785bb4 100644 --- a/trunk/drivers/message/i2o/i2o_config.c +++ b/trunk/drivers/message/i2o/i2o_config.c @@ -31,7 +31,7 @@ */ #include -#include +#include #include #include @@ -41,7 +41,6 @@ #define SG_TABLESIZE 30 -static DEFINE_MUTEX(i2o_cfg_mutex); static long i2o_cfg_ioctl(struct file *, unsigned int, unsigned long); static spinlock_t i2o_config_lock; @@ -742,7 +741,7 @@ static long i2o_cfg_compat_ioctl(struct file *file, unsigned cmd, unsigned long arg) { int ret; - mutex_lock(&i2o_cfg_mutex); + lock_kernel(); switch (cmd) { case I2OGETIOPS: ret = i2o_cfg_ioctl(file, cmd, arg); @@ -754,7 +753,7 @@ static long i2o_cfg_compat_ioctl(struct file *file, unsigned cmd, ret = -ENOIOCTLCMD; break; } - mutex_unlock(&i2o_cfg_mutex); + unlock_kernel(); return ret; } @@ -982,7 +981,7 @@ static long i2o_cfg_ioctl(struct file *fp, unsigned int cmd, unsigned long arg) { int ret; - mutex_lock(&i2o_cfg_mutex); + lock_kernel(); switch (cmd) { case I2OGETIOPS: ret = i2o_cfg_getiops(arg); @@ -1038,7 +1037,7 @@ static long i2o_cfg_ioctl(struct file *fp, unsigned int cmd, unsigned long arg) osm_debug("unknown ioctl called!\n"); ret = -EINVAL; } - mutex_unlock(&i2o_cfg_mutex); + unlock_kernel(); return ret; } @@ -1052,7 +1051,7 @@ static int cfg_open(struct inode *inode, struct file *file) if (!tmp) return -ENOMEM; - mutex_lock(&i2o_cfg_mutex); + lock_kernel(); file->private_data = (void *)(i2o_cfg_info_id++); tmp->fp = file; tmp->fasync = NULL; @@ -1066,7 +1065,7 @@ static int cfg_open(struct inode *inode, struct file *file) spin_lock_irqsave(&i2o_config_lock, flags); open_files = tmp; spin_unlock_irqrestore(&i2o_config_lock, flags); - mutex_unlock(&i2o_cfg_mutex); + unlock_kernel(); return 0; } @@ -1077,14 +1076,14 @@ static int cfg_fasync(int fd, struct file *fp, int on) struct i2o_cfg_info *p; int ret = -EBADF; - mutex_lock(&i2o_cfg_mutex); + lock_kernel(); for (p = open_files; p; p = p->next) if (p->q_id == id) break; if (p) ret = fasync_helper(fd, fp, on, &p->fasync); - mutex_unlock(&i2o_cfg_mutex); + unlock_kernel(); return ret; } @@ -1094,7 +1093,7 @@ static int cfg_release(struct inode *inode, struct file *file) struct i2o_cfg_info *p, **q; unsigned long flags; - mutex_lock(&i2o_cfg_mutex); + lock_kernel(); spin_lock_irqsave(&i2o_config_lock, flags); for (q = &open_files; (p = *q) != NULL; q = &p->next) { if (p->q_id == id) { @@ -1104,7 +1103,7 @@ static int cfg_release(struct inode *inode, struct file *file) } } spin_unlock_irqrestore(&i2o_config_lock, flags); - mutex_unlock(&i2o_cfg_mutex); + unlock_kernel(); return 0; } diff --git a/trunk/drivers/mfd/ab3100-core.c b/trunk/drivers/mfd/ab3100-core.c index b048ecc56db9..66379b413906 100644 --- a/trunk/drivers/mfd/ab3100-core.c +++ b/trunk/drivers/mfd/ab3100-core.c @@ -583,7 +583,6 @@ static ssize_t ab3100_get_set_reg(struct file *file, static const struct file_operations ab3100_get_set_reg_fops = { .open = ab3100_get_set_reg_open_file, .write = ab3100_get_set_reg, - .llseek = noop_llseek, }; static struct dentry *ab3100_dir; diff --git a/trunk/drivers/misc/hpilo.c b/trunk/drivers/misc/hpilo.c index 69c1f2fca141..557a8c2a7336 100644 --- a/trunk/drivers/misc/hpilo.c +++ b/trunk/drivers/misc/hpilo.c @@ -640,7 +640,6 @@ static const struct file_operations ilo_fops = { .poll = ilo_poll, .open = ilo_open, .release = ilo_close, - .llseek = noop_llseek, }; static irqreturn_t ilo_isr(int irq, void *data) diff --git a/trunk/drivers/misc/ibmasm/ibmasmfs.c b/trunk/drivers/misc/ibmasm/ibmasmfs.c index af2497ae5fe3..8844a3f45381 100644 --- a/trunk/drivers/misc/ibmasm/ibmasmfs.c +++ b/trunk/drivers/misc/ibmasm/ibmasmfs.c @@ -584,7 +584,6 @@ static const struct file_operations command_fops = { .release = command_file_close, .read = command_file_read, .write = command_file_write, - .llseek = generic_file_llseek, }; static const struct file_operations event_fops = { @@ -592,7 +591,6 @@ static const struct file_operations event_fops = { .release = event_file_close, .read = event_file_read, .write = event_file_write, - .llseek = generic_file_llseek, }; static const struct file_operations r_heartbeat_fops = { @@ -600,7 +598,6 @@ static const struct file_operations r_heartbeat_fops = { .release = r_heartbeat_file_close, .read = r_heartbeat_file_read, .write = r_heartbeat_file_write, - .llseek = generic_file_llseek, }; static const struct file_operations remote_settings_fops = { @@ -608,7 +605,6 @@ static const struct file_operations remote_settings_fops = { .release = remote_settings_file_close, .read = remote_settings_file_read, .write = remote_settings_file_write, - .llseek = generic_file_llseek, }; diff --git a/trunk/drivers/misc/iwmc3200top/debugfs.c b/trunk/drivers/misc/iwmc3200top/debugfs.c index 62fbaec48207..e9eda471f6e0 100644 --- a/trunk/drivers/misc/iwmc3200top/debugfs.c +++ b/trunk/drivers/misc/iwmc3200top/debugfs.c @@ -71,7 +71,6 @@ ssize_t iwmct_dbgfs_##name##_write(struct file *file, \ static const struct file_operations iwmct_dbgfs_##name##_ops = { \ .read = iwmct_dbgfs_##name##_read, \ .open = iwmct_dbgfs_open_file_generic, \ - .llseek = generic_file_llseek, \ }; #define DEBUGFS_WRITE_FILE_OPS(name) \ @@ -79,7 +78,6 @@ ssize_t iwmct_dbgfs_##name##_write(struct file *file, \ static const struct file_operations iwmct_dbgfs_##name##_ops = { \ .write = iwmct_dbgfs_##name##_write, \ .open = iwmct_dbgfs_open_file_generic, \ - .llseek = generic_file_llseek, \ }; #define DEBUGFS_READ_WRITE_FILE_OPS(name) \ @@ -89,7 +87,6 @@ ssize_t iwmct_dbgfs_##name##_write(struct file *file, \ .write = iwmct_dbgfs_##name##_write, \ .read = iwmct_dbgfs_##name##_read, \ .open = iwmct_dbgfs_open_file_generic, \ - .llseek = generic_file_llseek, \ }; diff --git a/trunk/drivers/misc/lkdtm.c b/trunk/drivers/misc/lkdtm.c index 343b5d8ea697..ef34de7a8026 100644 --- a/trunk/drivers/misc/lkdtm.c +++ b/trunk/drivers/misc/lkdtm.c @@ -575,39 +575,30 @@ struct crash_entry { static const struct crash_entry crash_entries[] = { {"DIRECT", {.read = lkdtm_debugfs_read, - .llseek = generic_file_llseek, .open = lkdtm_debugfs_open, .write = direct_entry} }, {"INT_HARDWARE_ENTRY", {.read = lkdtm_debugfs_read, - .llseek = generic_file_llseek, .open = lkdtm_debugfs_open, .write = int_hardware_entry} }, {"INT_HW_IRQ_EN", {.read = lkdtm_debugfs_read, - .llseek = generic_file_llseek, .open = lkdtm_debugfs_open, .write = int_hw_irq_en} }, {"INT_TASKLET_ENTRY", {.read = lkdtm_debugfs_read, - .llseek = generic_file_llseek, .open = lkdtm_debugfs_open, .write = int_tasklet_entry} }, {"FS_DEVRW", {.read = lkdtm_debugfs_read, - .llseek = generic_file_llseek, .open = lkdtm_debugfs_open, .write = fs_devrw_entry} }, {"MEM_SWAPOUT", {.read = lkdtm_debugfs_read, - .llseek = generic_file_llseek, .open = lkdtm_debugfs_open, .write = mem_swapout_entry} }, {"TIMERADD", {.read = lkdtm_debugfs_read, - .llseek = generic_file_llseek, .open = lkdtm_debugfs_open, .write = timeradd_entry} }, {"SCSI_DISPATCH_CMD", {.read = lkdtm_debugfs_read, - .llseek = generic_file_llseek, .open = lkdtm_debugfs_open, .write = scsi_dispatch_cmd_entry} }, {"IDE_CORE_CP", {.read = lkdtm_debugfs_read, - .llseek = generic_file_llseek, .open = lkdtm_debugfs_open, .write = ide_core_cp_entry} }, }; diff --git a/trunk/drivers/misc/phantom.c b/trunk/drivers/misc/phantom.c index 4197a3cb26ba..75ee0d3f6f45 100644 --- a/trunk/drivers/misc/phantom.c +++ b/trunk/drivers/misc/phantom.c @@ -24,7 +24,7 @@ #include #include #include -#include +#include #include #include @@ -38,7 +38,6 @@ #define PHB_RUNNING 1 #define PHB_NOT_OH 2 -static DEFINE_MUTEX(phantom_mutex); static struct class *phantom_class; static int phantom_major; @@ -216,17 +215,17 @@ static int phantom_open(struct inode *inode, struct file *file) struct phantom_device *dev = container_of(inode->i_cdev, struct phantom_device, cdev); - mutex_lock(&phantom_mutex); + lock_kernel(); nonseekable_open(inode, file); if (mutex_lock_interruptible(&dev->open_lock)) { - mutex_unlock(&phantom_mutex); + unlock_kernel(); return -ERESTARTSYS; } if (dev->opened) { mutex_unlock(&dev->open_lock); - mutex_unlock(&phantom_mutex); + unlock_kernel(); return -EINVAL; } @@ -237,7 +236,7 @@ static int phantom_open(struct inode *inode, struct file *file) atomic_set(&dev->counter, 0); dev->opened++; mutex_unlock(&dev->open_lock); - mutex_unlock(&phantom_mutex); + unlock_kernel(); return 0; } @@ -280,7 +279,6 @@ static const struct file_operations phantom_file_ops = { .unlocked_ioctl = phantom_ioctl, .compat_ioctl = phantom_compat_ioctl, .poll = phantom_poll, - .llseek = no_llseek, }; static irqreturn_t phantom_isr(int irq, void *data) diff --git a/trunk/drivers/misc/sgi-gru/grufile.c b/trunk/drivers/misc/sgi-gru/grufile.c index 28852dfa310d..cb3b4d228475 100644 --- a/trunk/drivers/misc/sgi-gru/grufile.c +++ b/trunk/drivers/misc/sgi-gru/grufile.c @@ -587,7 +587,6 @@ static const struct file_operations gru_fops = { .owner = THIS_MODULE, .unlocked_ioctl = gru_file_unlocked_ioctl, .mmap = gru_file_mmap, - .llseek = noop_llseek, }; static struct miscdevice gru_miscdev = { diff --git a/trunk/drivers/mmc/card/block.c b/trunk/drivers/mmc/card/block.c index 00073b7c0368..d545f79f6000 100644 --- a/trunk/drivers/mmc/card/block.c +++ b/trunk/drivers/mmc/card/block.c @@ -29,6 +29,7 @@ #include #include #include +#include #include #include @@ -50,7 +51,6 @@ MODULE_ALIAS("mmc:block"); #define MMC_SHIFT 3 #define MMC_NUM_MINORS (256 >> MMC_SHIFT) -static DEFINE_MUTEX(block_mutex); static DECLARE_BITMAP(dev_use, MMC_NUM_MINORS); /* @@ -108,7 +108,7 @@ static int mmc_blk_open(struct block_device *bdev, fmode_t mode) struct mmc_blk_data *md = mmc_blk_get(bdev->bd_disk); int ret = -ENXIO; - mutex_lock(&block_mutex); + lock_kernel(); if (md) { if (md->usage == 2) check_disk_change(bdev); @@ -119,7 +119,7 @@ static int mmc_blk_open(struct block_device *bdev, fmode_t mode) ret = -EROFS; } } - mutex_unlock(&block_mutex); + unlock_kernel(); return ret; } @@ -128,9 +128,9 @@ static int mmc_blk_release(struct gendisk *disk, fmode_t mode) { struct mmc_blk_data *md = disk->private_data; - mutex_lock(&block_mutex); + lock_kernel(); mmc_blk_put(md); - mutex_unlock(&block_mutex); + unlock_kernel(); return 0; } diff --git a/trunk/drivers/mmc/core/debugfs.c b/trunk/drivers/mmc/core/debugfs.c index 46bc6d7551a3..53cb380c0987 100644 --- a/trunk/drivers/mmc/core/debugfs.c +++ b/trunk/drivers/mmc/core/debugfs.c @@ -245,7 +245,6 @@ static const struct file_operations mmc_dbg_ext_csd_fops = { .open = mmc_ext_csd_open, .read = mmc_ext_csd_read, .release = mmc_ext_csd_release, - .llseek = default_llseek, }; void mmc_add_card_debugfs(struct mmc_card *card) diff --git a/trunk/drivers/mtd/mtd_blkdevs.c b/trunk/drivers/mtd/mtd_blkdevs.c index 50ab431b24eb..62e68707b07f 100644 --- a/trunk/drivers/mtd/mtd_blkdevs.c +++ b/trunk/drivers/mtd/mtd_blkdevs.c @@ -29,6 +29,7 @@ #include #include #include +#include #include #include #include @@ -37,7 +38,6 @@ #include "mtdcore.h" -static DEFINE_MUTEX(mtd_blkdevs_mutex); static LIST_HEAD(blktrans_majors); static DEFINE_MUTEX(blktrans_ref_mutex); @@ -181,7 +181,7 @@ static int blktrans_open(struct block_device *bdev, fmode_t mode) if (!dev) return -ERESTARTSYS; /* FIXME: busy loop! -arnd*/ - mutex_lock(&mtd_blkdevs_mutex); + lock_kernel(); mutex_lock(&dev->lock); if (!dev->mtd) { @@ -198,7 +198,7 @@ static int blktrans_open(struct block_device *bdev, fmode_t mode) unlock: mutex_unlock(&dev->lock); blktrans_dev_put(dev); - mutex_unlock(&mtd_blkdevs_mutex); + unlock_kernel(); return ret; } @@ -210,7 +210,7 @@ static int blktrans_release(struct gendisk *disk, fmode_t mode) if (!dev) return ret; - mutex_lock(&mtd_blkdevs_mutex); + lock_kernel(); mutex_lock(&dev->lock); /* Release one reference, we sure its not the last one here*/ @@ -223,7 +223,7 @@ static int blktrans_release(struct gendisk *disk, fmode_t mode) unlock: mutex_unlock(&dev->lock); blktrans_dev_put(dev); - mutex_unlock(&mtd_blkdevs_mutex); + unlock_kernel(); return ret; } @@ -256,7 +256,7 @@ static int blktrans_ioctl(struct block_device *bdev, fmode_t mode, if (!dev) return ret; - mutex_lock(&mtd_blkdevs_mutex); + lock_kernel(); mutex_lock(&dev->lock); if (!dev->mtd) @@ -271,7 +271,7 @@ static int blktrans_ioctl(struct block_device *bdev, fmode_t mode, } unlock: mutex_unlock(&dev->lock); - mutex_unlock(&mtd_blkdevs_mutex); + unlock_kernel(); blktrans_dev_put(dev); return ret; } diff --git a/trunk/drivers/mtd/mtdchar.c b/trunk/drivers/mtd/mtdchar.c index 5ef45487b65f..a825002123c8 100644 --- a/trunk/drivers/mtd/mtdchar.c +++ b/trunk/drivers/mtd/mtdchar.c @@ -26,7 +26,7 @@ #include #include #include -#include +#include #include #include #include @@ -37,7 +37,6 @@ #include #define MTD_INODE_FS_MAGIC 0x11307854 -static DEFINE_MUTEX(mtd_mutex); static struct vfsmount *mtd_inode_mnt __read_mostly; /* @@ -91,7 +90,7 @@ static int mtd_open(struct inode *inode, struct file *file) if ((file->f_mode & FMODE_WRITE) && (minor & 1)) return -EACCES; - mutex_lock(&mtd_mutex); + lock_kernel(); mtd = get_mtd_device(NULL, devnum); if (IS_ERR(mtd)) { @@ -139,7 +138,7 @@ static int mtd_open(struct inode *inode, struct file *file) file->private_data = mfi; out: - mutex_unlock(&mtd_mutex); + unlock_kernel(); return ret; } /* mtd_open */ @@ -867,9 +866,9 @@ static long mtd_unlocked_ioctl(struct file *file, u_int cmd, u_long arg) { int ret; - mutex_lock(&mtd_mutex); + lock_kernel(); ret = mtd_ioctl(file, cmd, arg); - mutex_unlock(&mtd_mutex); + unlock_kernel(); return ret; } @@ -893,7 +892,7 @@ static long mtd_compat_ioctl(struct file *file, unsigned int cmd, void __user *argp = compat_ptr(arg); int ret = 0; - mutex_lock(&mtd_mutex); + lock_kernel(); switch (cmd) { case MEMWRITEOOB32: @@ -928,7 +927,7 @@ static long mtd_compat_ioctl(struct file *file, unsigned int cmd, ret = mtd_ioctl(file, cmd, (unsigned long)argp); } - mutex_unlock(&mtd_mutex); + unlock_kernel(); return ret; } diff --git a/trunk/drivers/mtd/ubi/cdev.c b/trunk/drivers/mtd/ubi/cdev.c index af9fb0ff8210..3d2d1a69e9a0 100644 --- a/trunk/drivers/mtd/ubi/cdev.c +++ b/trunk/drivers/mtd/ubi/cdev.c @@ -1100,5 +1100,4 @@ const struct file_operations ubi_ctrl_cdev_operations = { .owner = THIS_MODULE, .unlocked_ioctl = ctrl_cdev_ioctl, .compat_ioctl = ctrl_cdev_compat_ioctl, - .llseek = noop_llseek, }; diff --git a/trunk/drivers/net/appletalk/Kconfig b/trunk/drivers/net/appletalk/Kconfig index 20f97e7017ce..0a0e0cd81a23 100644 --- a/trunk/drivers/net/appletalk/Kconfig +++ b/trunk/drivers/net/appletalk/Kconfig @@ -3,7 +3,6 @@ # 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 diff --git a/trunk/drivers/net/caif/caif_spi.c b/trunk/drivers/net/caif/caif_spi.c index 8427533fe313..f5058ff2b210 100644 --- a/trunk/drivers/net/caif/caif_spi.c +++ b/trunk/drivers/net/caif/caif_spi.c @@ -240,15 +240,13 @@ static ssize_t dbgfs_frame(struct file *file, char __user *user_buf, static const struct file_operations dbgfs_state_fops = { .open = dbgfs_open, .read = dbgfs_state, - .owner = THIS_MODULE, - .llseek = default_llseek, + .owner = THIS_MODULE }; static const struct file_operations dbgfs_frame_fops = { .open = dbgfs_open, .read = dbgfs_frame, - .owner = THIS_MODULE, - .llseek = default_llseek, + .owner = THIS_MODULE }; static inline void dev_debugfs_add(struct cfspi *cfspi) diff --git a/trunk/drivers/net/cxgb4/cxgb4_main.c b/trunk/drivers/net/cxgb4/cxgb4_main.c index e2bf10d90add..c327527fbbc8 100644 --- a/trunk/drivers/net/cxgb4/cxgb4_main.c +++ b/trunk/drivers/net/cxgb4/cxgb4_main.c @@ -2026,7 +2026,6 @@ static const struct file_operations mem_debugfs_fops = { .owner = THIS_MODULE, .open = mem_open, .read = mem_read, - .llseek = default_llseek, }; static void __devinit add_debugfs_mem(struct adapter *adap, const char *name, diff --git a/trunk/drivers/net/ppp_generic.c b/trunk/drivers/net/ppp_generic.c index 4bddb2afdd15..736b91703b3e 100644 --- a/trunk/drivers/net/ppp_generic.c +++ b/trunk/drivers/net/ppp_generic.c @@ -856,8 +856,7 @@ static const struct file_operations ppp_device_fops = { .poll = ppp_poll, .unlocked_ioctl = ppp_ioctl, .open = ppp_open, - .release = ppp_release, - .llseek = noop_llseek, + .release = ppp_release }; static __net_init int ppp_init_net(struct net *net) diff --git a/trunk/drivers/net/wimax/i2400m/debugfs.c b/trunk/drivers/net/wimax/i2400m/debugfs.c index 9c70b5fa3f51..b1aec3e1892f 100644 --- a/trunk/drivers/net/wimax/i2400m/debugfs.c +++ b/trunk/drivers/net/wimax/i2400m/debugfs.c @@ -119,7 +119,6 @@ const struct file_operations i2400m_rx_stats_fops = { .open = i2400m_stats_open, .read = i2400m_rx_stats_read, .write = i2400m_rx_stats_write, - .llseek = default_llseek, }; @@ -172,7 +171,6 @@ const struct file_operations i2400m_tx_stats_fops = { .open = i2400m_stats_open, .read = i2400m_tx_stats_read, .write = i2400m_tx_stats_write, - .llseek = default_llseek, }; diff --git a/trunk/drivers/net/wireless/airo.c b/trunk/drivers/net/wireless/airo.c index ce77575e88b3..1d05445d4ba3 100644 --- a/trunk/drivers/net/wireless/airo.c +++ b/trunk/drivers/net/wireless/airo.c @@ -4430,24 +4430,21 @@ static const struct file_operations proc_statsdelta_ops = { .owner = THIS_MODULE, .read = proc_read, .open = proc_statsdelta_open, - .release = proc_close, - .llseek = default_llseek, + .release = proc_close }; static const struct file_operations proc_stats_ops = { .owner = THIS_MODULE, .read = proc_read, .open = proc_stats_open, - .release = proc_close, - .llseek = default_llseek, + .release = proc_close }; static const struct file_operations proc_status_ops = { .owner = THIS_MODULE, .read = proc_read, .open = proc_status_open, - .release = proc_close, - .llseek = default_llseek, + .release = proc_close }; static const struct file_operations proc_SSID_ops = { @@ -4455,8 +4452,7 @@ static const struct file_operations proc_SSID_ops = { .read = proc_read, .write = proc_write, .open = proc_SSID_open, - .release = proc_close, - .llseek = default_llseek, + .release = proc_close }; static const struct file_operations proc_BSSList_ops = { @@ -4464,8 +4460,7 @@ static const struct file_operations proc_BSSList_ops = { .read = proc_read, .write = proc_write, .open = proc_BSSList_open, - .release = proc_close, - .llseek = default_llseek, + .release = proc_close }; static const struct file_operations proc_APList_ops = { @@ -4473,8 +4468,7 @@ static const struct file_operations proc_APList_ops = { .read = proc_read, .write = proc_write, .open = proc_APList_open, - .release = proc_close, - .llseek = default_llseek, + .release = proc_close }; static const struct file_operations proc_config_ops = { @@ -4482,8 +4476,7 @@ static const struct file_operations proc_config_ops = { .read = proc_read, .write = proc_write, .open = proc_config_open, - .release = proc_close, - .llseek = default_llseek, + .release = proc_close }; static const struct file_operations proc_wepkey_ops = { @@ -4491,8 +4484,7 @@ static const struct file_operations proc_wepkey_ops = { .read = proc_read, .write = proc_write, .open = proc_wepkey_open, - .release = proc_close, - .llseek = default_llseek, + .release = proc_close }; static struct proc_dir_entry *airo_entry; diff --git a/trunk/drivers/net/wireless/ath/ath5k/debug.c b/trunk/drivers/net/wireless/ath/ath5k/debug.c index fb339c3852ee..4cccc29964f6 100644 --- a/trunk/drivers/net/wireless/ath/ath5k/debug.c +++ b/trunk/drivers/net/wireless/ath/ath5k/debug.c @@ -271,7 +271,6 @@ static const struct file_operations fops_beacon = { .write = write_file_beacon, .open = ath5k_debugfs_open, .owner = THIS_MODULE, - .llseek = default_llseek, }; @@ -291,7 +290,6 @@ static const struct file_operations fops_reset = { .write = write_file_reset, .open = ath5k_debugfs_open, .owner = THIS_MODULE, - .llseek = noop_llseek, }; @@ -371,7 +369,6 @@ static const struct file_operations fops_debug = { .write = write_file_debug, .open = ath5k_debugfs_open, .owner = THIS_MODULE, - .llseek = default_llseek, }; @@ -483,7 +480,6 @@ static const struct file_operations fops_antenna = { .write = write_file_antenna, .open = ath5k_debugfs_open, .owner = THIS_MODULE, - .llseek = default_llseek, }; @@ -595,7 +591,6 @@ static const struct file_operations fops_frameerrors = { .write = write_file_frameerrors, .open = ath5k_debugfs_open, .owner = THIS_MODULE, - .llseek = default_llseek, }; @@ -753,7 +748,6 @@ static const struct file_operations fops_ani = { .write = write_file_ani, .open = ath5k_debugfs_open, .owner = THIS_MODULE, - .llseek = default_llseek, }; @@ -817,7 +811,6 @@ static const struct file_operations fops_queue = { .write = write_file_queue, .open = ath5k_debugfs_open, .owner = THIS_MODULE, - .llseek = default_llseek, }; diff --git a/trunk/drivers/net/wireless/ath/ath9k/debug.c b/trunk/drivers/net/wireless/ath/ath9k/debug.c index cf500bf25ad5..54aae931424e 100644 --- a/trunk/drivers/net/wireless/ath/ath9k/debug.c +++ b/trunk/drivers/net/wireless/ath/ath9k/debug.c @@ -71,8 +71,7 @@ static const struct file_operations fops_debug = { .read = read_file_debug, .write = write_file_debug, .open = ath9k_debugfs_open, - .owner = THIS_MODULE, - .llseek = default_llseek, + .owner = THIS_MODULE }; #endif @@ -117,8 +116,7 @@ static const struct file_operations fops_tx_chainmask = { .read = read_file_tx_chainmask, .write = write_file_tx_chainmask, .open = ath9k_debugfs_open, - .owner = THIS_MODULE, - .llseek = default_llseek, + .owner = THIS_MODULE }; @@ -160,8 +158,7 @@ static const struct file_operations fops_rx_chainmask = { .read = read_file_rx_chainmask, .write = write_file_rx_chainmask, .open = ath9k_debugfs_open, - .owner = THIS_MODULE, - .llseek = default_llseek, + .owner = THIS_MODULE }; @@ -262,8 +259,7 @@ static ssize_t read_file_dma(struct file *file, char __user *user_buf, static const struct file_operations fops_dma = { .read = read_file_dma, .open = ath9k_debugfs_open, - .owner = THIS_MODULE, - .llseek = default_llseek, + .owner = THIS_MODULE }; @@ -379,8 +375,7 @@ static ssize_t read_file_interrupt(struct file *file, char __user *user_buf, static const struct file_operations fops_interrupt = { .read = read_file_interrupt, .open = ath9k_debugfs_open, - .owner = THIS_MODULE, - .llseek = default_llseek, + .owner = THIS_MODULE }; void ath_debug_stat_rc(struct ath_softc *sc, int final_rate) @@ -469,8 +464,7 @@ static ssize_t read_file_rcstat(struct file *file, char __user *user_buf, static const struct file_operations fops_rcstat = { .read = read_file_rcstat, .open = ath9k_debugfs_open, - .owner = THIS_MODULE, - .llseek = default_llseek, + .owner = THIS_MODULE }; static const char * ath_wiphy_state_str(enum ath_wiphy_state state) @@ -629,8 +623,7 @@ static const struct file_operations fops_wiphy = { .read = read_file_wiphy, .write = write_file_wiphy, .open = ath9k_debugfs_open, - .owner = THIS_MODULE, - .llseek = default_llseek, + .owner = THIS_MODULE }; #define PR(str, elem) \ @@ -709,8 +702,7 @@ void ath_debug_stat_tx(struct ath_softc *sc, struct ath_txq *txq, static const struct file_operations fops_xmit = { .read = read_file_xmit, .open = ath9k_debugfs_open, - .owner = THIS_MODULE, - .llseek = default_llseek, + .owner = THIS_MODULE }; static ssize_t read_file_recv(struct file *file, char __user *user_buf, @@ -822,8 +814,7 @@ void ath_debug_stat_rx(struct ath_softc *sc, struct ath_rx_status *rs) static const struct file_operations fops_recv = { .read = read_file_recv, .open = ath9k_debugfs_open, - .owner = THIS_MODULE, - .llseek = default_llseek, + .owner = THIS_MODULE }; static ssize_t read_file_regidx(struct file *file, char __user *user_buf, @@ -861,8 +852,7 @@ static const struct file_operations fops_regidx = { .read = read_file_regidx, .write = write_file_regidx, .open = ath9k_debugfs_open, - .owner = THIS_MODULE, - .llseek = default_llseek, + .owner = THIS_MODULE }; static ssize_t read_file_regval(struct file *file, char __user *user_buf, @@ -904,8 +894,7 @@ static const struct file_operations fops_regval = { .read = read_file_regval, .write = write_file_regval, .open = ath9k_debugfs_open, - .owner = THIS_MODULE, - .llseek = default_llseek, + .owner = THIS_MODULE }; int ath9k_init_debug(struct ath_hw *ah) diff --git a/trunk/drivers/net/wireless/ath/ath9k/htc_drv_main.c b/trunk/drivers/net/wireless/ath/ath9k/htc_drv_main.c index bc2ca7d898e9..7d09b4b17bbd 100644 --- a/trunk/drivers/net/wireless/ath/ath9k/htc_drv_main.c +++ b/trunk/drivers/net/wireless/ath/ath9k/htc_drv_main.c @@ -536,8 +536,7 @@ static ssize_t read_file_tgt_stats(struct file *file, char __user *user_buf, static const struct file_operations fops_tgt_stats = { .read = read_file_tgt_stats, .open = ath9k_debugfs_open, - .owner = THIS_MODULE, - .llseek = default_llseek, + .owner = THIS_MODULE }; static ssize_t read_file_xmit(struct file *file, char __user *user_buf, @@ -585,8 +584,7 @@ static ssize_t read_file_xmit(struct file *file, char __user *user_buf, static const struct file_operations fops_xmit = { .read = read_file_xmit, .open = ath9k_debugfs_open, - .owner = THIS_MODULE, - .llseek = default_llseek, + .owner = THIS_MODULE }; static ssize_t read_file_recv(struct file *file, char __user *user_buf, @@ -615,8 +613,7 @@ static ssize_t read_file_recv(struct file *file, char __user *user_buf, static const struct file_operations fops_recv = { .read = read_file_recv, .open = ath9k_debugfs_open, - .owner = THIS_MODULE, - .llseek = default_llseek, + .owner = THIS_MODULE }; int ath9k_htc_init_debug(struct ath_hw *ah) diff --git a/trunk/drivers/net/wireless/b43/debugfs.c b/trunk/drivers/net/wireless/b43/debugfs.c index 59f59fa40334..80b19a44a407 100644 --- a/trunk/drivers/net/wireless/b43/debugfs.c +++ b/trunk/drivers/net/wireless/b43/debugfs.c @@ -627,7 +627,6 @@ static ssize_t b43_debugfs_write(struct file *file, .open = b43_debugfs_open, \ .read = b43_debugfs_read, \ .write = b43_debugfs_write, \ - .llseek = generic_file_llseek, \ }, \ .file_struct_offset = offsetof(struct b43_dfsentry, \ file_##name), \ diff --git a/trunk/drivers/net/wireless/b43legacy/debugfs.c b/trunk/drivers/net/wireless/b43legacy/debugfs.c index f232618f2cd1..1f85ac569fec 100644 --- a/trunk/drivers/net/wireless/b43legacy/debugfs.c +++ b/trunk/drivers/net/wireless/b43legacy/debugfs.c @@ -334,7 +334,6 @@ static ssize_t b43legacy_debugfs_write(struct file *file, .open = b43legacy_debugfs_open, \ .read = b43legacy_debugfs_read, \ .write = b43legacy_debugfs_write, \ - .llseek = generic_file_llseek, \ }, \ .file_struct_offset = offsetof(struct b43legacy_dfsentry, \ file_##name), \ diff --git a/trunk/drivers/net/wireless/iwlwifi/iwl-3945-rs.c b/trunk/drivers/net/wireless/iwlwifi/iwl-3945-rs.c index 293e1dbc166c..8e84a08ff951 100644 --- a/trunk/drivers/net/wireless/iwlwifi/iwl-3945-rs.c +++ b/trunk/drivers/net/wireless/iwlwifi/iwl-3945-rs.c @@ -873,7 +873,6 @@ static ssize_t iwl3945_sta_dbgfs_stats_table_read(struct file *file, static const struct file_operations rs_sta_dbgfs_stats_table_ops = { .read = iwl3945_sta_dbgfs_stats_table_read, .open = iwl3945_open_file_generic, - .llseek = default_llseek, }; static void iwl3945_add_debugfs(void *priv, void *priv_sta, diff --git a/trunk/drivers/net/wireless/iwlwifi/iwl-agn-rs.c b/trunk/drivers/net/wireless/iwlwifi/iwl-agn-rs.c index a4378ba31ef6..23e5c42e7d7e 100644 --- a/trunk/drivers/net/wireless/iwlwifi/iwl-agn-rs.c +++ b/trunk/drivers/net/wireless/iwlwifi/iwl-agn-rs.c @@ -2873,7 +2873,6 @@ static const struct file_operations rs_sta_dbgfs_scale_table_ops = { .write = rs_sta_dbgfs_scale_table_write, .read = rs_sta_dbgfs_scale_table_read, .open = open_file_generic, - .llseek = default_llseek, }; static ssize_t rs_sta_dbgfs_stats_table_read(struct file *file, char __user *user_buf, size_t count, loff_t *ppos) @@ -2916,7 +2915,6 @@ static ssize_t rs_sta_dbgfs_stats_table_read(struct file *file, static const struct file_operations rs_sta_dbgfs_stats_table_ops = { .read = rs_sta_dbgfs_stats_table_read, .open = open_file_generic, - .llseek = default_llseek, }; static ssize_t rs_sta_dbgfs_rate_scale_data_read(struct file *file, @@ -2948,7 +2946,6 @@ static ssize_t rs_sta_dbgfs_rate_scale_data_read(struct file *file, static const struct file_operations rs_sta_dbgfs_rate_scale_data_ops = { .read = rs_sta_dbgfs_rate_scale_data_read, .open = open_file_generic, - .llseek = default_llseek, }; static void rs_add_debugfs(void *priv, void *priv_sta, diff --git a/trunk/drivers/net/wireless/iwlwifi/iwl-debugfs.c b/trunk/drivers/net/wireless/iwlwifi/iwl-debugfs.c index a32d5d337649..e96a1bb12783 100644 --- a/trunk/drivers/net/wireless/iwlwifi/iwl-debugfs.c +++ b/trunk/drivers/net/wireless/iwlwifi/iwl-debugfs.c @@ -87,7 +87,6 @@ static int iwl_dbgfs_open_file_generic(struct inode *inode, struct file *file) static const struct file_operations iwl_dbgfs_##name##_ops = { \ .read = iwl_dbgfs_##name##_read, \ .open = iwl_dbgfs_open_file_generic, \ - .llseek = generic_file_llseek, \ }; #define DEBUGFS_WRITE_FILE_OPS(name) \ @@ -95,7 +94,6 @@ static const struct file_operations iwl_dbgfs_##name##_ops = { \ static const struct file_operations iwl_dbgfs_##name##_ops = { \ .write = iwl_dbgfs_##name##_write, \ .open = iwl_dbgfs_open_file_generic, \ - .llseek = generic_file_llseek, \ }; @@ -106,7 +104,6 @@ static const struct file_operations iwl_dbgfs_##name##_ops = { \ .write = iwl_dbgfs_##name##_write, \ .read = iwl_dbgfs_##name##_read, \ .open = iwl_dbgfs_open_file_generic, \ - .llseek = generic_file_llseek, \ }; static ssize_t iwl_dbgfs_tx_statistics_read(struct file *file, diff --git a/trunk/drivers/net/wireless/iwmc3200wifi/debugfs.c b/trunk/drivers/net/wireless/iwmc3200wifi/debugfs.c index 0a0cc9667cd6..53b0b7711f02 100644 --- a/trunk/drivers/net/wireless/iwmc3200wifi/debugfs.c +++ b/trunk/drivers/net/wireless/iwmc3200wifi/debugfs.c @@ -402,28 +402,24 @@ static const struct file_operations iwm_debugfs_txq_fops = { .owner = THIS_MODULE, .open = iwm_generic_open, .read = iwm_debugfs_txq_read, - .llseek = default_llseek, }; static const struct file_operations iwm_debugfs_tx_credit_fops = { .owner = THIS_MODULE, .open = iwm_generic_open, .read = iwm_debugfs_tx_credit_read, - .llseek = default_llseek, }; static const struct file_operations iwm_debugfs_rx_ticket_fops = { .owner = THIS_MODULE, .open = iwm_generic_open, .read = iwm_debugfs_rx_ticket_read, - .llseek = default_llseek, }; static const struct file_operations iwm_debugfs_fw_err_fops = { .owner = THIS_MODULE, .open = iwm_generic_open, .read = iwm_debugfs_fw_err_read, - .llseek = default_llseek, }; void iwm_debugfs_init(struct iwm_priv *iwm) diff --git a/trunk/drivers/net/wireless/iwmc3200wifi/sdio.c b/trunk/drivers/net/wireless/iwmc3200wifi/sdio.c index 56383e7be835..edcb52330cf5 100644 --- a/trunk/drivers/net/wireless/iwmc3200wifi/sdio.c +++ b/trunk/drivers/net/wireless/iwmc3200wifi/sdio.c @@ -364,7 +364,6 @@ static const struct file_operations iwm_debugfs_sdio_fops = { .owner = THIS_MODULE, .open = iwm_debugfs_sdio_open, .read = iwm_debugfs_sdio_read, - .llseek = default_llseek, }; static void if_sdio_debugfs_init(struct iwm_priv *iwm, struct dentry *parent_dir) diff --git a/trunk/drivers/net/wireless/libertas/debugfs.c b/trunk/drivers/net/wireless/libertas/debugfs.c index fbf3b0332bb7..651a79c8de8a 100644 --- a/trunk/drivers/net/wireless/libertas/debugfs.c +++ b/trunk/drivers/net/wireless/libertas/debugfs.c @@ -696,7 +696,6 @@ static ssize_t lbs_wrrf_write(struct file *file, .open = open_file_generic, \ .read = (fread), \ .write = (fwrite), \ - .llseek = generic_file_llseek, \ } struct lbs_debugfs_files { @@ -962,7 +961,6 @@ static const struct file_operations lbs_debug_fops = { .open = open_file_generic, .write = lbs_debugfs_write, .read = lbs_debugfs_read, - .llseek = default_llseek, }; /** diff --git a/trunk/drivers/net/wireless/ray_cs.c b/trunk/drivers/net/wireless/ray_cs.c index 46da03753fd5..af5b17ce5a15 100644 --- a/trunk/drivers/net/wireless/ray_cs.c +++ b/trunk/drivers/net/wireless/ray_cs.c @@ -2765,7 +2765,6 @@ static ssize_t ray_cs_essid_proc_write(struct file *file, static const struct file_operations ray_cs_essid_proc_fops = { .owner = THIS_MODULE, .write = ray_cs_essid_proc_write, - .llseek = noop_llseek, }; static ssize_t int_proc_write(struct file *file, const char __user *buffer, @@ -2799,7 +2798,6 @@ static ssize_t int_proc_write(struct file *file, const char __user *buffer, static const struct file_operations int_proc_fops = { .owner = THIS_MODULE, .write = int_proc_write, - .llseek = noop_llseek, }; #endif diff --git a/trunk/drivers/net/wireless/rt2x00/rt2x00debug.c b/trunk/drivers/net/wireless/rt2x00/rt2x00debug.c index cea81e4c5c82..b0498e7e7aae 100644 --- a/trunk/drivers/net/wireless/rt2x00/rt2x00debug.c +++ b/trunk/drivers/net/wireless/rt2x00/rt2x00debug.c @@ -315,7 +315,6 @@ static const struct file_operations rt2x00debug_fop_queue_dump = { .poll = rt2x00debug_poll_queue_dump, .open = rt2x00debug_open_queue_dump, .release = rt2x00debug_release_queue_dump, - .llseek = default_llseek, }; static ssize_t rt2x00debug_read_queue_stats(struct file *file, @@ -372,7 +371,6 @@ static const struct file_operations rt2x00debug_fop_queue_stats = { .read = rt2x00debug_read_queue_stats, .open = rt2x00debug_file_open, .release = rt2x00debug_file_release, - .llseek = default_llseek, }; #ifdef CONFIG_RT2X00_LIB_CRYPTO @@ -425,7 +423,6 @@ static const struct file_operations rt2x00debug_fop_crypto_stats = { .read = rt2x00debug_read_crypto_stats, .open = rt2x00debug_file_open, .release = rt2x00debug_file_release, - .llseek = default_llseek, }; #endif @@ -512,7 +509,6 @@ static const struct file_operations rt2x00debug_fop_##__name = {\ .write = rt2x00debug_write_##__name, \ .open = rt2x00debug_file_open, \ .release = rt2x00debug_file_release, \ - .llseek = generic_file_llseek, \ }; RT2X00DEBUGFS_OPS(csr, "0x%.8x\n", u32); @@ -546,7 +542,6 @@ static const struct file_operations rt2x00debug_fop_dev_flags = { .read = rt2x00debug_read_dev_flags, .open = rt2x00debug_file_open, .release = rt2x00debug_file_release, - .llseek = default_llseek, }; static struct dentry *rt2x00debug_create_file_driver(const char *name, diff --git a/trunk/drivers/net/wireless/wl12xx/wl1251_debugfs.c b/trunk/drivers/net/wireless/wl12xx/wl1251_debugfs.c index fa620a5e5303..5e4465ac08fa 100644 --- a/trunk/drivers/net/wireless/wl12xx/wl1251_debugfs.c +++ b/trunk/drivers/net/wireless/wl12xx/wl1251_debugfs.c @@ -50,7 +50,6 @@ static ssize_t name## _read(struct file *file, char __user *userbuf, \ static const struct file_operations name## _ops = { \ .read = name## _read, \ .open = wl1251_open_file_generic, \ - .llseek = generic_file_llseek, \ }; #define DEBUGFS_ADD(name, parent) \ @@ -87,7 +86,6 @@ static ssize_t sub## _ ##name## _read(struct file *file, \ static const struct file_operations sub## _ ##name## _ops = { \ .read = sub## _ ##name## _read, \ .open = wl1251_open_file_generic, \ - .llseek = generic_file_llseek, \ }; #define DEBUGFS_FWSTATS_ADD(sub, name) \ @@ -238,7 +236,6 @@ static ssize_t tx_queue_len_read(struct file *file, char __user *userbuf, static const struct file_operations tx_queue_len_ops = { .read = tx_queue_len_read, .open = wl1251_open_file_generic, - .llseek = generic_file_llseek, }; static ssize_t tx_queue_status_read(struct file *file, char __user *userbuf, @@ -260,7 +257,6 @@ static ssize_t tx_queue_status_read(struct file *file, char __user *userbuf, static const struct file_operations tx_queue_status_ops = { .read = tx_queue_status_read, .open = wl1251_open_file_generic, - .llseek = generic_file_llseek, }; static void wl1251_debugfs_delete_files(struct wl1251 *wl) diff --git a/trunk/drivers/net/wireless/wl12xx/wl1271_debugfs.c b/trunk/drivers/net/wireless/wl12xx/wl1271_debugfs.c index 66c2b90ddfd4..c239ef4d0b8d 100644 --- a/trunk/drivers/net/wireless/wl12xx/wl1271_debugfs.c +++ b/trunk/drivers/net/wireless/wl12xx/wl1271_debugfs.c @@ -51,7 +51,6 @@ static ssize_t name## _read(struct file *file, char __user *userbuf, \ static const struct file_operations name## _ops = { \ .read = name## _read, \ .open = wl1271_open_file_generic, \ - .llseek = generic_file_llseek, \ }; #define DEBUGFS_ADD(name, parent) \ @@ -88,7 +87,6 @@ static ssize_t sub## _ ##name## _read(struct file *file, \ static const struct file_operations sub## _ ##name## _ops = { \ .read = sub## _ ##name## _read, \ .open = wl1271_open_file_generic, \ - .llseek = generic_file_llseek, \ }; #define DEBUGFS_FWSTATS_ADD(sub, name) \ @@ -239,7 +237,6 @@ static ssize_t tx_queue_len_read(struct file *file, char __user *userbuf, static const struct file_operations tx_queue_len_ops = { .read = tx_queue_len_read, .open = wl1271_open_file_generic, - .llseek = default_llseek, }; static ssize_t gpio_power_read(struct file *file, char __user *user_buf, @@ -294,8 +291,7 @@ static ssize_t gpio_power_write(struct file *file, static const struct file_operations gpio_power_ops = { .read = gpio_power_read, .write = gpio_power_write, - .open = wl1271_open_file_generic, - .llseek = default_llseek, + .open = wl1271_open_file_generic }; static void wl1271_debugfs_delete_files(struct wl1271 *wl) diff --git a/trunk/drivers/oprofile/oprofile_files.c b/trunk/drivers/oprofile/oprofile_files.c index 89f63456646f..ccf099e684a4 100644 --- a/trunk/drivers/oprofile/oprofile_files.c +++ b/trunk/drivers/oprofile/oprofile_files.c @@ -59,7 +59,6 @@ static ssize_t timeout_write(struct file *file, char const __user *buf, static const struct file_operations timeout_fops = { .read = timeout_read, .write = timeout_write, - .llseek = default_llseek, }; #endif @@ -97,8 +96,7 @@ static ssize_t depth_write(struct file *file, char const __user *buf, size_t cou static const struct file_operations depth_fops = { .read = depth_read, - .write = depth_write, - .llseek = default_llseek, + .write = depth_write }; @@ -110,7 +108,6 @@ static ssize_t pointer_size_read(struct file *file, char __user *buf, size_t cou static const struct file_operations pointer_size_fops = { .read = pointer_size_read, - .llseek = default_llseek, }; @@ -122,7 +119,6 @@ static ssize_t cpu_type_read(struct file *file, char __user *buf, size_t count, static const struct file_operations cpu_type_fops = { .read = cpu_type_read, - .llseek = default_llseek, }; @@ -158,7 +154,6 @@ static ssize_t enable_write(struct file *file, char const __user *buf, size_t co static const struct file_operations enable_fops = { .read = enable_read, .write = enable_write, - .llseek = default_llseek, }; @@ -171,7 +166,6 @@ static ssize_t dump_write(struct file *file, char const __user *buf, size_t coun static const struct file_operations dump_fops = { .write = dump_write, - .llseek = noop_llseek, }; void oprofile_create_files(struct super_block *sb, struct dentry *root) diff --git a/trunk/drivers/oprofile/oprofilefs.c b/trunk/drivers/oprofile/oprofilefs.c index 95f711b251ad..1944621930d9 100644 --- a/trunk/drivers/oprofile/oprofilefs.c +++ b/trunk/drivers/oprofile/oprofilefs.c @@ -121,14 +121,12 @@ static const struct file_operations ulong_fops = { .read = ulong_read_file, .write = ulong_write_file, .open = default_open, - .llseek = default_llseek, }; static const struct file_operations ulong_ro_fops = { .read = ulong_read_file, .open = default_open, - .llseek = default_llseek, }; @@ -180,7 +178,6 @@ static ssize_t atomic_read_file(struct file *file, char __user *buf, size_t coun static const struct file_operations atomic_ro_fops = { .read = atomic_read_file, .open = default_open, - .llseek = default_llseek, }; diff --git a/trunk/drivers/pci/hotplug/cpqphp_sysfs.c b/trunk/drivers/pci/hotplug/cpqphp_sysfs.c index 4cb30447a486..56215322930a 100644 --- a/trunk/drivers/pci/hotplug/cpqphp_sysfs.c +++ b/trunk/drivers/pci/hotplug/cpqphp_sysfs.c @@ -34,11 +34,10 @@ #include #include #include -#include +#include #include #include "cpqphp.h" -static DEFINE_MUTEX(cpqphp_mutex); static int show_ctrl (struct controller *ctrl, char *buf) { char *out = buf; @@ -148,7 +147,7 @@ static int open(struct inode *inode, struct file *file) struct ctrl_dbg *dbg; int retval = -ENOMEM; - mutex_lock(&cpqphp_mutex); + lock_kernel(); dbg = kmalloc(sizeof(*dbg), GFP_KERNEL); if (!dbg) goto exit; @@ -161,7 +160,7 @@ static int open(struct inode *inode, struct file *file) file->private_data = dbg; retval = 0; exit: - mutex_unlock(&cpqphp_mutex); + unlock_kernel(); return retval; } @@ -170,7 +169,7 @@ static loff_t lseek(struct file *file, loff_t off, int whence) struct ctrl_dbg *dbg; loff_t new = -1; - mutex_lock(&cpqphp_mutex); + lock_kernel(); dbg = file->private_data; switch (whence) { @@ -182,10 +181,10 @@ static loff_t lseek(struct file *file, loff_t off, int whence) break; } if (new < 0 || new > dbg->size) { - mutex_unlock(&cpqphp_mutex); + unlock_kernel(); return -EINVAL; } - mutex_unlock(&cpqphp_mutex); + unlock_kernel(); return (file->f_pos = new); } diff --git a/trunk/drivers/pci/pcie/aer/aer_inject.c b/trunk/drivers/pci/pcie/aer/aer_inject.c index b3cf6223f63a..909924692b8a 100644 --- a/trunk/drivers/pci/pcie/aer/aer_inject.c +++ b/trunk/drivers/pci/pcie/aer/aer_inject.c @@ -472,7 +472,6 @@ static ssize_t aer_inject_write(struct file *filp, const char __user *ubuf, static const struct file_operations aer_inject_fops = { .write = aer_inject_write, .owner = THIS_MODULE, - .llseek = noop_llseek, }; static struct miscdevice aer_inject_device = { diff --git a/trunk/drivers/pcmcia/pcmcia_resource.c b/trunk/drivers/pcmcia/pcmcia_resource.c index a9af0d784426..0bdda5b3ed55 100644 --- a/trunk/drivers/pcmcia/pcmcia_resource.c +++ b/trunk/drivers/pcmcia/pcmcia_resource.c @@ -514,7 +514,9 @@ int pcmcia_enable_device(struct pcmcia_device *p_dev) } /* Pick memory or I/O card, DMA mode, interrupt */ - if (p_dev->_io) + if (p_dev->_io || flags & CONF_ENABLE_IRQ) + flags |= CONF_ENABLE_IOCARD; + if (flags & CONF_ENABLE_IOCARD) s->socket.flags |= SS_IOCARD; if (flags & CONF_ENABLE_SPKR) { s->socket.flags |= SS_SPKR_ENA; diff --git a/trunk/drivers/platform/x86/sony-laptop.c b/trunk/drivers/platform/x86/sony-laptop.c index f200677851b8..e3154ff7a39f 100644 --- a/trunk/drivers/platform/x86/sony-laptop.c +++ b/trunk/drivers/platform/x86/sony-laptop.c @@ -2360,7 +2360,6 @@ static const struct file_operations sonypi_misc_fops = { .release = sonypi_misc_release, .fasync = sonypi_misc_fasync, .unlocked_ioctl = sonypi_misc_ioctl, - .llseek = noop_llseek, }; static struct miscdevice sonypi_misc_device = { diff --git a/trunk/drivers/pnp/isapnp/proc.c b/trunk/drivers/pnp/isapnp/proc.c index e73ebefdf3e0..3f94edab25fa 100644 --- a/trunk/drivers/pnp/isapnp/proc.c +++ b/trunk/drivers/pnp/isapnp/proc.c @@ -31,9 +31,8 @@ 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; - mutex_lock(&inode->i_mutex); + lock_kernel(); switch (whence) { case 0: new = off; @@ -45,12 +44,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) - new = -EINVAL; - else - file->f_pos = new; - mutex_unlock(&inode->i_mutex); - return new; + if (new < 0 || new > 256) { + unlock_kernel(); + return -EINVAL; + } + unlock_kernel(); + return (file->f_pos = new); } static ssize_t isapnp_proc_bus_read(struct file *file, char __user * buf, diff --git a/trunk/drivers/rtc/rtc-m41t80.c b/trunk/drivers/rtc/rtc-m41t80.c index 5a8daa358066..d60557cae8ef 100644 --- a/trunk/drivers/rtc/rtc-m41t80.c +++ b/trunk/drivers/rtc/rtc-m41t80.c @@ -20,7 +20,7 @@ #include #include #include -#include +#include #include #ifdef CONFIG_RTC_DRV_M41T80_WDT #include @@ -68,7 +68,6 @@ #define DRV_VERSION "0.05" -static DEFINE_MUTEX(m41t80_rtc_mutex); static const struct i2c_device_id m41t80_id[] = { { "m41t62", M41T80_FEATURE_SQ | M41T80_FEATURE_SQ_ALT }, { "m41t65", M41T80_FEATURE_HT | M41T80_FEATURE_WD }, @@ -678,9 +677,9 @@ static long wdt_unlocked_ioctl(struct file *file, unsigned int cmd, { int ret; - mutex_lock(&m41t80_rtc_mutex); + lock_kernel(); ret = wdt_ioctl(file, cmd, arg); - mutex_unlock(&m41t80_rtc_mutex); + unlock_kernel(); return ret; } @@ -694,16 +693,16 @@ static long wdt_unlocked_ioctl(struct file *file, unsigned int cmd, static int wdt_open(struct inode *inode, struct file *file) { if (MINOR(inode->i_rdev) == WATCHDOG_MINOR) { - mutex_lock(&m41t80_rtc_mutex); + lock_kernel(); if (test_and_set_bit(0, &wdt_is_open)) { - mutex_unlock(&m41t80_rtc_mutex); + unlock_kernel(); return -EBUSY; } /* * Activate */ wdt_is_open = 1; - mutex_unlock(&m41t80_rtc_mutex); + unlock_kernel(); return nonseekable_open(inode, file); } return -ENODEV; @@ -749,7 +748,6 @@ static const struct file_operations wdt_fops = { .write = wdt_write, .open = wdt_open, .release = wdt_release, - .llseek = no_llseek, }; static struct miscdevice wdt_dev = { diff --git a/trunk/drivers/s390/block/dasd.c b/trunk/drivers/s390/block/dasd.c index 38e6fa9a2012..8373ca0de8e0 100644 --- a/trunk/drivers/s390/block/dasd.c +++ b/trunk/drivers/s390/block/dasd.c @@ -21,6 +21,7 @@ #include #include #include +#include #include #include @@ -2235,6 +2236,7 @@ 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)) { @@ -2269,12 +2271,14 @@ 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; } @@ -2282,8 +2286,10 @@ 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; } diff --git a/trunk/drivers/s390/block/dasd_eer.c b/trunk/drivers/s390/block/dasd_eer.c index c71d89dba302..7158f9528ecc 100644 --- a/trunk/drivers/s390/block/dasd_eer.c +++ b/trunk/drivers/s390/block/dasd_eer.c @@ -670,7 +670,6 @@ static const struct file_operations dasd_eer_fops = { .read = &dasd_eer_read, .poll = &dasd_eer_poll, .owner = THIS_MODULE, - .llseek = noop_llseek, }; static struct miscdevice *dasd_eer_dev = NULL; diff --git a/trunk/drivers/s390/block/dasd_ioctl.c b/trunk/drivers/s390/block/dasd_ioctl.c index 26075e95b1ba..1557214944f7 100644 --- a/trunk/drivers/s390/block/dasd_ioctl.c +++ b/trunk/drivers/s390/block/dasd_ioctl.c @@ -16,6 +16,7 @@ #include #include #include +#include #include #include #include @@ -369,8 +370,9 @@ static int dasd_ioctl_readall_cmb(struct dasd_block *block, unsigned int cmd, return ret; } -int dasd_ioctl(struct block_device *bdev, fmode_t mode, - unsigned int cmd, unsigned long arg) +static int +dasd_do_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; @@ -428,3 +430,14 @@ int dasd_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; +} diff --git a/trunk/drivers/s390/block/dcssblk.c b/trunk/drivers/s390/block/dcssblk.c index 9b43ae94beba..2bd72aa34c59 100644 --- a/trunk/drivers/s390/block/dcssblk.c +++ b/trunk/drivers/s390/block/dcssblk.c @@ -14,6 +14,7 @@ #include #include #include +#include #include #include #include @@ -775,6 +776,7 @@ 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; @@ -784,6 +786,7 @@ dcssblk_open(struct block_device *bdev, fmode_t mode) bdev->bd_block_size = 4096; rc = 0; out: + unlock_kernel(); return rc; } @@ -794,6 +797,7 @@ dcssblk_release(struct gendisk *disk, fmode_t mode) struct segment_info *entry; int rc; + lock_kernel(); if (!dev_info) { rc = -ENODEV; goto out; @@ -811,6 +815,7 @@ dcssblk_release(struct gendisk *disk, fmode_t mode) up_write(&dcssblk_devices_sem); rc = 0; out: + unlock_kernel(); return rc; } diff --git a/trunk/drivers/s390/char/fs3270.c b/trunk/drivers/s390/char/fs3270.c index eb28fb01a38a..857dfcb7b359 100644 --- a/trunk/drivers/s390/char/fs3270.c +++ b/trunk/drivers/s390/char/fs3270.c @@ -520,7 +520,6 @@ static const struct file_operations fs3270_fops = { .compat_ioctl = fs3270_ioctl, /* ioctl */ .open = fs3270_open, /* open */ .release = fs3270_close, /* release */ - .llseek = no_llseek, }; /* diff --git a/trunk/drivers/s390/char/monreader.c b/trunk/drivers/s390/char/monreader.c index 5b8b8592d311..e021ec663ef9 100644 --- a/trunk/drivers/s390/char/monreader.c +++ b/trunk/drivers/s390/char/monreader.c @@ -447,7 +447,6 @@ static const struct file_operations mon_fops = { .release = &mon_close, .read = &mon_read, .poll = &mon_poll, - .llseek = noop_llseek, }; static struct miscdevice mon_dev = { diff --git a/trunk/drivers/s390/char/monwriter.c b/trunk/drivers/s390/char/monwriter.c index e0702d3ea33b..572a1e7fd099 100644 --- a/trunk/drivers/s390/char/monwriter.c +++ b/trunk/drivers/s390/char/monwriter.c @@ -274,7 +274,6 @@ static const struct file_operations monwrite_fops = { .open = &monwrite_open, .release = &monwrite_close, .write = &monwrite_write, - .llseek = noop_llseek, }; static struct miscdevice mon_dev = { diff --git a/trunk/drivers/s390/char/tape_block.c b/trunk/drivers/s390/char/tape_block.c index f0fa9ca5cb2c..85cf607fc78f 100644 --- a/trunk/drivers/s390/char/tape_block.c +++ b/trunk/drivers/s390/char/tape_block.c @@ -16,7 +16,7 @@ #include #include #include -#include +#include #include #include #include @@ -45,7 +45,6 @@ /* * file operation structure for tape block frontend */ -static DEFINE_MUTEX(tape_block_mutex); static int tapeblock_open(struct block_device *, fmode_t); static int tapeblock_release(struct gendisk *, fmode_t); static int tapeblock_medium_changed(struct gendisk *); @@ -362,7 +361,7 @@ tapeblock_open(struct block_device *bdev, fmode_t mode) struct tape_device * device; int rc; - mutex_lock(&tape_block_mutex); + lock_kernel(); device = tape_get_device(disk->private_data); if (device->required_tapemarks) { @@ -386,14 +385,14 @@ tapeblock_open(struct block_device *bdev, fmode_t mode) * is called. */ tape_state_set(device, TS_BLKUSE); - mutex_unlock(&tape_block_mutex); + unlock_kernel(); return 0; release: tape_release(device); put_device: tape_put_device(device); - mutex_unlock(&tape_block_mutex); + unlock_kernel(); return rc; } @@ -408,11 +407,11 @@ tapeblock_release(struct gendisk *disk, fmode_t mode) { struct tape_device *device = disk->private_data; - mutex_lock(&tape_block_mutex); + lock_kernel(); tape_state_set(device, TS_IN_USE); tape_release(device); tape_put_device(device); - mutex_unlock(&tape_block_mutex); + unlock_kernel(); return 0; } diff --git a/trunk/drivers/s390/char/tape_char.c b/trunk/drivers/s390/char/tape_char.c index 883e2db02bd3..539045acaad4 100644 --- a/trunk/drivers/s390/char/tape_char.c +++ b/trunk/drivers/s390/char/tape_char.c @@ -53,7 +53,6 @@ static const struct file_operations tape_fops = #endif .open = tapechar_open, .release = tapechar_release, - .llseek = no_llseek, }; static int tapechar_major = TAPECHAR_MAJOR; diff --git a/trunk/drivers/s390/char/vmcp.c b/trunk/drivers/s390/char/vmcp.c index 0e7cb1a84151..04e532eec032 100644 --- a/trunk/drivers/s390/char/vmcp.c +++ b/trunk/drivers/s390/char/vmcp.c @@ -177,7 +177,6 @@ static const struct file_operations vmcp_fops = { .write = vmcp_write, .unlocked_ioctl = vmcp_ioctl, .compat_ioctl = vmcp_ioctl, - .llseek = no_llseek, }; static struct miscdevice vmcp_dev = { diff --git a/trunk/drivers/s390/char/vmlogrdr.c b/trunk/drivers/s390/char/vmlogrdr.c index 0d6dc4b92cc2..e40a1b892866 100644 --- a/trunk/drivers/s390/char/vmlogrdr.c +++ b/trunk/drivers/s390/char/vmlogrdr.c @@ -97,7 +97,6 @@ static const struct file_operations vmlogrdr_fops = { .open = vmlogrdr_open, .release = vmlogrdr_release, .read = vmlogrdr_read, - .llseek = no_llseek, }; diff --git a/trunk/drivers/s390/char/vmwatchdog.c b/trunk/drivers/s390/char/vmwatchdog.c index 12ef9121d4f0..e13508c98b1a 100644 --- a/trunk/drivers/s390/char/vmwatchdog.c +++ b/trunk/drivers/s390/char/vmwatchdog.c @@ -297,7 +297,6 @@ static const struct file_operations vmwdt_fops = { .unlocked_ioctl = &vmwdt_ioctl, .write = &vmwdt_write, .owner = THIS_MODULE, - .llseek = noop_llseek, }; static struct miscdevice vmwdt_dev = { diff --git a/trunk/drivers/s390/char/zcore.c b/trunk/drivers/s390/char/zcore.c index 3b94044027c2..f5ea3384a4b9 100644 --- a/trunk/drivers/s390/char/zcore.c +++ b/trunk/drivers/s390/char/zcore.c @@ -459,7 +459,6 @@ static const struct file_operations zcore_memmap_fops = { .read = zcore_memmap_read, .open = zcore_memmap_open, .release = zcore_memmap_release, - .llseek = no_llseek, }; static ssize_t zcore_reipl_write(struct file *filp, const char __user *buf, @@ -487,7 +486,6 @@ static const struct file_operations zcore_reipl_fops = { .write = zcore_reipl_write, .open = zcore_reipl_open, .release = zcore_reipl_release, - .llseek = no_llseek, }; #ifdef CONFIG_32BIT diff --git a/trunk/drivers/s390/cio/chsc_sch.c b/trunk/drivers/s390/cio/chsc_sch.c index f2b77e7bfc6f..a83877c664a6 100644 --- a/trunk/drivers/s390/cio/chsc_sch.c +++ b/trunk/drivers/s390/cio/chsc_sch.c @@ -806,7 +806,6 @@ static const struct file_operations chsc_fops = { .open = nonseekable_open, .unlocked_ioctl = chsc_ioctl, .compat_ioctl = chsc_ioctl, - .llseek = no_llseek, }; static struct miscdevice chsc_misc_device = { diff --git a/trunk/drivers/s390/cio/css.c b/trunk/drivers/s390/cio/css.c index ca8e1c240c3c..ac94ac751459 100644 --- a/trunk/drivers/s390/cio/css.c +++ b/trunk/drivers/s390/cio/css.c @@ -1067,7 +1067,6 @@ static ssize_t cio_settle_write(struct file *file, const char __user *buf, static const struct file_operations cio_settle_proc_fops = { .open = nonseekable_open, .write = cio_settle_write, - .llseek = no_llseek, }; static int __init cio_settle_init(void) diff --git a/trunk/drivers/s390/crypto/zcrypt_api.c b/trunk/drivers/s390/crypto/zcrypt_api.c index f5221749d180..41e0aaefafd5 100644 --- a/trunk/drivers/s390/crypto/zcrypt_api.c +++ b/trunk/drivers/s390/crypto/zcrypt_api.c @@ -897,8 +897,7 @@ static const struct file_operations zcrypt_fops = { .compat_ioctl = zcrypt_compat_ioctl, #endif .open = zcrypt_open, - .release = zcrypt_release, - .llseek = no_llseek, + .release = zcrypt_release }; /* diff --git a/trunk/drivers/s390/scsi/zfcp_cfdc.c b/trunk/drivers/s390/scsi/zfcp_cfdc.c index 1838cda68ba8..fcbd2b756da4 100644 --- a/trunk/drivers/s390/scsi/zfcp_cfdc.c +++ b/trunk/drivers/s390/scsi/zfcp_cfdc.c @@ -251,9 +251,8 @@ static const struct file_operations zfcp_cfdc_fops = { .open = nonseekable_open, .unlocked_ioctl = zfcp_cfdc_dev_ioctl, #ifdef CONFIG_COMPAT - .compat_ioctl = zfcp_cfdc_dev_ioctl, + .compat_ioctl = zfcp_cfdc_dev_ioctl #endif - .llseek = no_llseek, }; struct miscdevice zfcp_cfdc_misc = { diff --git a/trunk/drivers/sbus/char/display7seg.c b/trunk/drivers/sbus/char/display7seg.c index 55f71ea9c418..1690e53fb84a 100644 --- a/trunk/drivers/sbus/char/display7seg.c +++ b/trunk/drivers/sbus/char/display7seg.c @@ -162,7 +162,6 @@ static const struct file_operations d7s_fops = { .compat_ioctl = d7s_ioctl, .open = d7s_open, .release = d7s_release, - .llseek = noop_llseek, }; static struct miscdevice d7s_miscdev = { diff --git a/trunk/drivers/sbus/char/envctrl.c b/trunk/drivers/sbus/char/envctrl.c index 8ce414e39489..078e5f4520ef 100644 --- a/trunk/drivers/sbus/char/envctrl.c +++ b/trunk/drivers/sbus/char/envctrl.c @@ -720,7 +720,6 @@ static const struct file_operations envctrl_fops = { #endif .open = envctrl_open, .release = envctrl_release, - .llseek = noop_llseek, }; static struct miscdevice envctrl_dev = { diff --git a/trunk/drivers/sbus/char/jsflash.c b/trunk/drivers/sbus/char/jsflash.c index 13f48e28a1e1..4942050dc5b6 100644 --- a/trunk/drivers/sbus/char/jsflash.c +++ b/trunk/drivers/sbus/char/jsflash.c @@ -27,7 +27,7 @@ */ #include -#include +#include #include #include #include @@ -68,8 +68,6 @@ #define JSF_PART_BITS 2 /* 2 bits of minors to cover JSF_NPART */ #define JSF_PART_MASK 0x3 /* 2 bits mask */ -static DEFINE_MUTEX(jsf_mutex); - /* * Access functions. * We could ioremap(), but it's easier this way. @@ -227,7 +225,7 @@ static loff_t jsf_lseek(struct file * file, loff_t offset, int orig) { loff_t ret; - mutex_lock(&jsf_mutex); + lock_kernel(); switch (orig) { case 0: file->f_pos = offset; @@ -240,7 +238,7 @@ static loff_t jsf_lseek(struct file * file, loff_t offset, int orig) default: ret = -EINVAL; } - mutex_unlock(&jsf_mutex); + unlock_kernel(); return ret; } @@ -386,18 +384,18 @@ static int jsf_ioctl_program(void __user *arg) static long jsf_ioctl(struct file *f, unsigned int cmd, unsigned long arg) { - mutex_lock(&jsf_mutex); + lock_kernel(); int error = -ENOTTY; void __user *argp = (void __user *)arg; if (!capable(CAP_SYS_ADMIN)) { - mutex_unlock(&jsf_mutex); + unlock_kernel(); return -EPERM; } switch (cmd) { case JSFLASH_IDENT: if (copy_to_user(argp, &jsf0.id, JSFIDSZ)) { - mutex_unlock(&jsf_mutex); + unlock_kernel(); return -EFAULT; } break; @@ -409,7 +407,7 @@ static long jsf_ioctl(struct file *f, unsigned int cmd, unsigned long arg) break; } - mutex_unlock(&jsf_mutex); + unlock_kernel(); return error; } @@ -420,17 +418,17 @@ static int jsf_mmap(struct file * file, struct vm_area_struct * vma) static int jsf_open(struct inode * inode, struct file * filp) { - mutex_lock(&jsf_mutex); + lock_kernel(); if (jsf0.base == 0) { - mutex_unlock(&jsf_mutex); + unlock_kernel(); return -ENXIO; } if (test_and_set_bit(0, (void *)&jsf0.busy) != 0) { - mutex_unlock(&jsf_mutex); + unlock_kernel(); return -EBUSY; } - mutex_unlock(&jsf_mutex); + unlock_kernel(); return 0; /* XXX What security? */ } diff --git a/trunk/drivers/scsi/3w-9xxx.c b/trunk/drivers/scsi/3w-9xxx.c index fcf08b3f52c1..e20b7bdd4c78 100644 --- a/trunk/drivers/scsi/3w-9xxx.c +++ b/trunk/drivers/scsi/3w-9xxx.c @@ -92,6 +92,7 @@ #include #include #include +#include #include #include #include @@ -104,7 +105,6 @@ /* Globals */ #define TW_DRIVER_VERSION "2.26.02.014" -static DEFINE_MUTEX(twa_chrdev_mutex); static TW_Device_Extension *twa_device_extension_list[TW_MAX_SLOT]; static unsigned int twa_device_extension_count; static int twa_major = -1; @@ -222,8 +222,7 @@ static const struct file_operations twa_fops = { .owner = THIS_MODULE, .unlocked_ioctl = twa_chrdev_ioctl, .open = twa_chrdev_open, - .release = NULL, - .llseek = noop_llseek, + .release = NULL }; /* This function will complete an aen request from the isr */ @@ -659,7 +658,7 @@ static long twa_chrdev_ioctl(struct file *file, unsigned int cmd, unsigned long int retval = TW_IOCTL_ERROR_OS_EFAULT; void __user *argp = (void __user *)arg; - mutex_lock(&twa_chrdev_mutex); + lock_kernel(); /* Only let one of these through at a time */ if (mutex_lock_interruptible(&tw_dev->ioctl_lock)) { @@ -880,7 +879,7 @@ static long twa_chrdev_ioctl(struct file *file, unsigned int cmd, unsigned long out2: mutex_unlock(&tw_dev->ioctl_lock); out: - mutex_unlock(&twa_chrdev_mutex); + unlock_kernel(); return retval; } /* End twa_chrdev_ioctl() */ @@ -891,6 +890,7 @@ static int twa_chrdev_open(struct inode *inode, struct file *file) unsigned int minor_number; int retval = TW_IOCTL_ERROR_OS_ENODEV; + cycle_kernel_lock(); minor_number = iminor(inode); if (minor_number >= twa_device_extension_count) goto out; diff --git a/trunk/drivers/scsi/3w-sas.c b/trunk/drivers/scsi/3w-sas.c index 6a95d111d207..f481e734aad4 100644 --- a/trunk/drivers/scsi/3w-sas.c +++ b/trunk/drivers/scsi/3w-sas.c @@ -64,6 +64,7 @@ #include #include #include +#include #include #include #include @@ -76,7 +77,6 @@ /* Globals */ #define TW_DRIVER_VERSION "3.26.02.000" -static DEFINE_MUTEX(twl_chrdev_mutex); static TW_Device_Extension *twl_device_extension_list[TW_MAX_SLOT]; static unsigned int twl_device_extension_count; static int twl_major = -1; @@ -764,7 +764,7 @@ static long twl_chrdev_ioctl(struct file *file, unsigned int cmd, unsigned long int retval = -EFAULT; void __user *argp = (void __user *)arg; - mutex_lock(&twl_chrdev_mutex); + lock_kernel(); /* Only let one of these through at a time */ if (mutex_lock_interruptible(&tw_dev->ioctl_lock)) { @@ -861,7 +861,7 @@ static long twl_chrdev_ioctl(struct file *file, unsigned int cmd, unsigned long out2: mutex_unlock(&tw_dev->ioctl_lock); out: - mutex_unlock(&twl_chrdev_mutex); + unlock_kernel(); return retval; } /* End twl_chrdev_ioctl() */ @@ -876,6 +876,7 @@ static int twl_chrdev_open(struct inode *inode, struct file *file) goto out; } + cycle_kernel_lock(); minor_number = iminor(inode); if (minor_number >= twl_device_extension_count) goto out; @@ -889,8 +890,7 @@ static const struct file_operations twl_fops = { .owner = THIS_MODULE, .unlocked_ioctl = twl_chrdev_ioctl, .open = twl_chrdev_open, - .release = NULL, - .llseek = noop_llseek, + .release = NULL }; /* This function passes sense data from firmware to scsi layer */ diff --git a/trunk/drivers/scsi/3w-xxxx.c b/trunk/drivers/scsi/3w-xxxx.c index b1125341f4c8..30d735ad35b5 100644 --- a/trunk/drivers/scsi/3w-xxxx.c +++ b/trunk/drivers/scsi/3w-xxxx.c @@ -199,6 +199,7 @@ #include #include +#include #include #include #include @@ -220,7 +221,6 @@ /* Globals */ #define TW_DRIVER_VERSION "1.26.02.003" -static DEFINE_MUTEX(tw_mutex); static TW_Device_Extension *tw_device_extension_list[TW_MAX_SLOT]; static int tw_device_extension_count = 0; static int twe_major = -1; @@ -900,10 +900,10 @@ static long tw_chrdev_ioctl(struct file *file, unsigned int cmd, unsigned long a dprintk(KERN_WARNING "3w-xxxx: tw_chrdev_ioctl()\n"); - mutex_lock(&tw_mutex); + lock_kernel(); /* Only let one of these through at a time */ if (mutex_lock_interruptible(&tw_dev->ioctl_lock)) { - mutex_unlock(&tw_mutex); + unlock_kernel(); return -EINTR; } @@ -1034,7 +1034,7 @@ static long tw_chrdev_ioctl(struct file *file, unsigned int cmd, unsigned long a dma_free_coherent(&tw_dev->tw_pci_dev->dev, data_buffer_length_adjusted+sizeof(TW_New_Ioctl) - 1, cpu_addr, dma_handle); out: mutex_unlock(&tw_dev->ioctl_lock); - mutex_unlock(&tw_mutex); + unlock_kernel(); return retval; } /* End tw_chrdev_ioctl() */ @@ -1044,6 +1044,7 @@ static int tw_chrdev_open(struct inode *inode, struct file *file) { unsigned int minor_number; + cycle_kernel_lock(); dprintk(KERN_WARNING "3w-xxxx: tw_ioctl_open()\n"); minor_number = iminor(inode); @@ -1058,8 +1059,7 @@ static const struct file_operations tw_fops = { .owner = THIS_MODULE, .unlocked_ioctl = tw_chrdev_ioctl, .open = tw_chrdev_open, - .release = NULL, - .llseek = noop_llseek, + .release = NULL }; /* This function will free up device extension resources */ diff --git a/trunk/drivers/scsi/aacraid/linit.c b/trunk/drivers/scsi/aacraid/linit.c index dae46d779c7b..cad6f9abaeb9 100644 --- a/trunk/drivers/scsi/aacraid/linit.c +++ b/trunk/drivers/scsi/aacraid/linit.c @@ -38,7 +38,7 @@ #include #include #include -#include +#include #include #include #include @@ -76,7 +76,6 @@ MODULE_DESCRIPTION("Dell PERC2, 2/Si, 3/Si, 3/Di, " MODULE_LICENSE("GPL"); MODULE_VERSION(AAC_DRIVER_FULL_VERSION); -static DEFINE_MUTEX(aac_mutex); static LIST_HEAD(aac_devices); static int aac_cfg_major = -1; char aac_driver_version[] = AAC_DRIVER_FULL_VERSION; @@ -679,7 +678,7 @@ static int aac_cfg_open(struct inode *inode, struct file *file) unsigned minor_number = iminor(inode); int err = -ENODEV; - mutex_lock(&aac_mutex); /* BKL pushdown: nothing else protects this list */ + lock_kernel(); /* BKL pushdown: nothing else protects this list */ list_for_each_entry(aac, &aac_devices, entry) { if (aac->id == minor_number) { file->private_data = aac; @@ -687,7 +686,7 @@ static int aac_cfg_open(struct inode *inode, struct file *file) break; } } - mutex_unlock(&aac_mutex); + unlock_kernel(); return err; } @@ -712,9 +711,9 @@ static long aac_cfg_ioctl(struct file *file, int ret; if (!capable(CAP_SYS_RAWIO)) return -EPERM; - mutex_lock(&aac_mutex); + lock_kernel(); ret = aac_do_ioctl(file->private_data, cmd, (void __user *)arg); - mutex_unlock(&aac_mutex); + unlock_kernel(); return ret; } @@ -723,7 +722,7 @@ static long aac_cfg_ioctl(struct file *file, static long aac_compat_do_ioctl(struct aac_dev *dev, unsigned cmd, unsigned long arg) { long ret; - mutex_lock(&aac_mutex); + lock_kernel(); switch (cmd) { case FSACTL_MINIPORT_REV_CHECK: case FSACTL_SENDFIB: @@ -757,7 +756,7 @@ static long aac_compat_do_ioctl(struct aac_dev *dev, unsigned cmd, unsigned long ret = -ENOIOCTLCMD; break; } - mutex_unlock(&aac_mutex); + unlock_kernel(); return ret; } @@ -1040,7 +1039,6 @@ static const struct file_operations aac_cfg_fops = { .compat_ioctl = aac_compat_cfg_ioctl, #endif .open = aac_cfg_open, - .llseek = noop_llseek, }; static struct scsi_host_template aac_driver_template = { diff --git a/trunk/drivers/scsi/ch.c b/trunk/drivers/scsi/ch.c index a15474eef5f7..d6532187f616 100644 --- a/trunk/drivers/scsi/ch.c +++ b/trunk/drivers/scsi/ch.c @@ -22,6 +22,7 @@ #include /* here are all the ioctls */ #include #include +#include #include #include @@ -43,7 +44,6 @@ MODULE_LICENSE("GPL"); MODULE_ALIAS_CHARDEV_MAJOR(SCSI_CHANGER_MAJOR); MODULE_ALIAS_SCSI_DEVICE(TYPE_MEDIUM_CHANGER); -static DEFINE_MUTEX(ch_mutex); static int init = 1; module_param(init, int, 0444); MODULE_PARM_DESC(init, \ @@ -581,19 +581,19 @@ ch_open(struct inode *inode, struct file *file) scsi_changer *ch; int minor = iminor(inode); - mutex_lock(&ch_mutex); + lock_kernel(); spin_lock(&ch_index_lock); ch = idr_find(&ch_index_idr, minor); if (NULL == ch || scsi_device_get(ch->device)) { spin_unlock(&ch_index_lock); - mutex_unlock(&ch_mutex); + unlock_kernel(); return -ENXIO; } spin_unlock(&ch_index_lock); file->private_data = ch; - mutex_unlock(&ch_mutex); + unlock_kernel(); return 0; } @@ -981,7 +981,6 @@ static const struct file_operations changer_fops = { #ifdef CONFIG_COMPAT .compat_ioctl = ch_ioctl_compat, #endif - .llseek = noop_llseek, }; static int __init init_ch_module(void) diff --git a/trunk/drivers/scsi/dpt_i2o.c b/trunk/drivers/scsi/dpt_i2o.c index 23dec0063385..ffc1edf5e80d 100644 --- a/trunk/drivers/scsi/dpt_i2o.c +++ b/trunk/drivers/scsi/dpt_i2o.c @@ -49,6 +49,7 @@ MODULE_DESCRIPTION("Adaptec I2O RAID Driver"); #include /* for printk */ #include #include +#include #include #include @@ -75,7 +76,6 @@ MODULE_DESCRIPTION("Adaptec I2O RAID Driver"); * Needed for our management apps *============================================================================ */ -static DEFINE_MUTEX(adpt_mutex); static dpt_sig_S DPTI_sig = { {'d', 'P', 't', 'S', 'i', 'G'}, SIG_VERSION, #ifdef __i386__ @@ -126,7 +126,6 @@ static const struct file_operations adpt_fops = { #ifdef CONFIG_COMPAT .compat_ioctl = compat_adpt_ioctl, #endif - .llseek = noop_llseek, }; /* Structures and definitions for synchronous message posting. @@ -1733,12 +1732,12 @@ static int adpt_open(struct inode *inode, struct file *file) int minor; adpt_hba* pHba; - mutex_lock(&adpt_mutex); + lock_kernel(); //TODO check for root access // minor = iminor(inode); if (minor >= hba_count) { - mutex_unlock(&adpt_mutex); + unlock_kernel(); return -ENXIO; } mutex_lock(&adpt_configuration_lock); @@ -1749,7 +1748,7 @@ static int adpt_open(struct inode *inode, struct file *file) } if (pHba == NULL) { mutex_unlock(&adpt_configuration_lock); - mutex_unlock(&adpt_mutex); + unlock_kernel(); return -ENXIO; } @@ -1760,7 +1759,7 @@ static int adpt_open(struct inode *inode, struct file *file) pHba->in_use = 1; mutex_unlock(&adpt_configuration_lock); - mutex_unlock(&adpt_mutex); + unlock_kernel(); return 0; } @@ -2161,9 +2160,9 @@ static long adpt_unlocked_ioctl(struct file *file, uint cmd, ulong arg) inode = file->f_dentry->d_inode; - mutex_lock(&adpt_mutex); + lock_kernel(); ret = adpt_ioctl(inode, file, cmd, arg); - mutex_unlock(&adpt_mutex); + unlock_kernel(); return ret; } @@ -2177,7 +2176,7 @@ static long compat_adpt_ioctl(struct file *file, inode = file->f_dentry->d_inode; - mutex_lock(&adpt_mutex); + lock_kernel(); switch(cmd) { case DPT_SIGNATURE: @@ -2195,7 +2194,7 @@ static long compat_adpt_ioctl(struct file *file, ret = -ENOIOCTLCMD; } - mutex_unlock(&adpt_mutex); + unlock_kernel(); return ret; } diff --git a/trunk/drivers/scsi/gdth.c b/trunk/drivers/scsi/gdth.c index 5a3f93101017..b860d650a563 100644 --- a/trunk/drivers/scsi/gdth.c +++ b/trunk/drivers/scsi/gdth.c @@ -120,7 +120,7 @@ #include #include #include -#include +#include #include #ifdef GDTH_RTC @@ -140,7 +140,6 @@ #include #include "gdth.h" -static DEFINE_MUTEX(gdth_mutex); static void gdth_delay(int milliseconds); static void gdth_eval_mapping(u32 size, u32 *cyls, int *heads, int *secs); static irqreturn_t gdth_interrupt(int irq, void *dev_id); @@ -373,7 +372,6 @@ static const struct file_operations gdth_fops = { .unlocked_ioctl = gdth_unlocked_ioctl, .open = gdth_open, .release = gdth_close, - .llseek = noop_llseek, }; #include "gdth_proc.h" @@ -4044,12 +4042,12 @@ static int gdth_open(struct inode *inode, struct file *filep) { gdth_ha_str *ha; - mutex_lock(&gdth_mutex); + lock_kernel(); list_for_each_entry(ha, &gdth_instances, list) { if (!ha->sdev) ha->sdev = scsi_get_host_dev(ha->shost); } - mutex_unlock(&gdth_mutex); + unlock_kernel(); TRACE(("gdth_open()\n")); return 0; @@ -4617,9 +4615,9 @@ static long gdth_unlocked_ioctl(struct file *file, unsigned int cmd, { int ret; - mutex_lock(&gdth_mutex); + lock_kernel(); ret = gdth_ioctl(file, cmd, arg); - mutex_unlock(&gdth_mutex); + unlock_kernel(); return ret; } diff --git a/trunk/drivers/scsi/megaraid.c b/trunk/drivers/scsi/megaraid.c index 7ceb5cf12c6b..0b6e3228610a 100644 --- a/trunk/drivers/scsi/megaraid.c +++ b/trunk/drivers/scsi/megaraid.c @@ -46,7 +46,7 @@ #include #include #include -#include +#include #include #include @@ -62,7 +62,6 @@ MODULE_DESCRIPTION ("LSI Logic MegaRAID legacy driver"); MODULE_LICENSE ("GPL"); MODULE_VERSION(MEGARAID_MODULE_VERSION); -static DEFINE_MUTEX(megadev_mutex); static unsigned int max_cmd_per_lun = DEF_CMD_PER_LUN; module_param(max_cmd_per_lun, uint, 0); MODULE_PARM_DESC(max_cmd_per_lun, "Maximum number of commands which can be issued to a single LUN (default=DEF_CMD_PER_LUN=63)"); @@ -102,7 +101,6 @@ static const struct file_operations megadev_fops = { .owner = THIS_MODULE, .unlocked_ioctl = megadev_unlocked_ioctl, .open = megadev_open, - .llseek = noop_llseek, }; /* @@ -3284,6 +3282,7 @@ mega_init_scb(adapter_t *adapter) static int megadev_open (struct inode *inode, struct file *filep) { + cycle_kernel_lock(); /* * Only allow superuser to access private ioctl interface */ @@ -3702,9 +3701,9 @@ megadev_unlocked_ioctl(struct file *filep, unsigned int cmd, unsigned long arg) { int ret; - mutex_lock(&megadev_mutex); + lock_kernel(); ret = megadev_ioctl(filep, cmd, arg); - mutex_unlock(&megadev_mutex); + unlock_kernel(); return ret; } diff --git a/trunk/drivers/scsi/megaraid/megaraid_mm.c b/trunk/drivers/scsi/megaraid/megaraid_mm.c index a7008c0c24f9..41f82f76d884 100644 --- a/trunk/drivers/scsi/megaraid/megaraid_mm.c +++ b/trunk/drivers/scsi/megaraid/megaraid_mm.c @@ -16,12 +16,11 @@ */ #include #include -#include +#include #include "megaraid_mm.h" // Entry points for char node driver -static DEFINE_MUTEX(mraid_mm_mutex); static int mraid_mm_open(struct inode *, struct file *); static long mraid_mm_unlocked_ioctl(struct file *, uint, unsigned long); @@ -76,7 +75,6 @@ static const struct file_operations lsi_fops = { .compat_ioctl = mraid_mm_compat_ioctl, #endif .owner = THIS_MODULE, - .llseek = noop_llseek, }; static struct miscdevice megaraid_mm_dev = { @@ -100,6 +98,7 @@ mraid_mm_open(struct inode *inode, struct file *filep) */ if (!capable(CAP_SYS_ADMIN)) return (-EACCES); + cycle_kernel_lock(); return 0; } @@ -225,9 +224,9 @@ mraid_mm_unlocked_ioctl(struct file *filep, unsigned int cmd, int err; /* inconsistant: mraid_mm_compat_ioctl doesn't take the BKL */ - mutex_lock(&mraid_mm_mutex); + lock_kernel(); err = mraid_mm_ioctl(filep, cmd, arg); - mutex_unlock(&mraid_mm_mutex); + unlock_kernel(); return err; } diff --git a/trunk/drivers/scsi/megaraid/megaraid_sas.c b/trunk/drivers/scsi/megaraid/megaraid_sas.c index 51e2579a743a..99e4478c3f3e 100644 --- a/trunk/drivers/scsi/megaraid/megaraid_sas.c +++ b/trunk/drivers/scsi/megaraid/megaraid_sas.c @@ -33,6 +33,7 @@ #include #include #include +#include #include #include #include @@ -3556,6 +3557,7 @@ static void megasas_shutdown(struct pci_dev *pdev) */ static int megasas_mgmt_open(struct inode *inode, struct file *filep) { + cycle_kernel_lock(); /* * Allow only those users with admin rights */ @@ -3955,7 +3957,6 @@ static const struct file_operations megasas_mgmt_fops = { #ifdef CONFIG_COMPAT .compat_ioctl = megasas_mgmt_compat_ioctl, #endif - .llseek = noop_llseek, }; /* diff --git a/trunk/drivers/scsi/mpt2sas/mpt2sas_ctl.c b/trunk/drivers/scsi/mpt2sas/mpt2sas_ctl.c index 40cb8aeb21b1..b774973f0765 100644 --- a/trunk/drivers/scsi/mpt2sas/mpt2sas_ctl.c +++ b/trunk/drivers/scsi/mpt2sas/mpt2sas_ctl.c @@ -51,7 +51,7 @@ #include #include #include -#include +#include #include #include @@ -61,7 +61,6 @@ #include "mpt2sas_base.h" #include "mpt2sas_ctl.h" -static DEFINE_MUTEX(_ctl_mutex); static struct fasync_struct *async_queue; static DECLARE_WAIT_QUEUE_HEAD(ctl_poll_wait); @@ -2239,9 +2238,9 @@ _ctl_ioctl(struct file *file, unsigned int cmd, unsigned long arg) { long ret; - mutex_lock(&_ctl_mutex); + lock_kernel(); ret = _ctl_ioctl_main(file, cmd, (void __user *)arg); - mutex_unlock(&_ctl_mutex); + unlock_kernel(); return ret; } @@ -2310,12 +2309,12 @@ _ctl_ioctl_compat(struct file *file, unsigned cmd, unsigned long arg) { long ret; - mutex_lock(&_ctl_mutex); + lock_kernel(); if (cmd == MPT2COMMAND32) ret = _ctl_compat_mpt_command(file, cmd, arg); else ret = _ctl_ioctl_main(file, cmd, (void __user *)arg); - mutex_unlock(&_ctl_mutex); + unlock_kernel(); return ret; } #endif @@ -2953,7 +2952,6 @@ static const struct file_operations ctl_fops = { #ifdef CONFIG_COMPAT .compat_ioctl = _ctl_ioctl_compat, #endif - .llseek = noop_llseek, }; static struct miscdevice ctl_dev = { diff --git a/trunk/drivers/scsi/osd/osd_uld.c b/trunk/drivers/scsi/osd/osd_uld.c index b31a8e3841d7..ffdd9fdb9995 100644 --- a/trunk/drivers/scsi/osd/osd_uld.c +++ b/trunk/drivers/scsi/osd/osd_uld.c @@ -182,7 +182,6 @@ static const struct file_operations osd_fops = { .open = osd_uld_open, .release = osd_uld_release, .unlocked_ioctl = osd_uld_ioctl, - .llseek = noop_llseek, }; struct osd_dev *osduld_path_lookup(const char *name) diff --git a/trunk/drivers/scsi/osst.c b/trunk/drivers/scsi/osst.c index 54de1d1af1a7..278b352ae78d 100644 --- a/trunk/drivers/scsi/osst.c +++ b/trunk/drivers/scsi/osst.c @@ -51,7 +51,7 @@ static const char * osst_version = "0.99.4"; #include #include #include -#include +#include #include #include #include @@ -80,7 +80,6 @@ static const char * osst_version = "0.99.4"; #include "osst_options.h" #include "osst_detect.h" -static DEFINE_MUTEX(osst_int_mutex); static int max_dev = 0; static int write_threshold_kbs = 0; static int max_sg_segs = 0; @@ -4808,9 +4807,9 @@ static int os_scsi_tape_open(struct inode * inode, struct file * filp) { int ret; - mutex_lock(&osst_int_mutex); + lock_kernel(); ret = __os_scsi_tape_open(inode, filp); - mutex_unlock(&osst_int_mutex); + unlock_kernel(); return ret; } @@ -4944,9 +4943,9 @@ static long osst_ioctl(struct file * file, char * name = tape_name(STp); void __user * p = (void __user *)arg; - mutex_lock(&osst_int_mutex); + lock_kernel(); if (mutex_lock_interruptible(&STp->lock)) { - mutex_unlock(&osst_int_mutex); + unlock_kernel(); return -ERESTARTSYS; } @@ -5261,14 +5260,14 @@ static long osst_ioctl(struct file * file, mutex_unlock(&STp->lock); retval = scsi_ioctl(STp->device, cmd_in, p); - mutex_unlock(&osst_int_mutex); + unlock_kernel(); return retval; out: if (SRpnt) osst_release_request(SRpnt); mutex_unlock(&STp->lock); - mutex_unlock(&osst_int_mutex); + unlock_kernel(); return retval; } diff --git a/trunk/drivers/scsi/pmcraid.c b/trunk/drivers/scsi/pmcraid.c index 4b8765785aeb..ecc45c8b4e6b 100644 --- a/trunk/drivers/scsi/pmcraid.c +++ b/trunk/drivers/scsi/pmcraid.c @@ -4165,7 +4165,6 @@ static const struct file_operations pmcraid_fops = { #ifdef CONFIG_COMPAT .compat_ioctl = pmcraid_chr_ioctl, #endif - .llseek = noop_llseek, }; diff --git a/trunk/drivers/scsi/qla2xxx/qla_os.c b/trunk/drivers/scsi/qla2xxx/qla_os.c index 9946fac54255..1e4bff695254 100644 --- a/trunk/drivers/scsi/qla2xxx/qla_os.c +++ b/trunk/drivers/scsi/qla2xxx/qla_os.c @@ -3948,7 +3948,6 @@ static struct pci_driver qla2xxx_pci_driver = { static struct file_operations apidev_fops = { .owner = THIS_MODULE, - .llseek = noop_llseek, }; /** diff --git a/trunk/drivers/scsi/scsi_tgt_if.c b/trunk/drivers/scsi/scsi_tgt_if.c index 0172de197008..a87e21c35ef2 100644 --- a/trunk/drivers/scsi/scsi_tgt_if.c +++ b/trunk/drivers/scsi/scsi_tgt_if.c @@ -22,6 +22,7 @@ #include #include #include +#include #include #include #include @@ -322,6 +323,7 @@ static int tgt_open(struct inode *inode, struct file *file) { tx_ring.tr_idx = rx_ring.tr_idx = 0; + cycle_kernel_lock(); return 0; } @@ -331,7 +333,6 @@ static const struct file_operations tgt_fops = { .poll = tgt_poll, .write = tgt_write, .mmap = tgt_mmap, - .llseek = noop_llseek, }; static struct miscdevice tgt_miscdev = { diff --git a/trunk/drivers/scsi/sg.c b/trunk/drivers/scsi/sg.c index 58ec8f4efcc2..78d616315d8e 100644 --- a/trunk/drivers/scsi/sg.c +++ b/trunk/drivers/scsi/sg.c @@ -49,7 +49,7 @@ static int sg_version_num = 30534; /* 2 digits for each component */ #include #include #include -#include +#include #include "scsi.h" #include @@ -103,8 +103,6 @@ static int scatter_elem_sz_prev = SG_SCATTER_SZ; static int sg_add(struct device *, struct class_interface *); static void sg_remove(struct device *, struct class_interface *); -static DEFINE_MUTEX(sg_mutex); - static DEFINE_IDR(sg_index_idr); static DEFINE_RWLOCK(sg_index_lock); /* Also used to lock file descriptor list for device */ @@ -231,7 +229,7 @@ sg_open(struct inode *inode, struct file *filp) int res; int retval; - mutex_lock(&sg_mutex); + lock_kernel(); nonseekable_open(inode, filp); SCSI_LOG_TIMEOUT(3, printk("sg_open: dev=%d, flags=0x%x\n", dev, flags)); sdp = sg_get_dev(dev); @@ -316,7 +314,7 @@ sg_open(struct inode *inode, struct file *filp) sg_put: if (sdp) sg_put_dev(sdp); - mutex_unlock(&sg_mutex); + unlock_kernel(); return retval; } @@ -1094,9 +1092,9 @@ sg_unlocked_ioctl(struct file *filp, unsigned int cmd_in, unsigned long arg) { int ret; - mutex_lock(&sg_mutex); + lock_kernel(); ret = sg_ioctl(filp, cmd_in, arg); - mutex_unlock(&sg_mutex); + unlock_kernel(); return ret; } @@ -1353,7 +1351,6 @@ static const struct file_operations sg_fops = { .mmap = sg_mmap, .release = sg_release, .fasync = sg_fasync, - .llseek = no_llseek, }; static struct class *sg_sysfs_class; diff --git a/trunk/drivers/scsi/sr.c b/trunk/drivers/scsi/sr.c index e148341079b5..ba9c3e0387ce 100644 --- a/trunk/drivers/scsi/sr.c +++ b/trunk/drivers/scsi/sr.c @@ -44,6 +44,7 @@ #include #include #include +#include #include #include @@ -75,7 +76,6 @@ MODULE_ALIAS_SCSI_DEVICE(TYPE_WORM); CDC_CD_R|CDC_CD_RW|CDC_DVD|CDC_DVD_R|CDC_DVD_RAM|CDC_GENERIC_PACKET| \ CDC_MRW|CDC_MRW_W|CDC_RAM) -static DEFINE_MUTEX(sr_mutex); static int sr_probe(struct device *); static int sr_remove(struct device *); static int sr_done(struct scsi_cmnd *); @@ -470,24 +470,24 @@ static int sr_block_open(struct block_device *bdev, fmode_t mode) struct scsi_cd *cd; int ret = -ENXIO; - mutex_lock(&sr_mutex); + lock_kernel(); cd = scsi_cd_get(bdev->bd_disk); if (cd) { ret = cdrom_open(&cd->cdi, bdev, mode); if (ret) scsi_cd_put(cd); } - mutex_unlock(&sr_mutex); + unlock_kernel(); return ret; } static int sr_block_release(struct gendisk *disk, fmode_t mode) { struct scsi_cd *cd = scsi_cd(disk); - mutex_lock(&sr_mutex); + lock_kernel(); cdrom_release(&cd->cdi, mode); scsi_cd_put(cd); - mutex_unlock(&sr_mutex); + unlock_kernel(); return 0; } @@ -499,7 +499,7 @@ static int sr_block_ioctl(struct block_device *bdev, fmode_t mode, unsigned cmd, void __user *argp = (void __user *)arg; int ret; - mutex_lock(&sr_mutex); + lock_kernel(); /* * Send SCSI addressing ioctls directly to mid level, send other @@ -529,7 +529,7 @@ static int sr_block_ioctl(struct block_device *bdev, fmode_t mode, unsigned cmd, ret = scsi_ioctl(sdev, cmd, argp); out: - mutex_unlock(&sr_mutex); + unlock_kernel(); return ret; } diff --git a/trunk/drivers/scsi/st.c b/trunk/drivers/scsi/st.c index afdc3f5d915c..24211d0efa6d 100644 --- a/trunk/drivers/scsi/st.c +++ b/trunk/drivers/scsi/st.c @@ -39,6 +39,7 @@ static const char *verstr = "20081215"; #include #include #include +#include #include #include @@ -75,7 +76,6 @@ static const char *verstr = "20081215"; #include "st_options.h" #include "st.h" -static DEFINE_MUTEX(st_mutex); static int buffer_kbs; static int max_sg_segs; static int try_direct_io = TRY_DIRECT_IO; @@ -1180,7 +1180,7 @@ static int st_open(struct inode *inode, struct file *filp) int dev = TAPE_NR(inode); char *name; - mutex_lock(&st_mutex); + lock_kernel(); /* * We really want to do nonseekable_open(inode, filp); here, but some * versions of tar incorrectly call lseek on tapes and bail out if that @@ -1189,7 +1189,7 @@ static int st_open(struct inode *inode, struct file *filp) filp->f_mode &= ~(FMODE_PREAD | FMODE_PWRITE); if (!(STp = scsi_tape_get(dev))) { - mutex_unlock(&st_mutex); + unlock_kernel(); return -ENXIO; } @@ -1200,7 +1200,7 @@ static int st_open(struct inode *inode, struct file *filp) if (STp->in_use) { write_unlock(&st_dev_arr_lock); scsi_tape_put(STp); - mutex_unlock(&st_mutex); + unlock_kernel(); DEB( printk(ST_DEB_MSG "%s: Device already in use.\n", name); ) return (-EBUSY); } @@ -1249,14 +1249,14 @@ static int st_open(struct inode *inode, struct file *filp) retval = (-EIO); goto err_out; } - mutex_unlock(&st_mutex); + unlock_kernel(); return 0; err_out: normalize_buffer(STp->buffer); STp->in_use = 0; scsi_tape_put(STp); - mutex_unlock(&st_mutex); + unlock_kernel(); return retval; } diff --git a/trunk/drivers/serial/mfd.c b/trunk/drivers/serial/mfd.c index dc0967fb9ea6..5dff45c76d32 100644 --- a/trunk/drivers/serial/mfd.c +++ b/trunk/drivers/serial/mfd.c @@ -228,14 +228,12 @@ static const struct file_operations port_regs_ops = { .owner = THIS_MODULE, .open = hsu_show_regs_open, .read = port_show_regs, - .llseek = default_llseek, }; static const struct file_operations dma_regs_ops = { .owner = THIS_MODULE, .open = hsu_show_regs_open, .read = dma_show_regs, - .llseek = default_llseek, }; static int hsu_debugfs_init(struct hsu_port *hsu) diff --git a/trunk/drivers/spi/dw_spi.c b/trunk/drivers/spi/dw_spi.c index 90439314cf67..56247853c298 100644 --- a/trunk/drivers/spi/dw_spi.c +++ b/trunk/drivers/spi/dw_spi.c @@ -131,7 +131,6 @@ static const struct file_operations mrst_spi_regs_ops = { .owner = THIS_MODULE, .open = spi_show_regs_open, .read = spi_show_regs, - .llseek = default_llseek, }; static int mrst_spi_debugfs_init(struct dw_spi *dws) diff --git a/trunk/drivers/spi/spidev.c b/trunk/drivers/spi/spidev.c index 4e6245e67995..ea1bec3c9a13 100644 --- a/trunk/drivers/spi/spidev.c +++ b/trunk/drivers/spi/spidev.c @@ -545,7 +545,6 @@ static const struct file_operations spidev_fops = { .unlocked_ioctl = spidev_ioctl, .open = spidev_open, .release = spidev_release, - .llseek = no_llseek, }; /*-------------------------------------------------------------------------*/ diff --git a/trunk/drivers/staging/comedi/comedi_fops.c b/trunk/drivers/staging/comedi/comedi_fops.c index fecb89e8c663..14091313cebb 100644 --- a/trunk/drivers/staging/comedi/comedi_fops.c +++ b/trunk/drivers/staging/comedi/comedi_fops.c @@ -1922,7 +1922,6 @@ const struct file_operations comedi_fops = { .mmap = comedi_mmap, .poll = comedi_poll, .fasync = comedi_fasync, - .llseek = noop_llseek, }; struct class *comedi_class; diff --git a/trunk/drivers/staging/crystalhd/crystalhd_lnx.c b/trunk/drivers/staging/crystalhd/crystalhd_lnx.c index af258991fe7f..fbb80f09a3d9 100644 --- a/trunk/drivers/staging/crystalhd/crystalhd_lnx.c +++ b/trunk/drivers/staging/crystalhd/crystalhd_lnx.c @@ -351,7 +351,6 @@ static const struct file_operations chd_dec_fops = { .unlocked_ioctl = chd_dec_ioctl, .open = chd_dec_open, .release = chd_dec_close, - .llseek = noop_llseek, }; static int __devinit chd_dec_init_chdev(struct crystalhd_adp *adp) diff --git a/trunk/drivers/staging/cx25821/Kconfig b/trunk/drivers/staging/cx25821/Kconfig index 813cb355ac01..df7756a95fad 100644 --- a/trunk/drivers/staging/cx25821/Kconfig +++ b/trunk/drivers/staging/cx25821/Kconfig @@ -1,7 +1,6 @@ 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 diff --git a/trunk/drivers/staging/dream/camera/msm_camera.c b/trunk/drivers/staging/dream/camera/msm_camera.c index de4ab61efd4b..81bd71fd816e 100644 --- a/trunk/drivers/staging/dream/camera/msm_camera.c +++ b/trunk/drivers/staging/dream/camera/msm_camera.c @@ -1941,7 +1941,6 @@ static const struct file_operations msm_fops_config = { .open = msm_open, .unlocked_ioctl = msm_ioctl_config, .release = msm_release_config, - .llseek = no_llseek, }; static const struct file_operations msm_fops_control = { @@ -1949,7 +1948,6 @@ static const struct file_operations msm_fops_control = { .open = msm_open_control, .unlocked_ioctl = msm_ioctl_control, .release = msm_release_control, - .llseek = no_llseek, }; static const struct file_operations msm_fops_frame = { @@ -1958,7 +1956,6 @@ static const struct file_operations msm_fops_frame = { .unlocked_ioctl = msm_ioctl_frame, .release = msm_release_frame, .poll = msm_poll_frame, - .llseek = no_llseek, }; static int msm_setup_cdev(struct msm_device *msm, diff --git a/trunk/drivers/staging/dream/pmem.c b/trunk/drivers/staging/dream/pmem.c index 3640d1f2376d..7d6bbadd7fc7 100644 --- a/trunk/drivers/staging/dream/pmem.c +++ b/trunk/drivers/staging/dream/pmem.c @@ -180,7 +180,6 @@ const struct file_operations pmem_fops = { .mmap = pmem_mmap, .open = pmem_open, .unlocked_ioctl = pmem_ioctl, - .llseek = noop_llseek, }; static int get_id(struct file *file) @@ -1205,7 +1204,6 @@ static ssize_t debug_read(struct file *file, char __user *buf, size_t count, static struct file_operations debug_fops = { .read = debug_read, .open = debug_open, - .llseek = default_llseek, }; #endif diff --git a/trunk/drivers/staging/dream/qdsp5/adsp_driver.c b/trunk/drivers/staging/dream/qdsp5/adsp_driver.c index 28a6f8da9477..8197765aae1e 100644 --- a/trunk/drivers/staging/dream/qdsp5/adsp_driver.c +++ b/trunk/drivers/staging/dream/qdsp5/adsp_driver.c @@ -582,7 +582,6 @@ static struct file_operations adsp_fops = { .open = adsp_open, .unlocked_ioctl = adsp_ioctl, .release = adsp_release, - .llseek = no_llseek, }; static void adsp_create(struct adsp_device *adev, const char *name, diff --git a/trunk/drivers/staging/dream/qdsp5/audio_aac.c b/trunk/drivers/staging/dream/qdsp5/audio_aac.c index 45f4c78ab6e7..a373f3522384 100644 --- a/trunk/drivers/staging/dream/qdsp5/audio_aac.c +++ b/trunk/drivers/staging/dream/qdsp5/audio_aac.c @@ -1030,7 +1030,6 @@ static struct file_operations audio_aac_fops = { .read = audio_read, .write = audio_write, .unlocked_ioctl = audio_ioctl, - .llseek = noop_llseek, }; struct miscdevice audio_aac_misc = { diff --git a/trunk/drivers/staging/dream/qdsp5/audio_amrnb.c b/trunk/drivers/staging/dream/qdsp5/audio_amrnb.c index 402bbc13281a..07b79d5836e5 100644 --- a/trunk/drivers/staging/dream/qdsp5/audio_amrnb.c +++ b/trunk/drivers/staging/dream/qdsp5/audio_amrnb.c @@ -841,7 +841,6 @@ static struct file_operations audio_amrnb_fops = { .read = audamrnb_read, .write = audamrnb_write, .unlocked_ioctl = audamrnb_ioctl, - .llseek = noop_llseek, }; struct miscdevice audio_amrnb_misc = { diff --git a/trunk/drivers/staging/dream/qdsp5/audio_evrc.c b/trunk/drivers/staging/dream/qdsp5/audio_evrc.c index 24a892647370..ad989ee87690 100644 --- a/trunk/drivers/staging/dream/qdsp5/audio_evrc.c +++ b/trunk/drivers/staging/dream/qdsp5/audio_evrc.c @@ -813,7 +813,6 @@ static struct file_operations audio_evrc_fops = { .read = audevrc_read, .write = audevrc_write, .unlocked_ioctl = audevrc_ioctl, - .llseek = noop_llseek, }; struct miscdevice audio_evrc_misc = { diff --git a/trunk/drivers/staging/dream/qdsp5/audio_in.c b/trunk/drivers/staging/dream/qdsp5/audio_in.c index b51fa096074e..6ae48e72d145 100644 --- a/trunk/drivers/staging/dream/qdsp5/audio_in.c +++ b/trunk/drivers/staging/dream/qdsp5/audio_in.c @@ -921,14 +921,12 @@ static struct file_operations audio_fops = { .read = audio_in_read, .write = audio_in_write, .unlocked_ioctl = audio_in_ioctl, - .llseek = noop_llseek, }; static struct file_operations audpre_fops = { .owner = THIS_MODULE, .open = audpre_open, .unlocked_ioctl = audpre_ioctl, - .llseek = noop_llseek, }; struct miscdevice audio_in_misc = { diff --git a/trunk/drivers/staging/dream/qdsp5/audio_mp3.c b/trunk/drivers/staging/dream/qdsp5/audio_mp3.c index 409a19ce6039..530e1f35eed3 100644 --- a/trunk/drivers/staging/dream/qdsp5/audio_mp3.c +++ b/trunk/drivers/staging/dream/qdsp5/audio_mp3.c @@ -948,7 +948,6 @@ static struct file_operations audio_mp3_fops = { .read = audio_read, .write = audio_write, .unlocked_ioctl = audio_ioctl, - .llseek = noop_llseek, }; struct miscdevice audio_mp3_misc = { diff --git a/trunk/drivers/staging/dream/qdsp5/audio_out.c b/trunk/drivers/staging/dream/qdsp5/audio_out.c index d20e89541567..76d7fa5667d5 100644 --- a/trunk/drivers/staging/dream/qdsp5/audio_out.c +++ b/trunk/drivers/staging/dream/qdsp5/audio_out.c @@ -807,14 +807,12 @@ static struct file_operations audio_fops = { .read = audio_read, .write = audio_write, .unlocked_ioctl = audio_ioctl, - .llseek = noop_llseek, }; static struct file_operations audpp_fops = { .owner = THIS_MODULE, .open = audpp_open, .unlocked_ioctl = audpp_ioctl, - .llseek = noop_llseek, }; struct miscdevice audio_misc = { diff --git a/trunk/drivers/staging/dream/qdsp5/audio_qcelp.c b/trunk/drivers/staging/dream/qdsp5/audio_qcelp.c index 911bab416b85..effa96f34fdc 100644 --- a/trunk/drivers/staging/dream/qdsp5/audio_qcelp.c +++ b/trunk/drivers/staging/dream/qdsp5/audio_qcelp.c @@ -824,7 +824,6 @@ static struct file_operations audio_qcelp_fops = { .read = audqcelp_read, .write = audqcelp_write, .unlocked_ioctl = audqcelp_ioctl, - .llseek = noop_llseek, }; struct miscdevice audio_qcelp_misc = { diff --git a/trunk/drivers/staging/dream/qdsp5/evlog.h b/trunk/drivers/staging/dream/qdsp5/evlog.h index e5ab86b9dd7c..922ce670a32a 100644 --- a/trunk/drivers/staging/dream/qdsp5/evlog.h +++ b/trunk/drivers/staging/dream/qdsp5/evlog.h @@ -123,7 +123,6 @@ static int ev_log_open(struct inode *inode, struct file *file) static const struct file_operations ev_log_ops = { .read = ev_log_read, .open = ev_log_open, - .llseek = default_llseek, }; static int ev_log_init(struct ev_log *log) diff --git a/trunk/drivers/staging/dream/qdsp5/snd.c b/trunk/drivers/staging/dream/qdsp5/snd.c index e0f2f7bca29e..037d7ffb7e67 100644 --- a/trunk/drivers/staging/dream/qdsp5/snd.c +++ b/trunk/drivers/staging/dream/qdsp5/snd.c @@ -247,7 +247,6 @@ static struct file_operations snd_fops = { .open = snd_open, .release = snd_release, .unlocked_ioctl = snd_ioctl, - .llseek = noop_llseek, }; struct miscdevice snd_misc = { diff --git a/trunk/drivers/staging/easycap/Kconfig b/trunk/drivers/staging/easycap/Kconfig index 9d5fe4ddc30a..bd96f39f2735 100644 --- a/trunk/drivers/staging/easycap/Kconfig +++ b/trunk/drivers/staging/easycap/Kconfig @@ -1,7 +1,6 @@ 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 diff --git a/trunk/drivers/staging/frontier/alphatrack.c b/trunk/drivers/staging/frontier/alphatrack.c index 689099b57fd2..4e52105e6070 100644 --- a/trunk/drivers/staging/frontier/alphatrack.c +++ b/trunk/drivers/staging/frontier/alphatrack.c @@ -641,7 +641,6 @@ static const struct file_operations usb_alphatrack_fops = { .open = usb_alphatrack_open, .release = usb_alphatrack_release, .poll = usb_alphatrack_poll, - .llseek = no_llseek, }; /* diff --git a/trunk/drivers/staging/frontier/tranzport.c b/trunk/drivers/staging/frontier/tranzport.c index 3d12c1737edc..eed74f0fe0b6 100644 --- a/trunk/drivers/staging/frontier/tranzport.c +++ b/trunk/drivers/staging/frontier/tranzport.c @@ -767,7 +767,6 @@ static const struct file_operations usb_tranzport_fops = { .open = usb_tranzport_open, .release = usb_tranzport_release, .poll = usb_tranzport_poll, - .llseek = no_llseek, }; /* diff --git a/trunk/drivers/staging/go7007/Kconfig b/trunk/drivers/staging/go7007/Kconfig index 75fa46805527..e47f683a323e 100644 --- a/trunk/drivers/staging/go7007/Kconfig +++ b/trunk/drivers/staging/go7007/Kconfig @@ -1,7 +1,6 @@ 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 diff --git a/trunk/drivers/staging/hv/blkvsc_drv.c b/trunk/drivers/staging/hv/blkvsc_drv.c index 8284297b30e9..ff1d24720f11 100644 --- a/trunk/drivers/staging/hv/blkvsc_drv.c +++ b/trunk/drivers/staging/hv/blkvsc_drv.c @@ -25,7 +25,7 @@ #include #include #include -#include +#include #include #include #include @@ -124,7 +124,6 @@ struct blkvsc_driver_context { }; /* Static decl */ -static DEFINE_MUTEX(blkvsc_mutex); static int blkvsc_probe(struct device *dev); static int blkvsc_remove(struct device *device); static void blkvsc_shutdown(struct device *device); @@ -1310,7 +1309,7 @@ static int blkvsc_open(struct block_device *bdev, fmode_t mode) DPRINT_DBG(BLKVSC_DRV, "- users %d disk %s\n", blkdev->users, blkdev->gd->disk_name); - mutex_lock(&blkvsc_mutex); + lock_kernel(); spin_lock(&blkdev->lock); if (!blkdev->users && blkdev->device_type == DVD_TYPE) { @@ -1322,7 +1321,7 @@ static int blkvsc_open(struct block_device *bdev, fmode_t mode) blkdev->users++; spin_unlock(&blkdev->lock); - mutex_unlock(&blkvsc_mutex); + unlock_kernel(); return 0; } @@ -1333,7 +1332,7 @@ static int blkvsc_release(struct gendisk *disk, fmode_t mode) DPRINT_DBG(BLKVSC_DRV, "- users %d disk %s\n", blkdev->users, blkdev->gd->disk_name); - mutex_lock(&blkvsc_mutex); + lock_kernel(); spin_lock(&blkdev->lock); if (blkdev->users == 1) { spin_unlock(&blkdev->lock); @@ -1344,7 +1343,7 @@ static int blkvsc_release(struct gendisk *disk, fmode_t mode) blkdev->users--; spin_unlock(&blkdev->lock); - mutex_unlock(&blkvsc_mutex); + unlock_kernel(); return 0; } diff --git a/trunk/drivers/staging/iio/industrialio-core.c b/trunk/drivers/staging/iio/industrialio-core.c index 92a212f064bd..dd4d87a8bcaf 100644 --- a/trunk/drivers/staging/iio/industrialio-core.c +++ b/trunk/drivers/staging/iio/industrialio-core.c @@ -349,7 +349,6 @@ static const struct file_operations iio_event_chrdev_fileops = { .release = iio_event_chrdev_release, .open = iio_event_chrdev_open, .owner = THIS_MODULE, - .llseek = noop_llseek, }; static void iio_event_dev_release(struct device *dev) diff --git a/trunk/drivers/staging/iio/industrialio-ring.c b/trunk/drivers/staging/iio/industrialio-ring.c index 1c5f67253b82..6ab578e4f5f3 100644 --- a/trunk/drivers/staging/iio/industrialio-ring.c +++ b/trunk/drivers/staging/iio/industrialio-ring.c @@ -133,7 +133,6 @@ static const struct file_operations iio_ring_fileops = { .release = iio_ring_release, .open = iio_ring_open, .owner = THIS_MODULE, - .llseek = noop_llseek, }; /** diff --git a/trunk/drivers/staging/lirc/lirc_imon.c b/trunk/drivers/staging/lirc/lirc_imon.c index ed5c5fe022c9..66493253042e 100644 --- a/trunk/drivers/staging/lirc/lirc_imon.c +++ b/trunk/drivers/staging/lirc/lirc_imon.c @@ -115,8 +115,7 @@ static const struct file_operations display_fops = { .owner = THIS_MODULE, .open = &display_open, .write = &vfd_write, - .release = &display_close, - .llseek = noop_llseek, + .release = &display_close }; /* diff --git a/trunk/drivers/staging/lirc/lirc_it87.c b/trunk/drivers/staging/lirc/lirc_it87.c index 543c5c3bf907..ec11c0e949a0 100644 --- a/trunk/drivers/staging/lirc/lirc_it87.c +++ b/trunk/drivers/staging/lirc/lirc_it87.c @@ -342,7 +342,6 @@ static const struct file_operations lirc_fops = { .unlocked_ioctl = lirc_ioctl, .open = lirc_open, .release = lirc_close, - .llseek = noop_llseek, }; static int set_use_inc(void *data) diff --git a/trunk/drivers/staging/lirc/lirc_sasem.c b/trunk/drivers/staging/lirc/lirc_sasem.c index 8f72a84f34ec..73166c3f581f 100644 --- a/trunk/drivers/staging/lirc/lirc_sasem.c +++ b/trunk/drivers/staging/lirc/lirc_sasem.c @@ -125,7 +125,6 @@ static const struct file_operations vfd_fops = { .write = &vfd_write, .unlocked_ioctl = &vfd_ioctl, .release = &vfd_close, - .llseek = noop_llseek, }; /* USB Device ID for Sasem USB Control Board */ diff --git a/trunk/drivers/staging/lirc/lirc_serial.c b/trunk/drivers/staging/lirc/lirc_serial.c index 8da382492612..9456f8e3f9ef 100644 --- a/trunk/drivers/staging/lirc/lirc_serial.c +++ b/trunk/drivers/staging/lirc/lirc_serial.c @@ -1058,7 +1058,6 @@ static const struct file_operations lirc_fops = { .poll = lirc_dev_fop_poll, .open = lirc_dev_fop_open, .release = lirc_dev_fop_close, - .llseek = no_llseek, }; static struct lirc_driver driver = { diff --git a/trunk/drivers/staging/lirc/lirc_sir.c b/trunk/drivers/staging/lirc/lirc_sir.c index 2478871bd95e..eb08fa7138ba 100644 --- a/trunk/drivers/staging/lirc/lirc_sir.c +++ b/trunk/drivers/staging/lirc/lirc_sir.c @@ -459,7 +459,6 @@ static const struct file_operations lirc_fops = { .unlocked_ioctl = lirc_ioctl, .open = lirc_dev_fop_open, .release = lirc_dev_fop_close, - .llseek = no_llseek, }; static int set_use_inc(void *data) diff --git a/trunk/drivers/staging/memrar/memrar_handler.c b/trunk/drivers/staging/memrar/memrar_handler.c index cfcaa8e5b8e6..a98b3f1f11e0 100644 --- a/trunk/drivers/staging/memrar/memrar_handler.c +++ b/trunk/drivers/staging/memrar/memrar_handler.c @@ -890,7 +890,6 @@ static const struct file_operations memrar_fops = { .mmap = memrar_mmap, .open = memrar_open, .release = memrar_release, - .llseek = no_llseek, }; static struct miscdevice memrar_miscdev = { diff --git a/trunk/drivers/staging/panel/panel.c b/trunk/drivers/staging/panel/panel.c index 6885f9a46609..3221814a856e 100644 --- a/trunk/drivers/staging/panel/panel.c +++ b/trunk/drivers/staging/panel/panel.c @@ -1631,7 +1631,6 @@ static const struct file_operations keypad_fops = { .read = keypad_read, /* read */ .open = keypad_open, /* open */ .release = keypad_release, /* close */ - .llseek = default_llseek, }; static struct miscdevice keypad_dev = { diff --git a/trunk/drivers/staging/spectra/ffsport.c b/trunk/drivers/staging/spectra/ffsport.c index c7932da03c56..fa21a0fd8e84 100644 --- a/trunk/drivers/staging/spectra/ffsport.c +++ b/trunk/drivers/staging/spectra/ffsport.c @@ -27,6 +27,7 @@ #include #include #include +#include #include /**** Helper functions used for Div, Remainder operation on u64 ****/ @@ -589,16 +590,14 @@ int GLOB_SBD_ioctl(struct block_device *bdev, fmode_t mode, return -ENOTTY; } -static DEFINE_MUTEX(ffsport_mutex); - int GLOB_SBD_unlocked_ioctl(struct block_device *bdev, fmode_t mode, unsigned int cmd, unsigned long arg) { int ret; - mutex_lock(&ffsport_mutex); + lock_kernel(); ret = GLOB_SBD_ioctl(bdev, mode, cmd, arg); - mutex_unlock(&ffsport_mutex); + unlock_kernel(); return ret; } diff --git a/trunk/drivers/staging/tidspbridge/rmgr/drv_interface.c b/trunk/drivers/staging/tidspbridge/rmgr/drv_interface.c index 7b3a7d04a109..7ee89492a755 100644 --- a/trunk/drivers/staging/tidspbridge/rmgr/drv_interface.c +++ b/trunk/drivers/staging/tidspbridge/rmgr/drv_interface.c @@ -144,7 +144,6 @@ static const struct file_operations bridge_fops = { .release = bridge_release, .unlocked_ioctl = bridge_ioctl, .mmap = bridge_mmap, - .llseek = noop_llseek, }; #ifdef CONFIG_PM diff --git a/trunk/drivers/staging/usbip/Kconfig b/trunk/drivers/staging/usbip/Kconfig index b11ec379b5c2..2c1d10acb8b5 100644 --- a/trunk/drivers/staging/usbip/Kconfig +++ b/trunk/drivers/staging/usbip/Kconfig @@ -1,6 +1,6 @@ config USB_IP_COMMON tristate "USB IP support (EXPERIMENTAL)" - depends on USB && NET && EXPERIMENTAL && BKL + depends on USB && NET && EXPERIMENTAL default N ---help--- This enables pushing USB packets over IP to allow remote diff --git a/trunk/drivers/telephony/ixj.c b/trunk/drivers/telephony/ixj.c index 0d236f4bb8c2..b53deee25d74 100644 --- a/trunk/drivers/telephony/ixj.c +++ b/trunk/drivers/telephony/ixj.c @@ -257,7 +257,7 @@ #include /* everything... */ #include /* error codes */ #include -#include +#include #include #include #include @@ -277,7 +277,6 @@ #define TYPE(inode) (iminor(inode) >> 4) #define NUM(inode) (iminor(inode) & 0xf) -static DEFINE_MUTEX(ixj_mutex); static int ixjdebug; static int hertz = HZ; static int samplerate = 100; @@ -6656,9 +6655,9 @@ static long do_ixj_ioctl(struct file *file_p, unsigned int cmd, unsigned long ar static long ixj_ioctl(struct file *file_p, unsigned int cmd, unsigned long arg) { long ret; - mutex_lock(&ixj_mutex); + lock_kernel(); ret = do_ixj_ioctl(file_p, cmd, arg); - mutex_unlock(&ixj_mutex); + unlock_kernel(); return ret; } @@ -6677,8 +6676,7 @@ static const struct file_operations ixj_fops = .poll = ixj_poll, .unlocked_ioctl = ixj_ioctl, .release = ixj_release, - .fasync = ixj_fasync, - .llseek = default_llseek, + .fasync = ixj_fasync }; static int ixj_linetest(IXJ *j) diff --git a/trunk/drivers/telephony/phonedev.c b/trunk/drivers/telephony/phonedev.c index 1915af201175..f3873f650bb4 100644 --- a/trunk/drivers/telephony/phonedev.c +++ b/trunk/drivers/telephony/phonedev.c @@ -130,7 +130,6 @@ static const struct file_operations phone_fops = { .owner = THIS_MODULE, .open = phone_open, - .llseek = noop_llseek, }; /* diff --git a/trunk/drivers/uio/uio.c b/trunk/drivers/uio/uio.c index 4d3a6fd1a152..bff1afbde5a4 100644 --- a/trunk/drivers/uio/uio.c +++ b/trunk/drivers/uio/uio.c @@ -740,7 +740,6 @@ static const struct file_operations uio_fops = { .mmap = uio_mmap, .poll = uio_poll, .fasync = uio_fasync, - .llseek = noop_llseek, }; static int uio_major_init(void) diff --git a/trunk/drivers/usb/class/cdc-wdm.c b/trunk/drivers/usb/class/cdc-wdm.c index 6ee4451bfe2d..094c76b5de17 100644 --- a/trunk/drivers/usb/class/cdc-wdm.c +++ b/trunk/drivers/usb/class/cdc-wdm.c @@ -584,8 +584,7 @@ static const struct file_operations wdm_fops = { .open = wdm_open, .flush = wdm_flush, .release = wdm_release, - .poll = wdm_poll, - .llseek = noop_llseek, + .poll = wdm_poll }; static struct usb_class_driver wdm_class = { diff --git a/trunk/drivers/usb/class/usblp.c b/trunk/drivers/usb/class/usblp.c index 9eca4053312e..e325162859b0 100644 --- a/trunk/drivers/usb/class/usblp.c +++ b/trunk/drivers/usb/class/usblp.c @@ -1043,7 +1043,6 @@ static const struct file_operations usblp_fops = { .compat_ioctl = usblp_ioctl, .open = usblp_open, .release = usblp_release, - .llseek = noop_llseek, }; static char *usblp_devnode(struct device *dev, mode_t *mode) diff --git a/trunk/drivers/usb/class/usbtmc.c b/trunk/drivers/usb/class/usbtmc.c index 6a54634ab823..3e7c1b800ebb 100644 --- a/trunk/drivers/usb/class/usbtmc.c +++ b/trunk/drivers/usb/class/usbtmc.c @@ -987,7 +987,6 @@ static const struct file_operations fops = { .open = usbtmc_open, .release = usbtmc_release, .unlocked_ioctl = usbtmc_ioctl, - .llseek = default_llseek, }; static struct usb_class_driver usbtmc_class = { diff --git a/trunk/drivers/usb/core/file.c b/trunk/drivers/usb/core/file.c index 9fe34fb78ef1..1e6ccef2cf0c 100644 --- a/trunk/drivers/usb/core/file.c +++ b/trunk/drivers/usb/core/file.c @@ -59,7 +59,6 @@ static int usb_open(struct inode * inode, struct file * file) static const struct file_operations usb_fops = { .owner = THIS_MODULE, .open = usb_open, - .llseek = noop_llseek, }; static struct usb_class { diff --git a/trunk/drivers/usb/gadget/f_hid.c b/trunk/drivers/usb/gadget/f_hid.c index 2b98bd26364b..53e120208e99 100644 --- a/trunk/drivers/usb/gadget/f_hid.c +++ b/trunk/drivers/usb/gadget/f_hid.c @@ -451,7 +451,6 @@ const struct file_operations f_hidg_fops = { .write = f_hidg_write, .read = f_hidg_read, .poll = f_hidg_poll, - .llseek = noop_llseek, }; static int __init hidg_bind(struct usb_configuration *c, struct usb_function *f) diff --git a/trunk/drivers/usb/gadget/inode.c b/trunk/drivers/usb/gadget/inode.c index 3f1d771c8be5..fc35406fc80c 100644 --- a/trunk/drivers/usb/gadget/inode.c +++ b/trunk/drivers/usb/gadget/inode.c @@ -33,6 +33,7 @@ #include #include #include +#include #include #include diff --git a/trunk/drivers/usb/gadget/printer.c b/trunk/drivers/usb/gadget/printer.c index 327a92a137b4..cf241c371a71 100644 --- a/trunk/drivers/usb/gadget/printer.c +++ b/trunk/drivers/usb/gadget/printer.c @@ -884,8 +884,7 @@ static const struct file_operations printer_io_operations = { .fsync = printer_fsync, .poll = printer_poll, .unlocked_ioctl = printer_ioctl, - .release = printer_close, - .llseek = noop_llseek, + .release = printer_close }; /*-------------------------------------------------------------------------*/ diff --git a/trunk/drivers/usb/host/ehci-dbg.c b/trunk/drivers/usb/host/ehci-dbg.c index 86afdc73322f..76b7fd2d838a 100644 --- a/trunk/drivers/usb/host/ehci-dbg.c +++ b/trunk/drivers/usb/host/ehci-dbg.c @@ -369,21 +369,18 @@ static const struct file_operations debug_async_fops = { .open = debug_async_open, .read = debug_output, .release = debug_close, - .llseek = default_llseek, }; static const struct file_operations debug_periodic_fops = { .owner = THIS_MODULE, .open = debug_periodic_open, .read = debug_output, .release = debug_close, - .llseek = default_llseek, }; static const struct file_operations debug_registers_fops = { .owner = THIS_MODULE, .open = debug_registers_open, .read = debug_output, .release = debug_close, - .llseek = default_llseek, }; static const struct file_operations debug_lpm_fops = { .owner = THIS_MODULE, @@ -391,7 +388,6 @@ static const struct file_operations debug_lpm_fops = { .read = debug_lpm_read, .write = debug_lpm_write, .release = debug_lpm_close, - .llseek = noop_llseek, }; static struct dentry *ehci_debug_root; diff --git a/trunk/drivers/usb/host/ohci-dbg.c b/trunk/drivers/usb/host/ohci-dbg.c index d7d34492934a..36abd2baa3ea 100644 --- a/trunk/drivers/usb/host/ohci-dbg.c +++ b/trunk/drivers/usb/host/ohci-dbg.c @@ -413,21 +413,18 @@ static const struct file_operations debug_async_fops = { .open = debug_async_open, .read = debug_output, .release = debug_close, - .llseek = default_llseek, }; static const struct file_operations debug_periodic_fops = { .owner = THIS_MODULE, .open = debug_periodic_open, .read = debug_output, .release = debug_close, - .llseek = default_llseek, }; static const struct file_operations debug_registers_fops = { .owner = THIS_MODULE, .open = debug_registers_open, .read = debug_output, .release = debug_close, - .llseek = default_llseek, }; static struct dentry *ohci_debug_root; diff --git a/trunk/drivers/usb/image/mdc800.c b/trunk/drivers/usb/image/mdc800.c index 575b56c79e97..e192e8f7c560 100644 --- a/trunk/drivers/usb/image/mdc800.c +++ b/trunk/drivers/usb/image/mdc800.c @@ -963,7 +963,6 @@ static const struct file_operations mdc800_device_ops = .write = mdc800_device_write, .open = mdc800_device_open, .release = mdc800_device_release, - .llseek = noop_llseek, }; diff --git a/trunk/drivers/usb/misc/adutux.c b/trunk/drivers/usb/misc/adutux.c index 44f8b9225054..801324af9470 100644 --- a/trunk/drivers/usb/misc/adutux.c +++ b/trunk/drivers/usb/misc/adutux.c @@ -679,7 +679,6 @@ static const struct file_operations adu_fops = { .write = adu_write, .open = adu_open, .release = adu_release, - .llseek = noop_llseek, }; /* diff --git a/trunk/drivers/usb/misc/idmouse.c b/trunk/drivers/usb/misc/idmouse.c index c6184b4d1695..a54c3cb804ce 100644 --- a/trunk/drivers/usb/misc/idmouse.c +++ b/trunk/drivers/usb/misc/idmouse.c @@ -105,7 +105,6 @@ static const struct file_operations idmouse_fops = { .read = idmouse_read, .open = idmouse_open, .release = idmouse_release, - .llseek = default_llseek, }; /* class driver information */ diff --git a/trunk/drivers/usb/misc/iowarrior.c b/trunk/drivers/usb/misc/iowarrior.c index 9b50db257019..bc88c79875a1 100644 --- a/trunk/drivers/usb/misc/iowarrior.c +++ b/trunk/drivers/usb/misc/iowarrior.c @@ -730,7 +730,6 @@ static const struct file_operations iowarrior_fops = { .open = iowarrior_open, .release = iowarrior_release, .poll = iowarrior_poll, - .llseek = noop_llseek, }; static char *iowarrior_devnode(struct device *dev, mode_t *mode) diff --git a/trunk/drivers/usb/misc/ldusb.c b/trunk/drivers/usb/misc/ldusb.c index edffef642337..dd41d8710043 100644 --- a/trunk/drivers/usb/misc/ldusb.c +++ b/trunk/drivers/usb/misc/ldusb.c @@ -613,7 +613,6 @@ static const struct file_operations ld_usb_fops = { .open = ld_usb_open, .release = ld_usb_release, .poll = ld_usb_poll, - .llseek = no_llseek, }; /* diff --git a/trunk/drivers/usb/misc/rio500.c b/trunk/drivers/usb/misc/rio500.c index 4e23d3841b43..cc13ae61712a 100644 --- a/trunk/drivers/usb/misc/rio500.c +++ b/trunk/drivers/usb/misc/rio500.c @@ -439,7 +439,6 @@ static const struct file_operations usb_rio_fops = { .unlocked_ioctl = ioctl_rio, .open = open_rio, .release = close_rio, - .llseek = noop_llseek, }; static struct usb_class_driver usb_rio_class = { diff --git a/trunk/drivers/usb/misc/usblcd.c b/trunk/drivers/usb/misc/usblcd.c index 51648154bb44..d00dde19194c 100644 --- a/trunk/drivers/usb/misc/usblcd.c +++ b/trunk/drivers/usb/misc/usblcd.c @@ -282,7 +282,6 @@ static const struct file_operations lcd_fops = { .open = lcd_open, .unlocked_ioctl = lcd_ioctl, .release = lcd_release, - .llseek = noop_llseek, }; /* diff --git a/trunk/drivers/usb/usb-skeleton.c b/trunk/drivers/usb/usb-skeleton.c index e24ce3123071..552679b8dbd1 100644 --- a/trunk/drivers/usb/usb-skeleton.c +++ b/trunk/drivers/usb/usb-skeleton.c @@ -507,7 +507,6 @@ static const struct file_operations skel_fops = { .open = skel_open, .release = skel_release, .flush = skel_flush, - .llseek = noop_llseek, }; /* diff --git a/trunk/drivers/vhost/net.c b/trunk/drivers/vhost/net.c index 861af4a8b79c..17927b1f9334 100644 --- a/trunk/drivers/vhost/net.c +++ b/trunk/drivers/vhost/net.c @@ -877,7 +877,6 @@ static const struct file_operations vhost_net_fops = { .compat_ioctl = vhost_net_compat_ioctl, #endif .open = vhost_net_open, - .llseek = noop_llseek, }; static struct miscdevice vhost_net_misc = { diff --git a/trunk/drivers/video/fbmem.c b/trunk/drivers/video/fbmem.c index 42e303ff862a..b06647517c0e 100644 --- a/trunk/drivers/video/fbmem.c +++ b/trunk/drivers/video/fbmem.c @@ -1439,7 +1439,6 @@ static const struct file_operations fb_fops = { #ifdef CONFIG_FB_DEFERRED_IO .fsync = fb_deferred_io_fsync, #endif - .llseek = default_llseek, }; struct class *fb_class; diff --git a/trunk/drivers/video/mbx/mbxdebugfs.c b/trunk/drivers/video/mbx/mbxdebugfs.c index 12dec7634c55..ecad96524570 100644 --- a/trunk/drivers/video/mbx/mbxdebugfs.c +++ b/trunk/drivers/video/mbx/mbxdebugfs.c @@ -175,42 +175,36 @@ static const struct file_operations sysconf_fops = { .read = sysconf_read_file, .write = write_file_dummy, .open = open_file_generic, - .llseek = default_llseek, }; static const struct file_operations clock_fops = { .read = clock_read_file, .write = write_file_dummy, .open = open_file_generic, - .llseek = default_llseek, }; static const struct file_operations display_fops = { .read = display_read_file, .write = write_file_dummy, .open = open_file_generic, - .llseek = default_llseek, }; static const struct file_operations gsctl_fops = { .read = gsctl_read_file, .write = write_file_dummy, .open = open_file_generic, - .llseek = default_llseek, }; static const struct file_operations sdram_fops = { .read = sdram_read_file, .write = write_file_dummy, .open = open_file_generic, - .llseek = default_llseek, }; static const struct file_operations misc_fops = { .read = misc_read_file, .write = write_file_dummy, .open = open_file_generic, - .llseek = default_llseek, }; static void __devinit mbxfb_debugfs_init(struct fb_info *fbi) diff --git a/trunk/drivers/watchdog/ar7_wdt.c b/trunk/drivers/watchdog/ar7_wdt.c index b29221783598..c764c52412e4 100644 --- a/trunk/drivers/watchdog/ar7_wdt.c +++ b/trunk/drivers/watchdog/ar7_wdt.c @@ -267,7 +267,6 @@ static const struct file_operations ar7_wdt_fops = { .unlocked_ioctl = ar7_wdt_ioctl, .open = ar7_wdt_open, .release = ar7_wdt_release, - .llseek = no_llseek, }; static struct miscdevice ar7_wdt_miscdev = { diff --git a/trunk/drivers/watchdog/cpwd.c b/trunk/drivers/watchdog/cpwd.c index eca855a55c0d..566343b3c131 100644 --- a/trunk/drivers/watchdog/cpwd.c +++ b/trunk/drivers/watchdog/cpwd.c @@ -25,7 +25,7 @@ #include #include #include -#include +#include #include #include #include @@ -89,7 +89,6 @@ struct cpwd { } devs[WD_NUMDEVS]; }; -static DEFINE_MUTEX(cpwd_mutex); static struct cpwd *cpwd_device; /* Sun uses Altera PLD EPF8820ATC144-4 @@ -369,7 +368,7 @@ static int cpwd_open(struct inode *inode, struct file *f) { struct cpwd *p = cpwd_device; - mutex_lock(&cpwd_mutex); + lock_kernel(); switch (iminor(inode)) { case WD0_MINOR: case WD1_MINOR: @@ -377,7 +376,7 @@ static int cpwd_open(struct inode *inode, struct file *f) break; default: - mutex_unlock(&cpwd_mutex); + unlock_kernel(); return -ENODEV; } @@ -387,13 +386,13 @@ static int cpwd_open(struct inode *inode, struct file *f) IRQF_SHARED, DRIVER_NAME, p)) { printk(KERN_ERR PFX "Cannot register IRQ %d\n", p->irq); - mutex_unlock(&cpwd_mutex); + unlock_kernel(); return -EBUSY; } p->initialized = true; } - mutex_unlock(&cpwd_mutex); + unlock_kernel(); return nonseekable_open(inode, f); } @@ -483,9 +482,9 @@ static long cpwd_compat_ioctl(struct file *file, unsigned int cmd, case WIOCSTART: case WIOCSTOP: case WIOCGSTAT: - mutex_lock(&cpwd_mutex); + lock_kernel(); rval = cpwd_ioctl(file, cmd, arg); - mutex_unlock(&cpwd_mutex); + unlock_kernel(); break; /* everything else is handled by the generic compat layer */ @@ -525,7 +524,6 @@ static const struct file_operations cpwd_fops = { .write = cpwd_write, .read = cpwd_read, .release = cpwd_release, - .llseek = no_llseek, }; static int __devinit cpwd_probe(struct platform_device *op, diff --git a/trunk/drivers/watchdog/ep93xx_wdt.c b/trunk/drivers/watchdog/ep93xx_wdt.c index 726b7df61fd0..59359c9a5e01 100644 --- a/trunk/drivers/watchdog/ep93xx_wdt.c +++ b/trunk/drivers/watchdog/ep93xx_wdt.c @@ -188,7 +188,6 @@ static const struct file_operations ep93xx_wdt_fops = { .unlocked_ioctl = ep93xx_wdt_ioctl, .open = ep93xx_wdt_open, .release = ep93xx_wdt_release, - .llseek = no_llseek, }; static struct miscdevice ep93xx_wdt_miscdev = { diff --git a/trunk/drivers/watchdog/omap_wdt.c b/trunk/drivers/watchdog/omap_wdt.c index 81e3d6100894..76b58abf4451 100644 --- a/trunk/drivers/watchdog/omap_wdt.c +++ b/trunk/drivers/watchdog/omap_wdt.c @@ -258,7 +258,6 @@ static const struct file_operations omap_wdt_fops = { .unlocked_ioctl = omap_wdt_ioctl, .open = omap_wdt_open, .release = omap_wdt_release, - .llseek = no_llseek, }; static int __devinit omap_wdt_probe(struct platform_device *pdev) diff --git a/trunk/drivers/xen/evtchn.c b/trunk/drivers/xen/evtchn.c index fec6ba3c08a8..66e185cfe92f 100644 --- a/trunk/drivers/xen/evtchn.c +++ b/trunk/drivers/xen/evtchn.c @@ -467,7 +467,6 @@ static const struct file_operations evtchn_fops = { .fasync = evtchn_fasync, .open = evtchn_open, .release = evtchn_release, - .llseek = noop_llseek, }; static struct miscdevice evtchn_miscdev = { diff --git a/trunk/drivers/xen/xenfs/super.c b/trunk/drivers/xen/xenfs/super.c index bd96340063c1..78bfab0700ba 100644 --- a/trunk/drivers/xen/xenfs/super.c +++ b/trunk/drivers/xen/xenfs/super.c @@ -35,7 +35,6 @@ static ssize_t capabilities_read(struct file *file, char __user *buf, static const struct file_operations capabilities_file_ops = { .read = capabilities_read, - .llseek = default_llseek, }; static int xenfs_fill_super(struct super_block *sb, void *data, int silent) diff --git a/trunk/drivers/xen/xenfs/xenbus.c b/trunk/drivers/xen/xenfs/xenbus.c index 1c1236087f78..3b39c3752e21 100644 --- a/trunk/drivers/xen/xenfs/xenbus.c +++ b/trunk/drivers/xen/xenfs/xenbus.c @@ -594,5 +594,4 @@ const struct file_operations xenbus_file_ops = { .open = xenbus_file_open, .release = xenbus_file_release, .poll = xenbus_file_poll, - .llseek = no_llseek, }; diff --git a/trunk/fs/Kconfig b/trunk/fs/Kconfig index 65781de44fc0..3d185308ec88 100644 --- a/trunk/fs/Kconfig +++ b/trunk/fs/Kconfig @@ -50,7 +50,6 @@ 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 diff --git a/trunk/fs/adfs/Kconfig b/trunk/fs/adfs/Kconfig index 1dd5f34b3cf2..e55182a74605 100644 --- a/trunk/fs/adfs/Kconfig +++ b/trunk/fs/adfs/Kconfig @@ -1,7 +1,6 @@ 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 diff --git a/trunk/fs/adfs/super.c b/trunk/fs/adfs/super.c index d9803f73236f..4a3af7075c1d 100644 --- a/trunk/fs/adfs/super.c +++ b/trunk/fs/adfs/super.c @@ -352,15 +352,11 @@ static int adfs_fill_super(struct super_block *sb, void *data, int silent) struct adfs_sb_info *asb; struct inode *root; - lock_kernel(); - sb->s_flags |= MS_NODIRATIME; asb = kzalloc(sizeof(*asb), GFP_KERNEL); - if (!asb) { - unlock_kernel(); + if (!asb) return -ENOMEM; - } sb->s_fs_info = asb; /* set default options */ @@ -478,7 +474,6 @@ static int adfs_fill_super(struct super_block *sb, void *data, int silent) goto error; } else sb->s_root->d_op = &adfs_dentry_operations; - unlock_kernel(); return 0; error_free_bh: @@ -486,7 +481,6 @@ static int adfs_fill_super(struct super_block *sb, void *data, int silent) error: sb->s_fs_info = NULL; kfree(asb); - unlock_kernel(); return -EINVAL; } diff --git a/trunk/fs/affs/super.c b/trunk/fs/affs/super.c index fa4fbe1e238a..9581ea94d5a1 100644 --- a/trunk/fs/affs/super.c +++ b/trunk/fs/affs/super.c @@ -16,6 +16,7 @@ #include #include #include +#include #include #include "affs.h" @@ -45,6 +46,8 @@ affs_put_super(struct super_block *sb) struct affs_sb_info *sbi = AFFS_SB(sb); pr_debug("AFFS: put_super()\n"); + lock_kernel(); + if (!(sb->s_flags & MS_RDONLY) && sb->s_dirt) affs_commit_super(sb, 1, 1); @@ -53,6 +56,8 @@ affs_put_super(struct super_block *sb) affs_brelse(sbi->s_root_bh); kfree(sbi); sb->s_fs_info = NULL; + + unlock_kernel(); } static void @@ -297,7 +302,6 @@ static int affs_fill_super(struct super_block *sb, void *data, int silent) sbi = kzalloc(sizeof(struct affs_sb_info), GFP_KERNEL); if (!sbi) return -ENOMEM; - sb->s_fs_info = sbi; mutex_init(&sbi->s_bmlock); spin_lock_init(&sbi->symlink_lock); @@ -523,7 +527,7 @@ affs_remount(struct super_block *sb, int *flags, char *data) kfree(new_opts); return -EINVAL; } - + lock_kernel(); replace_mount_options(sb, new_opts); sbi->s_flags = mount_flags; @@ -539,15 +543,17 @@ affs_remount(struct super_block *sb, int *flags, char *data) memcpy(sbi->s_volume, volume, 32); spin_unlock(&sbi->symlink_lock); - if ((*flags & MS_RDONLY) == (sb->s_flags & MS_RDONLY)) + if ((*flags & MS_RDONLY) == (sb->s_flags & MS_RDONLY)) { + unlock_kernel(); return 0; - + } if (*flags & MS_RDONLY) { affs_write_super(sb); affs_free_bitmap(sb); } else res = affs_init_bitmap(sb, flags); + unlock_kernel(); return res; } diff --git a/trunk/fs/afs/flock.c b/trunk/fs/afs/flock.c index 757d664575dd..0931bc1325eb 100644 --- a/trunk/fs/afs/flock.c +++ b/trunk/fs/afs/flock.c @@ -9,6 +9,7 @@ * 2 of the License, or (at your option) any later version. */ +#include #include "internal.h" #define AFS_LOCK_GRANTED 0 @@ -273,7 +274,7 @@ static int afs_do_setlk(struct file *file, struct file_lock *fl) type = (fl->fl_type == F_RDLCK) ? AFS_LOCK_READ : AFS_LOCK_WRITE; - lock_flocks(); + lock_kernel(); /* make sure we've got a callback on this file and that our view of the * data version is up to date */ @@ -420,7 +421,7 @@ static int afs_do_setlk(struct file *file, struct file_lock *fl) afs_vnode_fetch_status(vnode, NULL, key); error: - unlock_flocks(); + unlock_kernel(); _leave(" = %d", ret); return ret; diff --git a/trunk/fs/afs/mntpt.c b/trunk/fs/afs/mntpt.c index 6153417caf57..6d552686c498 100644 --- a/trunk/fs/afs/mntpt.c +++ b/trunk/fs/afs/mntpt.c @@ -29,7 +29,6 @@ static void afs_mntpt_expiry_timed_out(struct work_struct *work); const struct file_operations afs_mntpt_file_operations = { .open = afs_mntpt_open, - .llseek = noop_llseek, }; const struct inode_operations afs_mntpt_inode_operations = { diff --git a/trunk/fs/afs/super.c b/trunk/fs/afs/super.c index eacf76d98ae0..77e1e5a61154 100644 --- a/trunk/fs/afs/super.c +++ b/trunk/fs/afs/super.c @@ -19,6 +19,7 @@ #include #include #include +#include #include #include #include @@ -452,8 +453,12 @@ static void afs_put_super(struct super_block *sb) _enter(""); + lock_kernel(); + afs_put_volume(as->volume); + unlock_kernel(); + _leave(""); } diff --git a/trunk/fs/autofs/Kconfig b/trunk/fs/autofs/Kconfig index 480e210c83ab..5f3bea90911e 100644 --- a/trunk/fs/autofs/Kconfig +++ b/trunk/fs/autofs/Kconfig @@ -1,6 +1,5 @@ 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 diff --git a/trunk/fs/autofs/root.c b/trunk/fs/autofs/root.c index 0c4ca81aeaeb..11b1ea786d00 100644 --- a/trunk/fs/autofs/root.c +++ b/trunk/fs/autofs/root.c @@ -27,9 +27,7 @@ static int autofs_root_unlink(struct inode *,struct dentry *); static int autofs_root_rmdir(struct inode *,struct dentry *); static int autofs_root_mkdir(struct inode *,struct dentry *,int); static long autofs_root_ioctl(struct file *,unsigned int,unsigned long); -#ifdef CONFIG_COMPAT static long autofs_root_compat_ioctl(struct file *,unsigned int,unsigned long); -#endif const struct file_operations autofs_root_operations = { .llseek = generic_file_llseek, diff --git a/trunk/fs/autofs4/dev-ioctl.c b/trunk/fs/autofs4/dev-ioctl.c index eff9a419469a..ba4a38b9c22f 100644 --- a/trunk/fs/autofs4/dev-ioctl.c +++ b/trunk/fs/autofs4/dev-ioctl.c @@ -724,7 +724,6 @@ static const struct file_operations _dev_ioctl_fops = { .unlocked_ioctl = autofs_dev_ioctl, .compat_ioctl = autofs_dev_ioctl_compat, .owner = THIS_MODULE, - .llseek = noop_llseek, }; static struct miscdevice _autofs_dev_ioctl_misc = { diff --git a/trunk/fs/autofs4/root.c b/trunk/fs/autofs4/root.c index d5c1401f0031..cb1bd38dc08c 100644 --- a/trunk/fs/autofs4/root.c +++ b/trunk/fs/autofs4/root.c @@ -19,7 +19,7 @@ #include #include #include -#include +#include #include "autofs_i.h" @@ -28,9 +28,7 @@ static int autofs4_dir_unlink(struct inode *,struct dentry *); static int autofs4_dir_rmdir(struct inode *,struct dentry *); static int autofs4_dir_mkdir(struct inode *,struct dentry *,int); static long autofs4_root_ioctl(struct file *,unsigned int,unsigned long); -#ifdef CONFIG_COMPAT static long autofs4_root_compat_ioctl(struct file *,unsigned int,unsigned long); -#endif static int autofs4_dir_open(struct inode *inode, struct file *file); static struct dentry *autofs4_lookup(struct inode *,struct dentry *, struct nameidata *); static void *autofs4_follow_link(struct dentry *, struct nameidata *); @@ -980,17 +978,15 @@ static int autofs4_root_ioctl_unlocked(struct inode *inode, struct file *filp, } } -static DEFINE_MUTEX(autofs4_ioctl_mutex); - static long autofs4_root_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) { long ret; struct inode *inode = filp->f_dentry->d_inode; - mutex_lock(&autofs4_ioctl_mutex); + lock_kernel(); ret = autofs4_root_ioctl_unlocked(inode, filp, cmd, arg); - mutex_unlock(&autofs4_ioctl_mutex); + unlock_kernel(); return ret; } @@ -1002,13 +998,13 @@ static long autofs4_root_compat_ioctl(struct file *filp, struct inode *inode = filp->f_path.dentry->d_inode; int ret; - mutex_lock(&autofs4_ioctl_mutex); + lock_kernel(); if (cmd == AUTOFS_IOC_READY || cmd == AUTOFS_IOC_FAIL) ret = autofs4_root_ioctl_unlocked(inode, filp, cmd, arg); else ret = autofs4_root_ioctl_unlocked(inode, filp, cmd, (unsigned long)compat_ptr(arg)); - mutex_unlock(&autofs4_ioctl_mutex); + unlock_kernel(); return ret; } diff --git a/trunk/fs/bfs/inode.c b/trunk/fs/bfs/inode.c index 883e77acd5a8..c4daf0f5fc02 100644 --- a/trunk/fs/bfs/inode.c +++ b/trunk/fs/bfs/inode.c @@ -12,6 +12,7 @@ #include #include #include +#include #include #include #include @@ -214,10 +215,14 @@ static void bfs_put_super(struct super_block *s) if (!info) return; + lock_kernel(); + mutex_destroy(&info->bfs_lock); kfree(info->si_imap); kfree(info); s->s_fs_info = NULL; + + unlock_kernel(); } static int bfs_statfs(struct dentry *dentry, struct kstatfs *buf) diff --git a/trunk/fs/binfmt_misc.c b/trunk/fs/binfmt_misc.c index 139fc8083f53..fd0cc0bf9a40 100644 --- a/trunk/fs/binfmt_misc.c +++ b/trunk/fs/binfmt_misc.c @@ -576,7 +576,6 @@ static ssize_t bm_entry_write(struct file *file, const char __user *buffer, static const struct file_operations bm_entry_operations = { .read = bm_entry_read, .write = bm_entry_write, - .llseek = default_llseek, }; /* /register */ @@ -644,7 +643,6 @@ static ssize_t bm_register_write(struct file *file, const char __user *buffer, static const struct file_operations bm_register_operations = { .write = bm_register_write, - .llseek = noop_llseek, }; /* /status */ @@ -682,7 +680,6 @@ static ssize_t bm_status_write(struct file * file, const char __user * buffer, static const struct file_operations bm_status_operations = { .read = bm_status_read, .write = bm_status_write, - .llseek = default_llseek, }; /* Superblock handling */ diff --git a/trunk/fs/btrfs/super.c b/trunk/fs/btrfs/super.c index 144f8a5730f5..1776dbd8dc98 100644 --- a/trunk/fs/btrfs/super.c +++ b/trunk/fs/btrfs/super.c @@ -815,7 +815,6 @@ static const struct file_operations btrfs_ctl_fops = { .unlocked_ioctl = btrfs_control_ioctl, .compat_ioctl = btrfs_control_ioctl, .owner = THIS_MODULE, - .llseek = noop_llseek, }; static struct miscdevice btrfs_misc = { diff --git a/trunk/fs/cachefiles/daemon.c b/trunk/fs/cachefiles/daemon.c index 0a1467b15516..727caedcdd92 100644 --- a/trunk/fs/cachefiles/daemon.c +++ b/trunk/fs/cachefiles/daemon.c @@ -55,7 +55,6 @@ const struct file_operations cachefiles_daemon_fops = { .read = cachefiles_daemon_read, .write = cachefiles_daemon_write, .poll = cachefiles_daemon_poll, - .llseek = noop_llseek, }; struct cachefiles_daemon_cmd { diff --git a/trunk/fs/char_dev.c b/trunk/fs/char_dev.c index e5b9df993b93..143d393881cb 100644 --- a/trunk/fs/char_dev.c +++ b/trunk/fs/char_dev.c @@ -456,7 +456,6 @@ static void cdev_purge(struct cdev *cdev) */ const struct file_operations def_chr_fops = { .open = chrdev_open, - .llseek = noop_llseek, }; static struct kobject *exact_match(dev_t dev, int *part, void *data) diff --git a/trunk/fs/cifs/cifsfs.c b/trunk/fs/cifs/cifsfs.c index 50208c15309a..b7431afdd76d 100644 --- a/trunk/fs/cifs/cifsfs.c +++ b/trunk/fs/cifs/cifsfs.c @@ -35,6 +35,7 @@ #include #include #include +#include #include "cifsfs.h" #include "cifspdu.h" #define DECLARE_GLOBALS_HERE @@ -199,6 +200,8 @@ cifs_put_super(struct super_block *sb) return; } + lock_kernel(); + rc = cifs_umount(sb, cifs_sb); if (rc) cERROR(1, "cifs_umount failed with return code %d", rc); @@ -212,6 +215,8 @@ cifs_put_super(struct super_block *sb) unload_nls(cifs_sb->local_nls); bdi_destroy(&cifs_sb->bdi); kfree(cifs_sb); + + unlock_kernel(); } static int @@ -509,9 +514,7 @@ cifs_get_sb(struct file_system_type *fs_type, int flags, const char *dev_name, void *data, struct vfsmount *mnt) { int rc; - struct super_block *sb; - - sb = sget(fs_type, NULL, set_anon_super, NULL); + struct super_block *sb = sget(fs_type, NULL, set_anon_super, NULL); cFYI(1, "Devname: %s flags: %d ", dev_name, flags); @@ -562,8 +565,8 @@ static loff_t cifs_llseek(struct file *file, loff_t offset, int origin) static int cifs_setlease(struct file *file, long arg, struct file_lock **lease) { - /* note that this is called by vfs setlease with lock_flocks held - to protect *lease from going away */ + /* note that this is called by vfs setlease with the BKL held + although I doubt that BKL is needed here in cifs */ struct inode *inode = file->f_path.dentry->d_inode; if (!(S_ISREG(inode->i_mode))) diff --git a/trunk/fs/coda/inode.c b/trunk/fs/coda/inode.c index bfe8179b1295..6526e6f21ecf 100644 --- a/trunk/fs/coda/inode.c +++ b/trunk/fs/coda/inode.c @@ -148,8 +148,6 @@ static int coda_fill_super(struct super_block *sb, void *data, int silent) int error; int idx; - lock_kernel(); - idx = get_device_index((struct coda_mount_data *) data); /* Ignore errors in data, for backward compatibility */ @@ -161,13 +159,11 @@ static int coda_fill_super(struct super_block *sb, void *data, int silent) vc = &coda_comms[idx]; if (!vc->vc_inuse) { printk("coda_read_super: No pseudo device\n"); - unlock_kernel(); return -EINVAL; } if ( vc->vc_sb ) { printk("coda_read_super: Device already mounted\n"); - unlock_kernel(); return -EBUSY; } @@ -206,8 +202,7 @@ static int coda_fill_super(struct super_block *sb, void *data, int silent) sb->s_root = d_alloc_root(root); if (!sb->s_root) goto error; - unlock_kernel(); - return 0; + return 0; error: bdi_destroy(&vc->bdi); @@ -217,7 +212,6 @@ static int coda_fill_super(struct super_block *sb, void *data, int silent) if (vc) vc->vc_sb = NULL; - unlock_kernel(); return -EINVAL; } diff --git a/trunk/fs/coda/pioctl.c b/trunk/fs/coda/pioctl.c index 028a9a0f588b..ca25d96d45c9 100644 --- a/trunk/fs/coda/pioctl.c +++ b/trunk/fs/coda/pioctl.c @@ -39,7 +39,6 @@ const struct inode_operations coda_ioctl_inode_operations = { const struct file_operations coda_ioctl_operations = { .owner = THIS_MODULE, .unlocked_ioctl = coda_pioctl, - .llseek = noop_llseek, }; /* the coda pioctl inode ops */ diff --git a/trunk/fs/coda/psdev.c b/trunk/fs/coda/psdev.c index fdc2f3ef7ecd..116af7546cf0 100644 --- a/trunk/fs/coda/psdev.c +++ b/trunk/fs/coda/psdev.c @@ -346,7 +346,6 @@ static const struct file_operations coda_psdev_fops = { .unlocked_ioctl = coda_psdev_ioctl, .open = coda_psdev_open, .release = coda_psdev_release, - .llseek = noop_llseek, }; static int init_coda_psdev(void) diff --git a/trunk/fs/compat_ioctl.c b/trunk/fs/compat_ioctl.c index d0ad09d57789..03e59aa318eb 100644 --- a/trunk/fs/compat_ioctl.c +++ b/trunk/fs/compat_ioctl.c @@ -599,6 +599,69 @@ 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; @@ -1199,6 +1262,9 @@ 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 */ @@ -1457,6 +1523,10 @@ 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) diff --git a/trunk/fs/debugfs/file.c b/trunk/fs/debugfs/file.c index 89d394d8fe24..0210898458b2 100644 --- a/trunk/fs/debugfs/file.c +++ b/trunk/fs/debugfs/file.c @@ -43,7 +43,6 @@ const struct file_operations debugfs_file_operations = { .read = default_read_file, .write = default_write_file, .open = default_open, - .llseek = noop_llseek, }; static void *debugfs_follow_link(struct dentry *dentry, struct nameidata *nd) @@ -455,7 +454,6 @@ static const struct file_operations fops_bool = { .read = read_file_bool, .write = write_file_bool, .open = default_open, - .llseek = default_llseek, }; /** @@ -500,7 +498,6 @@ static ssize_t read_file_blob(struct file *file, char __user *user_buf, static const struct file_operations fops_blob = { .read = read_file_blob, .open = default_open, - .llseek = default_llseek, }; /** diff --git a/trunk/fs/dlm/debug_fs.c b/trunk/fs/dlm/debug_fs.c index 6b42ba807dfd..c6cf25158746 100644 --- a/trunk/fs/dlm/debug_fs.c +++ b/trunk/fs/dlm/debug_fs.c @@ -643,8 +643,7 @@ static ssize_t waiters_read(struct file *file, char __user *userbuf, static const struct file_operations waiters_fops = { .owner = THIS_MODULE, .open = waiters_open, - .read = waiters_read, - .llseek = default_llseek, + .read = waiters_read }; void dlm_delete_debug_file(struct dlm_ls *ls) diff --git a/trunk/fs/dlm/plock.c b/trunk/fs/dlm/plock.c index 30d8b85febbf..d45c02db6943 100644 --- a/trunk/fs/dlm/plock.c +++ b/trunk/fs/dlm/plock.c @@ -412,8 +412,7 @@ static const struct file_operations dev_fops = { .read = dev_read, .write = dev_write, .poll = dev_poll, - .owner = THIS_MODULE, - .llseek = noop_llseek, + .owner = THIS_MODULE }; static struct miscdevice plock_dev_misc = { diff --git a/trunk/fs/dlm/user.c b/trunk/fs/dlm/user.c index 66d6c16bf440..b6272853130c 100644 --- a/trunk/fs/dlm/user.c +++ b/trunk/fs/dlm/user.c @@ -1009,7 +1009,6 @@ static const struct file_operations device_fops = { .write = device_write, .poll = device_poll, .owner = THIS_MODULE, - .llseek = noop_llseek, }; static const struct file_operations ctl_device_fops = { @@ -1018,7 +1017,6 @@ static const struct file_operations ctl_device_fops = { .read = device_read, .write = device_write, .owner = THIS_MODULE, - .llseek = noop_llseek, }; static struct miscdevice ctl_device = { @@ -1031,7 +1029,6 @@ static const struct file_operations monitor_device_fops = { .open = monitor_device_open, .release = monitor_device_close, .owner = THIS_MODULE, - .llseek = noop_llseek, }; static struct miscdevice monitor_device = { diff --git a/trunk/fs/ecryptfs/file.c b/trunk/fs/ecryptfs/file.c index 91da02987bff..622c95140802 100644 --- a/trunk/fs/ecryptfs/file.c +++ b/trunk/fs/ecryptfs/file.c @@ -31,6 +31,7 @@ #include #include #include +#include #include "ecryptfs_kernel.h" /** @@ -283,9 +284,11 @@ static int ecryptfs_fasync(int fd, struct file *file, int flag) int rc = 0; struct file *lower_file = NULL; + lock_kernel(); lower_file = ecryptfs_file_to_lower(file); if (lower_file->f_op && lower_file->f_op->fasync) rc = lower_file->f_op->fasync(fd, lower_file, flag); + unlock_kernel(); return rc; } @@ -329,7 +332,6 @@ const struct file_operations ecryptfs_dir_fops = { .fsync = ecryptfs_fsync, .fasync = ecryptfs_fasync, .splice_read = generic_file_splice_read, - .llseek = default_llseek, }; const struct file_operations ecryptfs_main_fops = { diff --git a/trunk/fs/ecryptfs/miscdev.c b/trunk/fs/ecryptfs/miscdev.c index 940a82e63dc3..00208c3d7e92 100644 --- a/trunk/fs/ecryptfs/miscdev.c +++ b/trunk/fs/ecryptfs/miscdev.c @@ -482,7 +482,6 @@ static const struct file_operations ecryptfs_miscdev_fops = { .read = ecryptfs_miscdev_read, .write = ecryptfs_miscdev_write, .release = ecryptfs_miscdev_release, - .llseek = noop_llseek, }; static struct miscdevice ecryptfs_miscdev = { diff --git a/trunk/fs/eventfd.c b/trunk/fs/eventfd.c index e0194b3e14d6..6bd3f76fdf88 100644 --- a/trunk/fs/eventfd.c +++ b/trunk/fs/eventfd.c @@ -293,7 +293,6 @@ static const struct file_operations eventfd_fops = { .poll = eventfd_poll, .read = eventfd_read, .write = eventfd_write, - .llseek = noop_llseek, }; /** diff --git a/trunk/fs/eventpoll.c b/trunk/fs/eventpoll.c index 256bb7bb102a..3817149919cb 100644 --- a/trunk/fs/eventpoll.c +++ b/trunk/fs/eventpoll.c @@ -674,8 +674,7 @@ static unsigned int ep_eventpoll_poll(struct file *file, poll_table *wait) /* File callbacks that implement the eventpoll file behaviour */ static const struct file_operations eventpoll_fops = { .release = ep_eventpoll_release, - .poll = ep_eventpoll_poll, - .llseek = noop_llseek, + .poll = ep_eventpoll_poll }; /* Fast test to see if the file is an evenpoll file */ diff --git a/trunk/fs/ext2/super.c b/trunk/fs/ext2/super.c index 85df87d0f7b7..1ec602673ea8 100644 --- a/trunk/fs/ext2/super.c +++ b/trunk/fs/ext2/super.c @@ -747,16 +747,15 @@ static int ext2_fill_super(struct super_block *sb, void *data, int silent) __le32 features; int err; - err = -ENOMEM; sbi = kzalloc(sizeof(*sbi), GFP_KERNEL); if (!sbi) - goto failed_unlock; + return -ENOMEM; sbi->s_blockgroup_lock = kzalloc(sizeof(struct blockgroup_lock), GFP_KERNEL); if (!sbi->s_blockgroup_lock) { kfree(sbi); - goto failed_unlock; + return -ENOMEM; } sb->s_fs_info = sbi; sbi->s_sb_block = sb_block; @@ -1108,7 +1107,6 @@ static int ext2_fill_super(struct super_block *sb, void *data, int silent) sb->s_fs_info = NULL; kfree(sbi->s_blockgroup_lock); kfree(sbi); -failed_unlock: return ret; } diff --git a/trunk/fs/ext3/super.c b/trunk/fs/ext3/super.c index 377768009106..a367dd044280 100644 --- a/trunk/fs/ext3/super.c +++ b/trunk/fs/ext3/super.c @@ -411,6 +411,9 @@ static void ext3_put_super (struct super_block * sb) int i, err; dquot_disable(sb, -1, DQUOT_USAGE_ENABLED | DQUOT_LIMITS_ENABLED); + + lock_kernel(); + ext3_xattr_put_super(sb); err = journal_destroy(sbi->s_journal); sbi->s_journal = NULL; @@ -459,6 +462,8 @@ static void ext3_put_super (struct super_block * sb) sb->s_fs_info = NULL; kfree(sbi->s_blockgroup_lock); kfree(sbi); + + unlock_kernel(); } static struct kmem_cache *ext3_inode_cachep; @@ -1622,6 +1627,8 @@ static int ext3_fill_super (struct super_block *sb, void *data, int silent) sbi->s_resgid = EXT3_DEF_RESGID; sbi->s_sb_block = sb_block; + unlock_kernel(); + blocksize = sb_min_blocksize(sb, EXT3_MIN_BLOCK_SIZE); if (!blocksize) { ext3_msg(sb, KERN_ERR, "error: unable to set blocksize"); @@ -2018,6 +2025,7 @@ static int ext3_fill_super (struct super_block *sb, void *data, int silent) test_opt(sb,DATA_FLAGS) == EXT3_MOUNT_ORDERED_DATA ? "ordered": "writeback"); + lock_kernel(); return 0; cantfind_ext3: @@ -2047,6 +2055,7 @@ static int ext3_fill_super (struct super_block *sb, void *data, int silent) sb->s_fs_info = NULL; kfree(sbi->s_blockgroup_lock); kfree(sbi); + lock_kernel(); return ret; } @@ -2529,6 +2538,8 @@ static int ext3_remount (struct super_block * sb, int * flags, char * data) int i; #endif + lock_kernel(); + /* Store the original options */ lock_super(sb); old_sb_flags = sb->s_flags; @@ -2637,6 +2648,7 @@ static int ext3_remount (struct super_block * sb, int * flags, char * data) kfree(old_opts.s_qf_names[i]); #endif unlock_super(sb); + unlock_kernel(); if (enable_quota) dquot_resume(sb, -1); @@ -2657,6 +2669,7 @@ static int ext3_remount (struct super_block * sb, int * flags, char * data) } #endif unlock_super(sb); + unlock_kernel(); return err; } diff --git a/trunk/fs/ext4/super.c b/trunk/fs/ext4/super.c index 8ecc1e590303..7f47c366bf15 100644 --- a/trunk/fs/ext4/super.c +++ b/trunk/fs/ext4/super.c @@ -26,6 +26,7 @@ #include #include #include +#include #include #include #include @@ -707,6 +708,7 @@ static void ext4_put_super(struct super_block *sb) destroy_workqueue(sbi->dio_unwritten_wq); lock_super(sb); + lock_kernel(); if (sb->s_dirt) ext4_commit_super(sb, 1); @@ -773,6 +775,7 @@ static void ext4_put_super(struct super_block *sb) * Now that we are completely done shutting down the * superblock, we need to actually destroy the kobject. */ + unlock_kernel(); unlock_super(sb); kobject_put(&sbi->s_kobj); wait_for_completion(&sbi->s_kobj_unregister); @@ -2585,6 +2588,8 @@ static int ext4_fill_super(struct super_block *sb, void *data, int silent) sbi->s_sectors_written_start = part_stat_read(sb->s_bdev->bd_part, sectors[1]); + unlock_kernel(); + /* Cleanup superblock name */ for (cp = sb->s_id; (cp = strchr(cp, '/'));) *cp = '!'; @@ -3159,6 +3164,7 @@ static int ext4_fill_super(struct super_block *sb, void *data, int silent) if (es->s_error_count) mod_timer(&sbi->s_err_report, jiffies + 300*HZ); /* 5 minutes */ + lock_kernel(); kfree(orig_data); return 0; @@ -3205,6 +3211,7 @@ static int ext4_fill_super(struct super_block *sb, void *data, int silent) sb->s_fs_info = NULL; kfree(sbi->s_blockgroup_lock); kfree(sbi); + lock_kernel(); out_free_orig: kfree(orig_data); return ret; @@ -3713,6 +3720,8 @@ static int ext4_remount(struct super_block *sb, int *flags, char *data) #endif char *orig_data = kstrdup(data, GFP_KERNEL); + lock_kernel(); + /* Store the original options */ lock_super(sb); old_sb_flags = sb->s_flags; @@ -3847,6 +3856,7 @@ static int ext4_remount(struct super_block *sb, int *flags, char *data) kfree(old_opts.s_qf_names[i]); #endif unlock_super(sb); + unlock_kernel(); if (enable_quota) dquot_resume(sb, -1); @@ -3872,6 +3882,7 @@ static int ext4_remount(struct super_block *sb, int *flags, char *data) } #endif unlock_super(sb); + unlock_kernel(); kfree(orig_data); return err; } diff --git a/trunk/fs/fat/inode.c b/trunk/fs/fat/inode.c index ad6998a92c30..830058057d33 100644 --- a/trunk/fs/fat/inode.c +++ b/trunk/fs/fat/inode.c @@ -14,6 +14,7 @@ #include #include #include +#include #include #include #include @@ -488,6 +489,8 @@ static void fat_put_super(struct super_block *sb) { struct msdos_sb_info *sbi = MSDOS_SB(sb); + lock_kernel(); + if (sb->s_dirt) fat_write_super(sb); @@ -501,6 +504,8 @@ static void fat_put_super(struct super_block *sb) sb->s_fs_info = NULL; kfree(sbi); + + unlock_kernel(); } static struct kmem_cache *fat_inode_cachep; diff --git a/trunk/fs/fat/namei_msdos.c b/trunk/fs/fat/namei_msdos.c index bbca5c186ae7..bbc94ae4fd77 100644 --- a/trunk/fs/fat/namei_msdos.c +++ b/trunk/fs/fat/namei_msdos.c @@ -662,16 +662,12 @@ static int msdos_fill_super(struct super_block *sb, void *data, int silent) { int res; - lock_super(sb); res = fat_fill_super(sb, data, silent, &msdos_dir_inode_operations, 0); - if (res) { - unlock_super(sb); + if (res) return res; - } sb->s_flags |= MS_NOATIME; sb->s_root->d_op = &msdos_dentry_operations; - unlock_super(sb); return 0; } diff --git a/trunk/fs/fat/namei_vfat.c b/trunk/fs/fat/namei_vfat.c index 6f0f6c9a0152..6fcc7e71fbaa 100644 --- a/trunk/fs/fat/namei_vfat.c +++ b/trunk/fs/fat/namei_vfat.c @@ -1055,19 +1055,15 @@ static int vfat_fill_super(struct super_block *sb, void *data, int silent) { int res; - lock_super(sb); res = fat_fill_super(sb, data, silent, &vfat_dir_inode_operations, 1); - if (res) { - unlock_super(sb); + if (res) return res; - } if (MSDOS_SB(sb)->options.name_check != 's') sb->s_root->d_op = &vfat_ci_dentry_ops; else sb->s_root->d_op = &vfat_dentry_ops; - unlock_super(sb); return 0; } diff --git a/trunk/fs/fifo.c b/trunk/fs/fifo.c index 4e303c22d5ee..5d6606ffc2d2 100644 --- a/trunk/fs/fifo.c +++ b/trunk/fs/fifo.c @@ -151,5 +151,4 @@ static int fifo_open(struct inode *inode, struct file *filp) */ const struct file_operations def_fifo_fops = { .open = fifo_open, /* will set read_ or write_pipefifo_fops */ - .llseek = noop_llseek, }; diff --git a/trunk/fs/freevxfs/vxfs_lookup.c b/trunk/fs/freevxfs/vxfs_lookup.c index 6c5131d592f0..0ec7bb2c95c6 100644 --- a/trunk/fs/freevxfs/vxfs_lookup.c +++ b/trunk/fs/freevxfs/vxfs_lookup.c @@ -36,6 +36,7 @@ #include #include #include +#include #include "vxfs.h" #include "vxfs_dir.h" @@ -211,12 +212,16 @@ vxfs_lookup(struct inode *dip, struct dentry *dp, struct nameidata *nd) if (dp->d_name.len > VXFS_NAMELEN) return ERR_PTR(-ENAMETOOLONG); + lock_kernel(); ino = vxfs_inode_by_name(dip, dp); if (ino) { ip = vxfs_iget(dip->i_sb, ino); - if (IS_ERR(ip)) + if (IS_ERR(ip)) { + unlock_kernel(); return ERR_CAST(ip); + } } + unlock_kernel(); d_add(dp, ip); return NULL; } @@ -243,6 +248,8 @@ vxfs_readdir(struct file *fp, void *retp, filldir_t filler) u_long page, npages, block, pblocks, nblocks, offset; loff_t pos; + lock_kernel(); + switch ((long)fp->f_pos) { case 0: if (filler(retp, ".", 1, fp->f_pos, ip->i_ino, DT_DIR) < 0) @@ -258,8 +265,10 @@ vxfs_readdir(struct file *fp, void *retp, filldir_t filler) pos = fp->f_pos - 2; - if (pos > VXFS_DIRROUND(ip->i_size)) + if (pos > VXFS_DIRROUND(ip->i_size)) { + unlock_kernel(); return 0; + } npages = dir_pages(ip); nblocks = dir_blocks(ip); @@ -318,5 +327,6 @@ vxfs_readdir(struct file *fp, void *retp, filldir_t filler) done: fp->f_pos = ((page << PAGE_CACHE_SHIFT) | offset) + 2; out: + unlock_kernel(); return 0; } diff --git a/trunk/fs/freevxfs/vxfs_super.c b/trunk/fs/freevxfs/vxfs_super.c index 71b0148b8784..dc0c041e85cb 100644 --- a/trunk/fs/freevxfs/vxfs_super.c +++ b/trunk/fs/freevxfs/vxfs_super.c @@ -38,6 +38,7 @@ #include #include #include +#include #include #include #include @@ -80,12 +81,16 @@ vxfs_put_super(struct super_block *sbp) { struct vxfs_sb_info *infp = VXFS_SBI(sbp); + lock_kernel(); + vxfs_put_fake_inode(infp->vsi_fship); vxfs_put_fake_inode(infp->vsi_ilist); vxfs_put_fake_inode(infp->vsi_stilist); brelse(infp->vsi_bp); kfree(infp); + + unlock_kernel(); } /** @@ -143,7 +148,7 @@ static int vxfs_remount(struct super_block *sb, int *flags, char *data) * The superblock on success, else %NULL. * * Locking: - * We are under @sbp->s_lock. + * We are under the bkl and @sbp->s_lock. */ static int vxfs_fill_super(struct super_block *sbp, void *dp, int silent) { diff --git a/trunk/fs/fuse/control.c b/trunk/fs/fuse/control.c index 7367e177186f..3773fd63d2f9 100644 --- a/trunk/fs/fuse/control.c +++ b/trunk/fs/fuse/control.c @@ -179,27 +179,23 @@ static ssize_t fuse_conn_congestion_threshold_write(struct file *file, static const struct file_operations fuse_ctl_abort_ops = { .open = nonseekable_open, .write = fuse_conn_abort_write, - .llseek = no_llseek, }; static const struct file_operations fuse_ctl_waiting_ops = { .open = nonseekable_open, .read = fuse_conn_waiting_read, - .llseek = no_llseek, }; static const struct file_operations fuse_conn_max_background_ops = { .open = nonseekable_open, .read = fuse_conn_max_background_read, .write = fuse_conn_max_background_write, - .llseek = no_llseek, }; static const struct file_operations fuse_conn_congestion_threshold_ops = { .open = nonseekable_open, .read = fuse_conn_congestion_threshold_read, .write = fuse_conn_congestion_threshold_write, - .llseek = no_llseek, }; static struct dentry *fuse_ctl_add_dentry(struct dentry *parent, diff --git a/trunk/fs/fuse/cuse.c b/trunk/fs/fuse/cuse.c index 3e87cce5837d..e1f8171278bd 100644 --- a/trunk/fs/fuse/cuse.c +++ b/trunk/fs/fuse/cuse.c @@ -182,7 +182,6 @@ static const struct file_operations cuse_frontend_fops = { .unlocked_ioctl = cuse_file_ioctl, .compat_ioctl = cuse_file_compat_ioctl, .poll = fuse_file_poll, - .llseek = noop_llseek, }; diff --git a/trunk/fs/gfs2/file.c b/trunk/fs/gfs2/file.c index aa996471ec5c..237ee6a940df 100644 --- a/trunk/fs/gfs2/file.c +++ b/trunk/fs/gfs2/file.c @@ -622,8 +622,6 @@ static ssize_t gfs2_file_aio_write(struct kiocb *iocb, const struct iovec *iov, * cluster; until we do, disable leases (by just returning -EINVAL), * unless the administrator has requested purely local locking. * - * Locking: called under lock_flocks - * * Returns: errno */ @@ -775,7 +773,6 @@ const struct file_operations gfs2_dir_fops = { .fsync = gfs2_fsync, .lock = gfs2_lock, .flock = gfs2_flock, - .llseek = default_llseek, }; #endif /* CONFIG_GFS2_FS_LOCKING_DLM */ @@ -802,6 +799,5 @@ const struct file_operations gfs2_dir_fops_nolock = { .open = gfs2_open, .release = gfs2_close, .fsync = gfs2_fsync, - .llseek = default_llseek, }; diff --git a/trunk/fs/hfs/super.c b/trunk/fs/hfs/super.c index 33254160f650..34235d4bf08b 100644 --- a/trunk/fs/hfs/super.c +++ b/trunk/fs/hfs/super.c @@ -20,6 +20,7 @@ #include #include #include +#include #include #include "hfs_fs.h" @@ -78,11 +79,15 @@ static int hfs_sync_fs(struct super_block *sb, int wait) */ static void hfs_put_super(struct super_block *sb) { + lock_kernel(); + if (sb->s_dirt) hfs_write_super(sb); hfs_mdb_close(sb); /* release the MDB's resources */ hfs_mdb_put(sb); + + unlock_kernel(); } /* @@ -380,7 +385,6 @@ static int hfs_fill_super(struct super_block *sb, void *data, int silent) sbi = kzalloc(sizeof(struct hfs_sb_info), GFP_KERNEL); if (!sbi) return -ENOMEM; - sb->s_fs_info = sbi; INIT_HLIST_HEAD(&sbi->rsrc_inodes); diff --git a/trunk/fs/hpfs/Kconfig b/trunk/fs/hpfs/Kconfig index 63b6f5632318..56bd15c5bf6c 100644 --- a/trunk/fs/hpfs/Kconfig +++ b/trunk/fs/hpfs/Kconfig @@ -1,7 +1,6 @@ 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 diff --git a/trunk/fs/hpfs/super.c b/trunk/fs/hpfs/super.c index c969a1aa163a..2607010be2fe 100644 --- a/trunk/fs/hpfs/super.c +++ b/trunk/fs/hpfs/super.c @@ -477,15 +477,11 @@ static int hpfs_fill_super(struct super_block *s, void *options, int silent) int o; - lock_kernel(); - save_mount_options(s, options); sbi = kzalloc(sizeof(*sbi), GFP_KERNEL); - if (!sbi) { - unlock_kernel(); + if (!sbi) return -ENOMEM; - } s->s_fs_info = sbi; sbi->sb_bmp_dir = NULL; @@ -670,7 +666,6 @@ static int hpfs_fill_super(struct super_block *s, void *options, int silent) root->i_blocks = 5; hpfs_brelse4(&qbh); } - unlock_kernel(); return 0; bail4: brelse(bh2); @@ -682,7 +677,6 @@ bail2: brelse(bh0); kfree(sbi->sb_cp_table); s->s_fs_info = NULL; kfree(sbi); - unlock_kernel(); return -EINVAL; } diff --git a/trunk/fs/hppfs/hppfs.c b/trunk/fs/hppfs/hppfs.c index 4e2a45ea6140..7b027720d820 100644 --- a/trunk/fs/hppfs/hppfs.c +++ b/trunk/fs/hppfs/hppfs.c @@ -598,7 +598,6 @@ static const struct file_operations hppfs_dir_fops = { .readdir = hppfs_readdir, .open = hppfs_dir_open, .fsync = hppfs_fsync, - .llseek = default_llseek, }; static int hppfs_statfs(struct dentry *dentry, struct kstatfs *sf) diff --git a/trunk/fs/hugetlbfs/inode.c b/trunk/fs/hugetlbfs/inode.c index 113eba3d3c38..6e5bd42f3860 100644 --- a/trunk/fs/hugetlbfs/inode.c +++ b/trunk/fs/hugetlbfs/inode.c @@ -674,7 +674,6 @@ const struct file_operations hugetlbfs_file_operations = { .mmap = hugetlbfs_file_mmap, .fsync = noop_fsync, .get_unmapped_area = hugetlb_get_unmapped_area, - .llseek = default_llseek, }; static const struct inode_operations hugetlbfs_dir_inode_operations = { diff --git a/trunk/fs/isofs/dir.c b/trunk/fs/isofs/dir.c index 0542b6eedf80..e0aca9a0ac68 100644 --- a/trunk/fs/isofs/dir.c +++ b/trunk/fs/isofs/dir.c @@ -10,6 +10,7 @@ * * isofs directory handling functions */ +#include #include #include "isofs.h" @@ -254,19 +255,18 @@ static int isofs_readdir(struct file *filp, char *tmpname; struct iso_directory_record *tmpde; struct inode *inode = filp->f_path.dentry->d_inode; - struct isofs_sb_info *sbi = ISOFS_SB(inode->i_sb); tmpname = (char *)__get_free_page(GFP_KERNEL); if (tmpname == NULL) return -ENOMEM; - mutex_lock(&sbi->s_mutex); + lock_kernel(); tmpde = (struct iso_directory_record *) (tmpname+1024); result = do_isofs_readdir(inode, filp, dirent, filldir, tmpname, tmpde); free_page((unsigned long) tmpname); - mutex_unlock(&sbi->s_mutex); + unlock_kernel(); return result; } diff --git a/trunk/fs/isofs/inode.c b/trunk/fs/isofs/inode.c index 09ff41a752a0..5a44811b5027 100644 --- a/trunk/fs/isofs/inode.c +++ b/trunk/fs/isofs/inode.c @@ -17,6 +17,7 @@ #include #include #include +#include #include #include #include @@ -43,7 +44,11 @@ static void isofs_put_super(struct super_block *sb) struct isofs_sb_info *sbi = ISOFS_SB(sb); #ifdef CONFIG_JOLIET + lock_kernel(); + unload_nls(sbi->s_nls_iocharset); + + unlock_kernel(); #endif kfree(sbi); @@ -818,7 +823,6 @@ static int isofs_fill_super(struct super_block *s, void *data, int silent) sbi->s_utf8 = opt.utf8; sbi->s_nocompress = opt.nocompress; sbi->s_overriderockperm = opt.overriderockperm; - mutex_init(&sbi->s_mutex); /* * It would be incredibly stupid to allow people to mark every file * on the disk as suid, so we merely allow them to set the default @@ -973,6 +977,8 @@ int isofs_get_blocks(struct inode *inode, sector_t iblock_s, int section, rv, error; struct iso_inode_info *ei = ISOFS_I(inode); + lock_kernel(); + error = -EIO; rv = 0; if (iblock < 0 || iblock != iblock_s) { @@ -1048,6 +1054,7 @@ int isofs_get_blocks(struct inode *inode, sector_t iblock_s, error = 0; abort: + unlock_kernel(); return rv != 0 ? rv : error; } diff --git a/trunk/fs/isofs/isofs.h b/trunk/fs/isofs/isofs.h index 2882dc089f87..7d33de84f52a 100644 --- a/trunk/fs/isofs/isofs.h +++ b/trunk/fs/isofs/isofs.h @@ -55,7 +55,6 @@ struct isofs_sb_info { gid_t s_gid; uid_t s_uid; struct nls_table *s_nls_iocharset; /* Native language support table */ - struct mutex s_mutex; /* replaces BKL, please remove if possible */ }; #define ISOFS_INVALID_MODE ((mode_t) -1) diff --git a/trunk/fs/isofs/namei.c b/trunk/fs/isofs/namei.c index 0d23abfd4280..ab438beb867c 100644 --- a/trunk/fs/isofs/namei.c +++ b/trunk/fs/isofs/namei.c @@ -6,6 +6,7 @@ * (C) 1991 Linus Torvalds - minix filesystem */ +#include #include #include "isofs.h" @@ -167,7 +168,6 @@ struct dentry *isofs_lookup(struct inode *dir, struct dentry *dentry, struct nam int found; unsigned long uninitialized_var(block); unsigned long uninitialized_var(offset); - struct isofs_sb_info *sbi = ISOFS_SB(dir->i_sb); struct inode *inode; struct page *page; @@ -177,7 +177,7 @@ struct dentry *isofs_lookup(struct inode *dir, struct dentry *dentry, struct nam if (!page) return ERR_PTR(-ENOMEM); - mutex_lock(&sbi->s_mutex); + lock_kernel(); found = isofs_find_entry(dir, dentry, &block, &offset, page_address(page), @@ -188,10 +188,10 @@ struct dentry *isofs_lookup(struct inode *dir, struct dentry *dentry, struct nam if (found) { inode = isofs_iget(dir->i_sb, block, offset); if (IS_ERR(inode)) { - mutex_unlock(&sbi->s_mutex); + unlock_kernel(); return ERR_CAST(inode); } } - mutex_unlock(&sbi->s_mutex); + unlock_kernel(); return d_splice_alias(inode, dentry); } diff --git a/trunk/fs/isofs/rock.c b/trunk/fs/isofs/rock.c index f9cd04db6eab..96a685c550fd 100644 --- a/trunk/fs/isofs/rock.c +++ b/trunk/fs/isofs/rock.c @@ -8,6 +8,7 @@ #include #include +#include #include "isofs.h" #include "rock.h" @@ -660,7 +661,6 @@ static int rock_ridge_symlink_readpage(struct file *file, struct page *page) { struct inode *inode = page->mapping->host; struct iso_inode_info *ei = ISOFS_I(inode); - struct isofs_sb_info *sbi = ISOFS_SB(inode->i_sb); char *link = kmap(page); unsigned long bufsize = ISOFS_BUFFER_SIZE(inode); struct buffer_head *bh; @@ -673,12 +673,12 @@ static int rock_ridge_symlink_readpage(struct file *file, struct page *page) struct rock_state rs; int ret; - if (!sbi->s_rock) + if (!ISOFS_SB(inode->i_sb)->s_rock) goto error; init_rock_state(&rs, inode); block = ei->i_iget5_block; - mutex_lock(&sbi->s_mutex); + lock_kernel(); bh = sb_bread(inode->i_sb, block); if (!bh) goto out_noread; @@ -748,7 +748,7 @@ static int rock_ridge_symlink_readpage(struct file *file, struct page *page) goto fail; brelse(bh); *rpnt = '\0'; - mutex_unlock(&sbi->s_mutex); + unlock_kernel(); SetPageUptodate(page); kunmap(page); unlock_page(page); @@ -765,7 +765,7 @@ static int rock_ridge_symlink_readpage(struct file *file, struct page *page) printk("symlink spans iso9660 blocks\n"); fail: brelse(bh); - mutex_unlock(&sbi->s_mutex); + unlock_kernel(); error: SetPageError(page); kunmap(page); diff --git a/trunk/fs/jffs2/fs.c b/trunk/fs/jffs2/fs.c index d9beb06e6fca..6b2964a19850 100644 --- a/trunk/fs/jffs2/fs.c +++ b/trunk/fs/jffs2/fs.c @@ -21,6 +21,7 @@ #include #include #include +#include #include "nodelist.h" static int jffs2_flash_setup(struct jffs2_sb_info *c); @@ -390,6 +391,7 @@ int jffs2_remount_fs (struct super_block *sb, int *flags, char *data) This also catches the case where it was stopped and this is just a remount to restart it. Flush the writebuffer, if neccecary, else we loose it */ + lock_kernel(); if (!(sb->s_flags & MS_RDONLY)) { jffs2_stop_garbage_collect_thread(c); mutex_lock(&c->alloc_sem); @@ -401,6 +403,8 @@ int jffs2_remount_fs (struct super_block *sb, int *flags, char *data) jffs2_start_garbage_collect_thread(c); *flags |= MS_NOATIME; + + unlock_kernel(); return 0; } diff --git a/trunk/fs/jffs2/super.c b/trunk/fs/jffs2/super.c index d1ae5dfc22b9..662bba099501 100644 --- a/trunk/fs/jffs2/super.c +++ b/trunk/fs/jffs2/super.c @@ -12,6 +12,7 @@ #include #include #include +#include #include #include #include @@ -145,7 +146,6 @@ static const struct super_operations jffs2_super_operations = static int jffs2_fill_super(struct super_block *sb, void *data, int silent) { struct jffs2_sb_info *c; - int ret; D1(printk(KERN_DEBUG "jffs2_get_sb_mtd():" " New superblock for device %d (\"%s\")\n", @@ -175,8 +175,7 @@ static int jffs2_fill_super(struct super_block *sb, void *data, int silent) #ifdef CONFIG_JFFS2_FS_POSIX_ACL sb->s_flags |= MS_POSIXACL; #endif - ret = jffs2_do_fill_super(sb, data, silent); - return ret; + return jffs2_do_fill_super(sb, data, silent); } static int jffs2_get_sb(struct file_system_type *fs_type, @@ -193,6 +192,8 @@ static void jffs2_put_super (struct super_block *sb) D2(printk(KERN_DEBUG "jffs2: jffs2_put_super()\n")); + lock_kernel(); + if (sb->s_dirt) jffs2_write_super(sb); @@ -214,6 +215,8 @@ static void jffs2_put_super (struct super_block *sb) if (c->mtd->sync) c->mtd->sync(c->mtd); + unlock_kernel(); + D1(printk(KERN_DEBUG "jffs2_put_super returning\n")); } diff --git a/trunk/fs/jfs/super.c b/trunk/fs/jfs/super.c index 68eee2bf629e..ec8c3e4baca3 100644 --- a/trunk/fs/jfs/super.c +++ b/trunk/fs/jfs/super.c @@ -33,6 +33,7 @@ #include #include #include +#include #include "jfs_incore.h" #include "jfs_filsys.h" @@ -175,6 +176,8 @@ static void jfs_put_super(struct super_block *sb) dquot_disable(sb, -1, DQUOT_USAGE_ENABLED | DQUOT_LIMITS_ENABLED); + lock_kernel(); + rc = jfs_umount(sb); if (rc) jfs_err("jfs_umount failed with return code %d", rc); @@ -185,6 +188,8 @@ static void jfs_put_super(struct super_block *sb) iput(sbi->direct_inode); kfree(sbi); + + unlock_kernel(); } enum { @@ -364,16 +369,19 @@ static int jfs_remount(struct super_block *sb, int *flags, char *data) if (!parse_options(data, sb, &newLVSize, &flag)) { return -EINVAL; } - + lock_kernel(); if (newLVSize) { if (sb->s_flags & MS_RDONLY) { printk(KERN_ERR "JFS: resize requires volume to be mounted read-write\n"); + unlock_kernel(); return -EROFS; } rc = jfs_extendfs(sb, newLVSize, 0); - if (rc) + if (rc) { + unlock_kernel(); return rc; + } } if ((sb->s_flags & MS_RDONLY) && !(*flags & MS_RDONLY)) { @@ -389,30 +397,36 @@ static int jfs_remount(struct super_block *sb, int *flags, char *data) /* mark the fs r/w for quota activity */ sb->s_flags &= ~MS_RDONLY; + unlock_kernel(); dquot_resume(sb, -1); return ret; } if ((!(sb->s_flags & MS_RDONLY)) && (*flags & MS_RDONLY)) { rc = dquot_suspend(sb, -1); if (rc < 0) { + unlock_kernel(); return rc; } rc = jfs_umount_rw(sb); JFS_SBI(sb)->flag = flag; + unlock_kernel(); return rc; } if ((JFS_SBI(sb)->flag & JFS_NOINTEGRITY) != (flag & JFS_NOINTEGRITY)) if (!(sb->s_flags & MS_RDONLY)) { rc = jfs_umount_rw(sb); - if (rc) + if (rc) { + unlock_kernel(); return rc; - + } JFS_SBI(sb)->flag = flag; ret = jfs_mount_rw(sb, 1); + unlock_kernel(); return ret; } JFS_SBI(sb)->flag = flag; + unlock_kernel(); return 0; } @@ -432,7 +446,6 @@ static int jfs_fill_super(struct super_block *sb, void *data, int silent) sbi = kzalloc(sizeof (struct jfs_sb_info), GFP_KERNEL); if (!sbi) return -ENOMEM; - sb->s_fs_info = sbi; sbi->sb = sb; sbi->uid = sbi->gid = sbi->umask = -1; diff --git a/trunk/fs/locks.c b/trunk/fs/locks.c index 8b2b6ad56a09..ab24d49fc048 100644 --- a/trunk/fs/locks.c +++ b/trunk/fs/locks.c @@ -143,22 +143,6 @@ int lease_break_time = 45; static LIST_HEAD(file_lock_list); static LIST_HEAD(blocked_list); -/* - * Protects the two list heads above, plus the inode->i_flock list - * FIXME: should use a spinlock, once lockd and ceph are ready. - */ -void lock_flocks(void) -{ - lock_kernel(); -} -EXPORT_SYMBOL_GPL(lock_flocks); - -void unlock_flocks(void) -{ - unlock_kernel(); -} -EXPORT_SYMBOL_GPL(unlock_flocks); - static struct kmem_cache *filelock_cache __read_mostly; /* Allocate an empty lock structure. */ @@ -527,9 +511,9 @@ static void __locks_delete_block(struct file_lock *waiter) */ static void locks_delete_block(struct file_lock *waiter) { - lock_flocks(); + lock_kernel(); __locks_delete_block(waiter); - unlock_flocks(); + unlock_kernel(); } /* Insert waiter into blocker's block list. @@ -660,7 +644,7 @@ posix_test_lock(struct file *filp, struct file_lock *fl) { struct file_lock *cfl; - lock_flocks(); + lock_kernel(); for (cfl = filp->f_path.dentry->d_inode->i_flock; cfl; cfl = cfl->fl_next) { if (!IS_POSIX(cfl)) continue; @@ -673,7 +657,7 @@ posix_test_lock(struct file *filp, struct file_lock *fl) fl->fl_pid = pid_vnr(cfl->fl_nspid); } else fl->fl_type = F_UNLCK; - unlock_flocks(); + unlock_kernel(); return; } EXPORT_SYMBOL(posix_test_lock); @@ -746,16 +730,18 @@ static int flock_lock_file(struct file *filp, struct file_lock *request) int error = 0; int found = 0; - if (!(request->fl_flags & FL_ACCESS) && (request->fl_type != F_UNLCK)) { - new_fl = locks_alloc_lock(); - if (!new_fl) - return -ENOMEM; - } - - lock_flocks(); + lock_kernel(); if (request->fl_flags & FL_ACCESS) goto find_conflict; + if (request->fl_type != F_UNLCK) { + error = -ENOMEM; + new_fl = locks_alloc_lock(); + if (new_fl == NULL) + goto out; + error = 0; + } + for_each_lock(inode, before) { struct file_lock *fl = *before; if (IS_POSIX(fl)) @@ -781,11 +767,8 @@ static int flock_lock_file(struct file *filp, struct file_lock *request) * If a higher-priority process was blocked on the old file lock, * give it the opportunity to lock the file. */ - if (found) { - unlock_flocks(); + if (found) cond_resched(); - lock_flocks(); - } find_conflict: for_each_lock(inode, before) { @@ -811,7 +794,7 @@ static int flock_lock_file(struct file *filp, struct file_lock *request) error = 0; out: - unlock_flocks(); + unlock_kernel(); if (new_fl) locks_free_lock(new_fl); return error; @@ -840,7 +823,7 @@ static int __posix_lock_file(struct inode *inode, struct file_lock *request, str new_fl2 = locks_alloc_lock(); } - lock_flocks(); + lock_kernel(); if (request->fl_type != F_UNLCK) { for_each_lock(inode, before) { fl = *before; @@ -1008,7 +991,7 @@ static int __posix_lock_file(struct inode *inode, struct file_lock *request, str locks_wake_up_blocks(left); } out: - unlock_flocks(); + unlock_kernel(); /* * Free any unused locks. */ @@ -1083,14 +1066,14 @@ int locks_mandatory_locked(struct inode *inode) /* * Search the lock list for this inode for any POSIX locks. */ - lock_flocks(); + lock_kernel(); for (fl = inode->i_flock; fl != NULL; fl = fl->fl_next) { if (!IS_POSIX(fl)) continue; if (fl->fl_owner != owner) break; } - unlock_flocks(); + unlock_kernel(); return fl ? -EAGAIN : 0; } @@ -1203,7 +1186,7 @@ int __break_lease(struct inode *inode, unsigned int mode) new_fl = lease_alloc(NULL, want_write ? F_WRLCK : F_RDLCK); - lock_flocks(); + lock_kernel(); time_out_leases(inode); @@ -1264,10 +1247,8 @@ int __break_lease(struct inode *inode, unsigned int mode) break_time++; } locks_insert_block(flock, new_fl); - unlock_flocks(); error = wait_event_interruptible_timeout(new_fl->fl_wait, !new_fl->fl_next, break_time); - lock_flocks(); __locks_delete_block(new_fl); if (error >= 0) { if (error == 0) @@ -1282,7 +1263,7 @@ int __break_lease(struct inode *inode, unsigned int mode) } out: - unlock_flocks(); + unlock_kernel(); if (!IS_ERR(new_fl)) locks_free_lock(new_fl); return error; @@ -1338,7 +1319,7 @@ int fcntl_getlease(struct file *filp) struct file_lock *fl; int type = F_UNLCK; - lock_flocks(); + lock_kernel(); time_out_leases(filp->f_path.dentry->d_inode); for (fl = filp->f_path.dentry->d_inode->i_flock; fl && IS_LEASE(fl); fl = fl->fl_next) { @@ -1347,7 +1328,7 @@ int fcntl_getlease(struct file *filp) break; } } - unlock_flocks(); + unlock_kernel(); return type; } @@ -1360,7 +1341,7 @@ int fcntl_getlease(struct file *filp) * The (input) flp->fl_lmops->fl_break function is required * by break_lease(). * - * Called with file_lock_lock held. + * Called with kernel lock held. */ int generic_setlease(struct file *filp, long arg, struct file_lock **flp) { @@ -1455,15 +1436,7 @@ int generic_setlease(struct file *filp, long arg, struct file_lock **flp) } EXPORT_SYMBOL(generic_setlease); -static int __vfs_setlease(struct file *filp, long arg, struct file_lock **lease) -{ - if (filp->f_op && filp->f_op->setlease) - return filp->f_op->setlease(filp, arg, lease); - else - return generic_setlease(filp, arg, lease); -} - -/** + /** * vfs_setlease - sets a lease on an open file * @filp: file pointer * @arg: type of lease to obtain @@ -1494,9 +1467,12 @@ int vfs_setlease(struct file *filp, long arg, struct file_lock **lease) { int error; - lock_flocks(); - error = __vfs_setlease(filp, arg, lease); - unlock_flocks(); + lock_kernel(); + if (filp->f_op && filp->f_op->setlease) + error = filp->f_op->setlease(filp, arg, lease); + else + error = generic_setlease(filp, arg, lease); + unlock_kernel(); return error; } @@ -1523,9 +1499,9 @@ int fcntl_setlease(unsigned int fd, struct file *filp, long arg) if (error) return error; - lock_flocks(); + lock_kernel(); - error = __vfs_setlease(filp, arg, &flp); + error = vfs_setlease(filp, arg, &flp); if (error || arg == F_UNLCK) goto out_unlock; @@ -1540,7 +1516,7 @@ int fcntl_setlease(unsigned int fd, struct file *filp, long arg) error = __f_setown(filp, task_pid(current), PIDTYPE_PID, 0); out_unlock: - unlock_flocks(); + unlock_kernel(); return error; } @@ -2044,7 +2020,7 @@ void locks_remove_flock(struct file *filp) fl.fl_ops->fl_release_private(&fl); } - lock_flocks(); + lock_kernel(); before = &inode->i_flock; while ((fl = *before) != NULL) { @@ -2062,7 +2038,7 @@ void locks_remove_flock(struct file *filp) } before = &fl->fl_next; } - unlock_flocks(); + unlock_kernel(); } /** @@ -2077,12 +2053,12 @@ posix_unblock_lock(struct file *filp, struct file_lock *waiter) { int status = 0; - lock_flocks(); + lock_kernel(); if (waiter->fl_next) __locks_delete_block(waiter); else status = -ENOENT; - unlock_flocks(); + unlock_kernel(); return status; } @@ -2196,7 +2172,7 @@ static int locks_show(struct seq_file *f, void *v) static void *locks_start(struct seq_file *f, loff_t *pos) { - lock_flocks(); + lock_kernel(); f->private = (void *)1; return seq_list_start(&file_lock_list, *pos); } @@ -2208,7 +2184,7 @@ static void *locks_next(struct seq_file *f, void *v, loff_t *pos) static void locks_stop(struct seq_file *f, void *v) { - unlock_flocks(); + unlock_kernel(); } static const struct seq_operations locks_seq_operations = { @@ -2255,7 +2231,7 @@ int lock_may_read(struct inode *inode, loff_t start, unsigned long len) { struct file_lock *fl; int result = 1; - lock_flocks(); + lock_kernel(); for (fl = inode->i_flock; fl != NULL; fl = fl->fl_next) { if (IS_POSIX(fl)) { if (fl->fl_type == F_RDLCK) @@ -2272,7 +2248,7 @@ int lock_may_read(struct inode *inode, loff_t start, unsigned long len) result = 0; break; } - unlock_flocks(); + unlock_kernel(); return result; } @@ -2295,7 +2271,7 @@ int lock_may_write(struct inode *inode, loff_t start, unsigned long len) { struct file_lock *fl; int result = 1; - lock_flocks(); + lock_kernel(); for (fl = inode->i_flock; fl != NULL; fl = fl->fl_next) { if (IS_POSIX(fl)) { if ((fl->fl_end < start) || (fl->fl_start > (start + len))) @@ -2310,7 +2286,7 @@ int lock_may_write(struct inode *inode, loff_t start, unsigned long len) result = 0; break; } - unlock_flocks(); + unlock_kernel(); return result; } diff --git a/trunk/fs/logfs/dir.c b/trunk/fs/logfs/dir.c index 1eb4e89e045b..9777eb5b5522 100644 --- a/trunk/fs/logfs/dir.c +++ b/trunk/fs/logfs/dir.c @@ -827,5 +827,4 @@ const struct file_operations logfs_dir_fops = { .unlocked_ioctl = logfs_ioctl, .readdir = logfs_readdir, .read = generic_read_dir, - .llseek = default_llseek, }; diff --git a/trunk/fs/namespace.c b/trunk/fs/namespace.c index 7ca5182c0bed..a72eaabfe8f2 100644 --- a/trunk/fs/namespace.c +++ b/trunk/fs/namespace.c @@ -1744,7 +1744,9 @@ static int do_new_mount(struct path *path, char *type, int flags, if (!capable(CAP_SYS_ADMIN)) return -EPERM; + lock_kernel(); mnt = do_kern_mount(type, flags, name, data); + unlock_kernel(); if (IS_ERR(mnt)) return PTR_ERR(mnt); diff --git a/trunk/fs/ncpfs/dir.c b/trunk/fs/ncpfs/dir.c index aac8832e919e..9578cbe0cd58 100644 --- a/trunk/fs/ncpfs/dir.c +++ b/trunk/fs/ncpfs/dir.c @@ -95,34 +95,6 @@ const struct dentry_operations ncp_root_dentry_operations = }; -#define ncp_namespace(i) (NCP_SERVER(i)->name_space[NCP_FINFO(i)->volNumber]) - -static inline int ncp_preserve_entry_case(struct inode *i, __u32 nscreator) -{ -#ifdef CONFIG_NCPFS_SMALLDOS - int ns = ncp_namespace(i); - - if ((ns == NW_NS_DOS) -#ifdef CONFIG_NCPFS_OS2_NS - || ((ns == NW_NS_OS2) && (nscreator == NW_NS_DOS)) -#endif /* CONFIG_NCPFS_OS2_NS */ - ) - return 0; -#endif /* CONFIG_NCPFS_SMALLDOS */ - return 1; -} - -#define ncp_preserve_case(i) (ncp_namespace(i) != NW_NS_DOS) - -static inline int ncp_case_sensitive(struct dentry *dentry) -{ -#ifdef CONFIG_NCPFS_NFS_NS - return ncp_namespace(dentry->d_inode) == NW_NS_NFS; -#else - return 0; -#endif /* CONFIG_NCPFS_NFS_NS */ -} - /* * Note: leave the hash unchanged if the directory * is case-sensitive. @@ -130,12 +102,13 @@ static inline int ncp_case_sensitive(struct dentry *dentry) static int ncp_hash_dentry(struct dentry *dentry, struct qstr *this) { - if (!ncp_case_sensitive(dentry)) { - struct nls_table *t; - unsigned long hash; - int i; + struct nls_table *t; + unsigned long hash; + int i; + + t = NCP_IO_TABLE(dentry); - t = NCP_IO_TABLE(dentry); + if (!ncp_case_sensitive(dentry->d_inode)) { hash = init_name_hash(); for (i=0; ilen ; i++) hash = partial_name_hash(ncp_tolower(t, this->name[i]), @@ -151,7 +124,7 @@ ncp_compare_dentry(struct dentry *dentry, struct qstr *a, struct qstr *b) if (a->len != b->len) return 1; - if (ncp_case_sensitive(dentry)) + if (ncp_case_sensitive(dentry->d_inode)) return strncmp(a->name, b->name, a->len); return ncp_strnicmp(NCP_IO_TABLE(dentry), a->name, b->name, a->len); @@ -293,7 +266,7 @@ leave_me:; static int -ncp_lookup_validate(struct dentry *dentry, struct nameidata *nd) +__ncp_lookup_validate(struct dentry *dentry) { struct ncp_server *server; struct dentry *parent; @@ -310,6 +283,9 @@ ncp_lookup_validate(struct dentry *dentry, struct nameidata *nd) server = NCP_SERVER(dir); + if (!ncp_conn_valid(server)) + goto finished; + /* * Inspired by smbfs: * The default validation is based on dentry age: @@ -328,11 +304,8 @@ ncp_lookup_validate(struct dentry *dentry, struct nameidata *nd) if (ncp_is_server_root(dir)) { res = ncp_io2vol(server, __name, &len, dentry->d_name.name, dentry->d_name.len, 1); - if (!res) { + if (!res) res = ncp_lookup_volume(server, __name, &(finfo.i)); - if (!res) - ncp_update_known_namespace(server, finfo.i.volNumber, NULL); - } } else { res = ncp_io2vol(server, __name, &len, dentry->d_name.name, dentry->d_name.len, !ncp_preserve_case(dir)); @@ -347,17 +320,13 @@ ncp_lookup_validate(struct dentry *dentry, struct nameidata *nd) * what we remember, it's not valid any more. */ if (!res) { - struct inode *inode = dentry->d_inode; - - mutex_lock(&inode->i_mutex); - if (finfo.i.dirEntNum == NCP_FINFO(inode)->dirEntNum) { + if (finfo.i.dirEntNum == NCP_FINFO(dentry->d_inode)->dirEntNum) { ncp_new_dentry(dentry); val=1; } else DDPRINTK("ncp_lookup_validate: found, but dirEntNum changed\n"); - ncp_update_inode2(inode, &finfo); - mutex_unlock(&inode->i_mutex); + ncp_update_inode2(dentry->d_inode, &finfo); } finished: @@ -366,6 +335,16 @@ ncp_lookup_validate(struct dentry *dentry, struct nameidata *nd) return val; } +static int +ncp_lookup_validate(struct dentry * dentry, struct nameidata *nd) +{ + int res; + lock_kernel(); + res = __ncp_lookup_validate(dentry); + unlock_kernel(); + return res; +} + static struct dentry * ncp_dget_fpos(struct dentry *dentry, struct dentry *parent, unsigned long fpos) { @@ -432,6 +411,8 @@ static int ncp_readdir(struct file *filp, void *dirent, filldir_t filldir) int result, mtime_valid = 0; time_t mtime = 0; + lock_kernel(); + ctl.page = NULL; ctl.cache = NULL; @@ -440,7 +421,6 @@ static int ncp_readdir(struct file *filp, void *dirent, filldir_t filldir) (int) filp->f_pos); result = -EIO; - /* Do not generate '.' and '..' when server is dead. */ if (!ncp_conn_valid(server)) goto out; @@ -552,12 +532,6 @@ static int ncp_readdir(struct file *filp, void *dirent, filldir_t filldir) ctl.head.end = ctl.fpos - 1; ctl.head.eof = ctl.valid; finished: - if (ctl.page) { - kunmap(ctl.page); - SetPageUptodate(ctl.page); - unlock_page(ctl.page); - page_cache_release(ctl.page); - } if (page) { cache->head = ctl.head; kunmap(page); @@ -565,17 +539,23 @@ static int ncp_readdir(struct file *filp, void *dirent, filldir_t filldir) unlock_page(page); page_cache_release(page); } + if (ctl.page) { + kunmap(ctl.page); + SetPageUptodate(ctl.page); + unlock_page(ctl.page); + page_cache_release(ctl.page); + } out: + unlock_kernel(); return result; } static int ncp_fill_cache(struct file *filp, void *dirent, filldir_t filldir, - struct ncp_cache_control *ctrl, struct ncp_entry_info *entry, - int inval_childs) + struct ncp_cache_control *ctrl, struct ncp_entry_info *entry) { struct dentry *newdent, *dentry = filp->f_path.dentry; - struct inode *dir = dentry->d_inode; + struct inode *newino, *inode = dentry->d_inode; struct ncp_cache_control ctl = *ctrl; struct qstr qname; int valid = 0; @@ -584,9 +564,9 @@ ncp_fill_cache(struct file *filp, void *dirent, filldir_t filldir, __u8 __name[NCP_MAXPATHLEN + 1]; qname.len = sizeof(__name); - if (ncp_vol2io(NCP_SERVER(dir), __name, &qname.len, + if (ncp_vol2io(NCP_SERVER(inode), __name, &qname.len, entry->i.entryName, entry->i.nameLen, - !ncp_preserve_entry_case(dir, entry->i.NSCreator))) + !ncp_preserve_entry_case(inode, entry->i.NSCreator))) return 1; /* I'm not sure */ qname.name = __name; @@ -604,64 +584,22 @@ ncp_fill_cache(struct file *filp, void *dirent, filldir_t filldir, goto end_advance; } else { hashed = 1; - - /* If case sensitivity changed for this volume, all entries below this one - should be thrown away. This entry itself is not affected, as its case - sensitivity is controlled by its own parent. */ - if (inval_childs) - shrink_dcache_parent(newdent); - - /* - * It is not as dangerous as it looks. NetWare's OS2 namespace is - * case preserving yet case insensitive. So we update dentry's name - * as received from server. We found dentry via d_lookup with our - * hash, so we know that hash does not change, and so replacing name - * should be reasonably safe. - */ - if (qname.len == newdent->d_name.len && - memcmp(newdent->d_name.name, qname.name, newdent->d_name.len)) { - struct inode *inode = newdent->d_inode; - - /* - * Inside ncpfs all uses of d_name are either for debugging, - * or on functions which acquire inode mutex (mknod, creat, - * lookup). So grab i_mutex here, to be sure. d_path - * uses dcache_lock when generating path, so we should too. - * And finally d_compare is protected by dentry's d_lock, so - * here we go. - */ - if (inode) - mutex_lock(&inode->i_mutex); - spin_lock(&dcache_lock); - spin_lock(&newdent->d_lock); - memcpy((char *) newdent->d_name.name, qname.name, - newdent->d_name.len); - spin_unlock(&newdent->d_lock); - spin_unlock(&dcache_lock); - if (inode) - mutex_unlock(&inode->i_mutex); - } + memcpy((char *) newdent->d_name.name, qname.name, + newdent->d_name.len); } if (!newdent->d_inode) { - struct inode *inode; - entry->opened = 0; - entry->ino = iunique(dir->i_sb, 2); - inode = ncp_iget(dir->i_sb, entry); - if (inode) { + entry->ino = iunique(inode->i_sb, 2); + newino = ncp_iget(inode->i_sb, entry); + if (newino) { newdent->d_op = &ncp_dentry_operations; - d_instantiate(newdent, inode); + d_instantiate(newdent, newino); if (!hashed) d_rehash(newdent); } - } else { - struct inode *inode = newdent->d_inode; - - mutex_lock(&inode->i_mutex); - ncp_update_inode2(inode, entry); - mutex_unlock(&inode->i_mutex); - } + } else + ncp_update_inode2(newdent->d_inode, entry); if (newdent->d_inode) { ino = newdent->d_inode->i_ino; @@ -679,7 +617,7 @@ ncp_fill_cache(struct file *filp, void *dirent, filldir_t filldir, ctl.cache = NULL; ctl.idx -= NCP_DIRCACHE_SIZE; ctl.ofs += 1; - ctl.page = grab_cache_page(&dir->i_data, ctl.ofs); + ctl.page = grab_cache_page(&inode->i_data, ctl.ofs); if (ctl.page) ctl.cache = kmap(ctl.page); } @@ -695,7 +633,7 @@ ncp_fill_cache(struct file *filp, void *dirent, filldir_t filldir, if (!ino) ino = find_inode_number(dentry, &qname); if (!ino) - ino = iunique(dir->i_sb, 2); + ino = iunique(inode->i_sb, 2); ctl.filled = filldir(dirent, qname.name, qname.len, filp->f_pos, ino, DT_UNKNOWN); if (!ctl.filled) @@ -722,7 +660,6 @@ ncp_read_volume_list(struct file *filp, void *dirent, filldir_t filldir, (unsigned long) filp->f_pos); for (i = 0; i < NCP_NUMBER_OF_VOLUMES; i++) { - int inval_dentry; if (ncp_get_volume_info_with_number(server, i, &info) != 0) return; @@ -738,9 +675,8 @@ ncp_read_volume_list(struct file *filp, void *dirent, filldir_t filldir, info.volume_name); continue; } - inval_dentry = ncp_update_known_namespace(server, entry.i.volNumber, NULL); entry.volume = entry.i.volNumber; - if (!ncp_fill_cache(filp, dirent, filldir, ctl, &entry, inval_dentry)) + if (!ncp_fill_cache(filp, dirent, filldir, ctl, &entry)) return; } } @@ -803,7 +739,7 @@ ncp_do_readdir(struct file *filp, void *dirent, filldir_t filldir, rpl += onerpl; rpls -= onerpl; entry.volume = entry.i.volNumber; - if (!ncp_fill_cache(filp, dirent, filldir, ctl, &entry, 0)) + if (!ncp_fill_cache(filp, dirent, filldir, ctl, &entry)) break; } } while (more); @@ -839,19 +775,17 @@ int ncp_conn_logged_in(struct super_block *sb) if (dent) { struct inode* ino = dent->d_inode; if (ino) { - ncp_update_known_namespace(server, volNumber, NULL); NCP_FINFO(ino)->volNumber = volNumber; NCP_FINFO(ino)->dirEntNum = dirEntNum; NCP_FINFO(ino)->DosDirNum = DosDirNum; - result = 0; } else { DPRINTK("ncpfs: sb->s_root->d_inode == NULL!\n"); } } else { DPRINTK("ncpfs: sb->s_root == NULL!\n"); } - } else - result = 0; + } + result = 0; out: return result; @@ -865,6 +799,7 @@ static struct dentry *ncp_lookup(struct inode *dir, struct dentry *dentry, struc int error, res, len; __u8 __name[NCP_MAXPATHLEN + 1]; + lock_kernel(); error = -EIO; if (!ncp_conn_valid(server)) goto finished; @@ -878,8 +813,6 @@ static struct dentry *ncp_lookup(struct inode *dir, struct dentry *dentry, struc dentry->d_name.len, 1); if (!res) res = ncp_lookup_volume(server, __name, &(finfo.i)); - if (!res) - ncp_update_known_namespace(server, finfo.i.volNumber, NULL); } else { res = ncp_io2vol(server, __name, &len, dentry->d_name.name, dentry->d_name.len, !ncp_preserve_case(dir)); @@ -913,6 +846,7 @@ static struct dentry *ncp_lookup(struct inode *dir, struct dentry *dentry, struc finished: PPRINTK("ncp_lookup: result=%d\n", error); + unlock_kernel(); return ERR_PTR(error); } @@ -953,6 +887,11 @@ int ncp_create_new(struct inode *dir, struct dentry *dentry, int mode, PPRINTK("ncp_create_new: creating %s/%s, mode=%x\n", dentry->d_parent->d_name.name, dentry->d_name.name, mode); + error = -EIO; + lock_kernel(); + if (!ncp_conn_valid(server)) + goto out; + ncp_age_dentry(server, dentry); len = sizeof(__name); error = ncp_io2vol(server, __name, &len, dentry->d_name.name, @@ -978,8 +917,6 @@ int ncp_create_new(struct inode *dir, struct dentry *dentry, int mode, if (result) { if (result == 0x87) error = -ENAMETOOLONG; - else if (result < 0) - error = result; DPRINTK("ncp_create: %s/%s failed\n", dentry->d_parent->d_name.name, dentry->d_name.name); goto out; @@ -998,6 +935,7 @@ int ncp_create_new(struct inode *dir, struct dentry *dentry, int mode, error = ncp_instantiate(dir, dentry, &finfo); out: + unlock_kernel(); return error; } @@ -1017,6 +955,11 @@ static int ncp_mkdir(struct inode *dir, struct dentry *dentry, int mode) DPRINTK("ncp_mkdir: making %s/%s\n", dentry->d_parent->d_name.name, dentry->d_name.name); + error = -EIO; + lock_kernel(); + if (!ncp_conn_valid(server)) + goto out; + ncp_age_dentry(server, dentry); len = sizeof(__name); error = ncp_io2vol(server, __name, &len, dentry->d_name.name, @@ -1024,11 +967,12 @@ static int ncp_mkdir(struct inode *dir, struct dentry *dentry, int mode) if (error) goto out; - error = ncp_open_create_file_or_subdir(server, dir, __name, + error = -EACCES; + if (ncp_open_create_file_or_subdir(server, dir, __name, OC_MODE_CREATE, aDIR, cpu_to_le16(0xffff), - &finfo); - if (error == 0) { + &finfo) == 0) + { if (ncp_is_nfs_extras(server, finfo.volume)) { mode |= S_IFDIR; finfo.i.nfs.mode = mode; @@ -1039,10 +983,9 @@ static int ncp_mkdir(struct inode *dir, struct dentry *dentry, int mode) goto out; } error = ncp_instantiate(dir, dentry, &finfo); - } else if (error > 0) { - error = -EACCES; } out: + unlock_kernel(); return error; } @@ -1055,6 +998,11 @@ static int ncp_rmdir(struct inode *dir, struct dentry *dentry) DPRINTK("ncp_rmdir: removing %s/%s\n", dentry->d_parent->d_name.name, dentry->d_name.name); + error = -EIO; + lock_kernel(); + if (!ncp_conn_valid(server)) + goto out; + error = -EBUSY; if (!d_unhashed(dentry)) goto out; @@ -1088,10 +1036,11 @@ static int ncp_rmdir(struct inode *dir, struct dentry *dentry) error = -ENOENT; break; default: - error = result < 0 ? result : -EACCES; + error = -EACCES; break; } out: + unlock_kernel(); return error; } @@ -1101,10 +1050,15 @@ static int ncp_unlink(struct inode *dir, struct dentry *dentry) struct ncp_server *server; int error; + lock_kernel(); server = NCP_SERVER(dir); DPRINTK("ncp_unlink: unlinking %s/%s\n", dentry->d_parent->d_name.name, dentry->d_name.name); + error = -EIO; + if (!ncp_conn_valid(server)) + goto out; + /* * Check whether to close the file ... */ @@ -1143,9 +1097,12 @@ static int ncp_unlink(struct inode *dir, struct dentry *dentry) error = -ENOENT; break; default: - error = error < 0 ? error : -EACCES; + error = -EACCES; break; } + +out: + unlock_kernel(); return error; } @@ -1161,6 +1118,11 @@ static int ncp_rename(struct inode *old_dir, struct dentry *old_dentry, old_dentry->d_parent->d_name.name, old_dentry->d_name.name, new_dentry->d_parent->d_name.name, new_dentry->d_name.name); + error = -EIO; + lock_kernel(); + if (!ncp_conn_valid(server)) + goto out; + ncp_age_dentry(server, old_dentry); ncp_age_dentry(server, new_dentry); @@ -1199,10 +1161,11 @@ static int ncp_rename(struct inode *old_dir, struct dentry *old_dentry, error = -ENOENT; break; default: - error = error < 0 ? error : -EACCES; + error = -EACCES; break; } out: + unlock_kernel(); return error; } diff --git a/trunk/fs/ncpfs/file.c b/trunk/fs/ncpfs/file.c index 6c754f70c529..3639cc5cbdae 100644 --- a/trunk/fs/ncpfs/file.c +++ b/trunk/fs/ncpfs/file.c @@ -113,6 +113,9 @@ ncp_file_read(struct file *file, char __user *buf, size_t count, loff_t *ppos) DPRINTK("ncp_file_read: enter %s/%s\n", dentry->d_parent->d_name.name, dentry->d_name.name); + if (!ncp_conn_valid(NCP_SERVER(inode))) + return -EIO; + pos = *ppos; if ((ssize_t) count < 0) { @@ -189,11 +192,13 @@ ncp_file_write(struct file *file, const char __user *buf, size_t count, loff_t * DPRINTK("ncp_file_write: enter %s/%s\n", dentry->d_parent->d_name.name, dentry->d_name.name); + if (!ncp_conn_valid(NCP_SERVER(inode))) + return -EIO; if ((ssize_t) count < 0) return -EINVAL; pos = *ppos; if (file->f_flags & O_APPEND) { - pos = i_size_read(inode); + pos = inode->i_size; } if (pos + count > MAX_NON_LFS && !(file->f_flags&O_LARGEFILE)) { @@ -259,11 +264,8 @@ ncp_file_write(struct file *file, const char __user *buf, size_t count, loff_t * *ppos = pos; - if (pos > i_size_read(inode)) { - mutex_lock(&inode->i_mutex); - if (pos > i_size_read(inode)) - i_size_write(inode, pos); - mutex_unlock(&inode->i_mutex); + if (pos > inode->i_size) { + inode->i_size = pos; } DPRINTK("ncp_file_write: exit %s/%s\n", dentry->d_parent->d_name.name, dentry->d_name.name); @@ -279,9 +281,18 @@ static int ncp_release(struct inode *inode, struct file *file) { return 0; } +static loff_t ncp_remote_llseek(struct file *file, loff_t offset, int origin) +{ + loff_t ret; + lock_kernel(); + ret = generic_file_llseek_unlocked(file, offset, origin); + unlock_kernel(); + return ret; +} + const struct file_operations ncp_file_operations = { - .llseek = generic_file_llseek, + .llseek = ncp_remote_llseek, .read = ncp_file_read, .write = ncp_file_write, .unlocked_ioctl = ncp_ioctl, diff --git a/trunk/fs/ncpfs/inode.c b/trunk/fs/ncpfs/inode.c index 985fabb26aca..b4de38cf49f5 100644 --- a/trunk/fs/ncpfs/inode.c +++ b/trunk/fs/ncpfs/inode.c @@ -139,7 +139,7 @@ static void ncp_update_dates(struct inode *inode, struct nw_info_struct *nwi) inode->i_mode = nwi->nfs.mode; } - inode->i_blocks = (i_size_read(inode) + NCP_BLOCK_SIZE - 1) >> NCP_BLOCK_SHIFT; + inode->i_blocks = (inode->i_size + NCP_BLOCK_SIZE - 1) >> NCP_BLOCK_SHIFT; inode->i_mtime.tv_sec = ncp_date_dos2unix(nwi->modifyTime, nwi->modifyDate); inode->i_ctime.tv_sec = ncp_date_dos2unix(nwi->creationTime, nwi->creationDate); @@ -158,21 +158,18 @@ static void ncp_update_attrs(struct inode *inode, struct ncp_entry_info *nwinfo) inode->i_mode = server->m.dir_mode; /* for directories dataStreamSize seems to be some Object ID ??? */ - i_size_write(inode, NCP_BLOCK_SIZE); + inode->i_size = NCP_BLOCK_SIZE; } else { - u32 size; - inode->i_mode = server->m.file_mode; - size = le32_to_cpu(nwi->dataStreamSize); - i_size_write(inode, size); + inode->i_size = le32_to_cpu(nwi->dataStreamSize); #ifdef CONFIG_NCPFS_EXTRAS if ((server->m.flags & (NCP_MOUNT_EXTRAS|NCP_MOUNT_SYMLINKS)) && (nwi->attributes & aSHARED)) { switch (nwi->attributes & (aHIDDEN|aSYSTEM)) { case aHIDDEN: if (server->m.flags & NCP_MOUNT_SYMLINKS) { - if (/* (size >= NCP_MIN_SYMLINK_SIZE) - && */ (size <= NCP_MAX_SYMLINK_SIZE)) { + if (/* (inode->i_size >= NCP_MIN_SYMLINK_SIZE) + && */ (inode->i_size <= NCP_MAX_SYMLINK_SIZE)) { inode->i_mode = (inode->i_mode & ~S_IFMT) | S_IFLNK; NCP_FINFO(inode)->flags |= NCPI_KLUDGE_SYMLINK; break; @@ -211,7 +208,7 @@ void ncp_update_inode2(struct inode* inode, struct ncp_entry_info *nwinfo) } /* - * Fill in the inode based on the ncp_entry_info structure. Used only for brand new inodes. + * Fill in the inode based on the ncp_entry_info structure. */ static void ncp_set_attr(struct inode *inode, struct ncp_entry_info *nwinfo) { @@ -257,7 +254,6 @@ ncp_iget(struct super_block *sb, struct ncp_entry_info *info) if (inode) { atomic_set(&NCP_FINFO(inode)->opened, info->opened); - inode->i_mapping->backing_dev_info = sb->s_bdi; inode->i_ino = info->ino; ncp_set_attr(inode, info); if (S_ISREG(inode->i_mode)) { @@ -303,12 +299,10 @@ ncp_evict_inode(struct inode *inode) static void ncp_stop_tasks(struct ncp_server *server) { struct sock* sk = server->ncp_sock->sk; - - lock_sock(sk); + sk->sk_error_report = server->error_report; sk->sk_data_ready = server->data_ready; sk->sk_write_space = server->write_space; - release_sock(sk); del_timer_sync(&server->timeout_tm); flush_scheduled_work(); } @@ -571,12 +565,10 @@ static int ncp_fill_super(struct super_block *sb, void *raw_data, int silent) /* server->conn_status = 0; */ /* server->root_dentry = NULL; */ /* server->root_setuped = 0; */ - mutex_init(&server->root_setup_lock); #ifdef CONFIG_NCPFS_PACKET_SIGNING /* server->sign_wanted = 0; */ /* server->sign_active = 0; */ #endif - init_rwsem(&server->auth_rwsem); server->auth.auth_type = NCP_AUTH_NONE; /* server->auth.object_name_len = 0; */ /* server->auth.object_name = NULL; */ @@ -601,12 +593,16 @@ static int ncp_fill_super(struct super_block *sb, void *raw_data, int silent) server->nls_io = load_nls_default(); #endif /* CONFIG_NCPFS_NLS */ - atomic_set(&server->dentry_ttl, 0); /* no caching */ + server->dentry_ttl = 0; /* no caching */ INIT_LIST_HEAD(&server->tx.requests); mutex_init(&server->rcv.creq_mutex); server->tx.creq = NULL; server->rcv.creq = NULL; + server->data_ready = sock->sk->sk_data_ready; + server->write_space = sock->sk->sk_write_space; + server->error_report = sock->sk->sk_error_report; + sock->sk->sk_user_data = server; init_timer(&server->timeout_tm); #undef NCP_PACKET_SIZE @@ -623,11 +619,6 @@ static int ncp_fill_super(struct super_block *sb, void *raw_data, int silent) if (server->rxbuf == NULL) goto out_txbuf; - lock_sock(sock->sk); - server->data_ready = sock->sk->sk_data_ready; - server->write_space = sock->sk->sk_write_space; - server->error_report = sock->sk->sk_error_report; - sock->sk->sk_user_data = server; sock->sk->sk_data_ready = ncp_tcp_data_ready; sock->sk->sk_error_report = ncp_tcp_error_report; if (sock->type == SOCK_STREAM) { @@ -643,7 +634,6 @@ static int ncp_fill_super(struct super_block *sb, void *raw_data, int silent) server->timeout_tm.data = (unsigned long)server; server->timeout_tm.function = ncpdgram_timeout_call; } - release_sock(sock->sk); ncp_lock_server(server); error = ncp_connect(server); @@ -668,10 +658,8 @@ static int ncp_fill_super(struct super_block *sb, void *raw_data, int silent) goto out_disconnect; } } - ncp_lock_server(server); if (options & 2) server->sign_wanted = 1; - ncp_unlock_server(server); } else #endif /* CONFIG_NCPFS_PACKET_SIGNING */ @@ -732,9 +720,6 @@ static int ncp_fill_super(struct super_block *sb, void *raw_data, int silent) unload_nls(server->nls_io); unload_nls(server->nls_vol); #endif - mutex_destroy(&server->rcv.creq_mutex); - mutex_destroy(&server->root_setup_lock); - mutex_destroy(&server->mutex); out_fput2: if (server->info_filp) fput(server->info_filp); @@ -758,6 +743,8 @@ static void ncp_put_super(struct super_block *sb) { struct ncp_server *server = NCP_SBP(sb); + lock_kernel(); + ncp_lock_server(server); ncp_disconnect(server); ncp_unlock_server(server); @@ -769,9 +756,6 @@ static void ncp_put_super(struct super_block *sb) unload_nls(server->nls_vol); unload_nls(server->nls_io); #endif /* CONFIG_NCPFS_NLS */ - mutex_destroy(&server->rcv.creq_mutex); - mutex_destroy(&server->root_setup_lock); - mutex_destroy(&server->mutex); if (server->info_filp) fput(server->info_filp); @@ -787,6 +771,8 @@ static void ncp_put_super(struct super_block *sb) vfree(server->packet); sb->s_fs_info = NULL; kfree(server); + + unlock_kernel(); } static int ncp_statfs(struct dentry *dentry, struct kstatfs *buf) @@ -865,8 +851,10 @@ int ncp_notify_change(struct dentry *dentry, struct iattr *attr) result = -EIO; + lock_kernel(); + server = NCP_SERVER(inode); - if (!server) /* How this could happen? */ + if ((!server) || !ncp_conn_valid(server)) goto out; /* ageing the dentry to force validation */ @@ -993,6 +981,8 @@ int ncp_notify_change(struct dentry *dentry, struct iattr *attr) result = ncp_modify_file_or_subdir_dos_info(NCP_SERVER(inode), inode, info_mask, &info); if (result != 0) { + result = -EACCES; + if (info_mask == (DM_CREATE_TIME | DM_CREATE_DATE)) { /* NetWare seems not to allow this. I do not know why. So, just tell the @@ -1015,8 +1005,7 @@ int ncp_notify_change(struct dentry *dentry, struct iattr *attr) mark_inode_dirty(inode); out: - if (result > 0) - result = -EACCES; + unlock_kernel(); return result; } diff --git a/trunk/fs/ncpfs/ioctl.c b/trunk/fs/ncpfs/ioctl.c index c2a1f9a155c3..84a8cfc4e38e 100644 --- a/trunk/fs/ncpfs/ioctl.c +++ b/trunk/fs/ncpfs/ioctl.c @@ -35,11 +35,16 @@ #define NCP_PACKET_SIZE_INTERNAL 65536 static int -ncp_get_fs_info(struct ncp_server * server, struct inode *inode, +ncp_get_fs_info(struct ncp_server * server, struct file *file, struct ncp_fs_info __user *arg) { + struct inode *inode = file->f_path.dentry->d_inode; struct ncp_fs_info info; + if (file_permission(file, MAY_WRITE) != 0 + && current_uid() != server->m.mounted_uid) + return -EACCES; + if (copy_from_user(&info, arg, sizeof(info))) return -EFAULT; @@ -60,11 +65,16 @@ ncp_get_fs_info(struct ncp_server * server, struct inode *inode, } static int -ncp_get_fs_info_v2(struct ncp_server * server, struct inode *inode, +ncp_get_fs_info_v2(struct ncp_server * server, struct file *file, struct ncp_fs_info_v2 __user * arg) { + struct inode *inode = file->f_path.dentry->d_inode; struct ncp_fs_info_v2 info2; + if (file_permission(file, MAY_WRITE) != 0 + && current_uid() != server->m.mounted_uid) + return -EACCES; + if (copy_from_user(&info2, arg, sizeof(info2))) return -EFAULT; @@ -126,11 +136,16 @@ struct compat_ncp_privatedata_ioctl #define NCP_IOC_SETPRIVATEDATA_32 _IOR('n', 10, struct compat_ncp_privatedata_ioctl) static int -ncp_get_compat_fs_info_v2(struct ncp_server * server, struct inode *inode, +ncp_get_compat_fs_info_v2(struct ncp_server * server, struct file *file, struct compat_ncp_fs_info_v2 __user * arg) { + struct inode *inode = file->f_path.dentry->d_inode; struct compat_ncp_fs_info_v2 info2; + if (file_permission(file, MAY_WRITE) != 0 + && current_uid() != server->m.mounted_uid) + return -EACCES; + if (copy_from_user(&info2, arg, sizeof(info2))) return -EFAULT; @@ -167,8 +182,11 @@ ncp_set_charsets(struct ncp_server* server, struct ncp_nls_ioctl __user *arg) struct nls_table *iocharset; struct nls_table *oldset_io; struct nls_table *oldset_cp; - int utf8; - int err; + + if (!capable(CAP_SYS_ADMIN)) + return -EACCES; + if (server->root_setuped) + return -EBUSY; if (copy_from_user(&user, arg, sizeof(user))) return -EFAULT; @@ -188,40 +206,28 @@ ncp_set_charsets(struct ncp_server* server, struct ncp_nls_ioctl __user *arg) user.iocharset[NCP_IOCSNAME_LEN] = 0; if (!user.iocharset[0] || !strcmp(user.iocharset, "default")) { iocharset = load_nls_default(); - utf8 = 0; + NCP_CLR_FLAG(server, NCP_FLAG_UTF8); } else if (!strcmp(user.iocharset, "utf8")) { iocharset = load_nls_default(); - utf8 = 1; + NCP_SET_FLAG(server, NCP_FLAG_UTF8); } else { iocharset = load_nls(user.iocharset); if (!iocharset) { unload_nls(codepage); return -EBADRQC; } - utf8 = 0; + NCP_CLR_FLAG(server, NCP_FLAG_UTF8); } - mutex_lock(&server->root_setup_lock); - if (server->root_setuped) { - oldset_cp = codepage; - oldset_io = iocharset; - err = -EBUSY; - } else { - if (utf8) - NCP_SET_FLAG(server, NCP_FLAG_UTF8); - else - NCP_CLR_FLAG(server, NCP_FLAG_UTF8); - oldset_cp = server->nls_vol; - server->nls_vol = codepage; - oldset_io = server->nls_io; - server->nls_io = iocharset; - err = 0; - } - mutex_unlock(&server->root_setup_lock); + oldset_cp = server->nls_vol; + server->nls_vol = codepage; + oldset_io = server->nls_io; + server->nls_io = iocharset; + unload_nls(oldset_cp); unload_nls(oldset_io); - return err; + return 0; } static int @@ -231,7 +237,6 @@ ncp_get_charsets(struct ncp_server* server, struct ncp_nls_ioctl __user *arg) int len; memset(&user, 0, sizeof(user)); - mutex_lock(&server->root_setup_lock); if (server->nls_vol && server->nls_vol->charset) { len = strlen(server->nls_vol->charset); if (len > NCP_IOCSNAME_LEN) @@ -249,7 +254,6 @@ ncp_get_charsets(struct ncp_server* server, struct ncp_nls_ioctl __user *arg) strncpy(user.iocharset, server->nls_io->charset, len); user.iocharset[len] = 0; } - mutex_unlock(&server->root_setup_lock); if (copy_to_user(arg, &user, sizeof(user))) return -EFAULT; @@ -257,19 +261,25 @@ ncp_get_charsets(struct ncp_server* server, struct ncp_nls_ioctl __user *arg) } #endif /* CONFIG_NCPFS_NLS */ -static long __ncp_ioctl(struct inode *inode, unsigned int cmd, unsigned long arg) +static long __ncp_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) { + struct inode *inode = filp->f_dentry->d_inode; struct ncp_server *server = NCP_SERVER(inode); int result; struct ncp_ioctl_request request; char* bouncebuffer; void __user *argp = (void __user *)arg; + uid_t uid = current_uid(); switch (cmd) { #ifdef CONFIG_COMPAT case NCP_IOC_NCPREQUEST_32: #endif case NCP_IOC_NCPREQUEST: + if (file_permission(filp, MAY_WRITE) != 0 + && uid != server->m.mounted_uid) + return -EACCES; + #ifdef CONFIG_COMPAT if (cmd == NCP_IOC_NCPREQUEST_32) { struct compat_ncp_ioctl_request request32; @@ -304,7 +314,7 @@ static long __ncp_ioctl(struct inode *inode, unsigned int cmd, unsigned long arg server->current_size = request.size; memcpy(server->packet, bouncebuffer, request.size); - result = ncp_request2(server, request.function, + result = ncp_request2(server, request.function, bouncebuffer, NCP_PACKET_SIZE_INTERNAL); if (result < 0) result = -EIO; @@ -321,69 +331,69 @@ static long __ncp_ioctl(struct inode *inode, unsigned int cmd, unsigned long arg case NCP_IOC_CONN_LOGGED_IN: + if (!capable(CAP_SYS_ADMIN)) + return -EACCES; if (!(server->m.int_flags & NCP_IMOUNT_LOGGEDIN_POSSIBLE)) return -EINVAL; - mutex_lock(&server->root_setup_lock); if (server->root_setuped) - result = -EBUSY; - else { - result = ncp_conn_logged_in(inode->i_sb); - if (result == 0) - server->root_setuped = 1; - } - mutex_unlock(&server->root_setup_lock); - return result; + return -EBUSY; + server->root_setuped = 1; + return ncp_conn_logged_in(inode->i_sb); case NCP_IOC_GET_FS_INFO: - return ncp_get_fs_info(server, inode, argp); + return ncp_get_fs_info(server, filp, argp); case NCP_IOC_GET_FS_INFO_V2: - return ncp_get_fs_info_v2(server, inode, argp); + return ncp_get_fs_info_v2(server, filp, argp); #ifdef CONFIG_COMPAT case NCP_IOC_GET_FS_INFO_V2_32: - return ncp_get_compat_fs_info_v2(server, inode, argp); + return ncp_get_compat_fs_info_v2(server, filp, argp); #endif /* we have too many combinations of CONFIG_COMPAT, * CONFIG_64BIT and CONFIG_UID16, so just handle * any of the possible ioctls */ case NCP_IOC_GETMOUNTUID16: - { - u16 uid; + case NCP_IOC_GETMOUNTUID32: + case NCP_IOC_GETMOUNTUID64: + if (file_permission(filp, MAY_READ) != 0 + && uid != server->m.mounted_uid) + return -EACCES; + if (cmd == NCP_IOC_GETMOUNTUID16) { + u16 uid; SET_UID(uid, server->m.mounted_uid); if (put_user(uid, (u16 __user *)argp)) return -EFAULT; - return 0; + } else if (cmd == NCP_IOC_GETMOUNTUID32) { + if (put_user(server->m.mounted_uid, + (u32 __user *)argp)) + return -EFAULT; + } else { + if (put_user(server->m.mounted_uid, + (u64 __user *)argp)) + return -EFAULT; } - case NCP_IOC_GETMOUNTUID32: - if (put_user(server->m.mounted_uid, - (u32 __user *)argp)) - return -EFAULT; - return 0; - case NCP_IOC_GETMOUNTUID64: - if (put_user(server->m.mounted_uid, - (u64 __user *)argp)) - return -EFAULT; return 0; case NCP_IOC_GETROOT: { struct ncp_setroot_ioctl sr; - result = -EACCES; - mutex_lock(&server->root_setup_lock); + if (file_permission(filp, MAY_READ) != 0 + && uid != server->m.mounted_uid) + return -EACCES; + if (server->m.mounted_vol[0]) { struct dentry* dentry = inode->i_sb->s_root; if (dentry) { struct inode* s_inode = dentry->d_inode; - + if (s_inode) { sr.volNumber = NCP_FINFO(s_inode)->volNumber; sr.dirEntNum = NCP_FINFO(s_inode)->dirEntNum; sr.namespace = server->name_space[sr.volNumber]; - result = 0; } else DPRINTK("ncpfs: s_root->d_inode==NULL\n"); } else @@ -392,12 +402,10 @@ static long __ncp_ioctl(struct inode *inode, unsigned int cmd, unsigned long arg sr.volNumber = -1; sr.namespace = 0; sr.dirEntNum = 0; - result = 0; } - mutex_unlock(&server->root_setup_lock); - if (!result && copy_to_user(argp, &sr, sizeof(sr))) - result = -EFAULT; - return result; + if (copy_to_user(argp, &sr, sizeof(sr))) + return -EFAULT; + return 0; } case NCP_IOC_SETROOT: @@ -408,114 +416,103 @@ static long __ncp_ioctl(struct inode *inode, unsigned int cmd, unsigned long arg __le32 dosde; struct dentry* dentry; + if (!capable(CAP_SYS_ADMIN)) + { + return -EACCES; + } + if (server->root_setuped) return -EBUSY; if (copy_from_user(&sr, argp, sizeof(sr))) return -EFAULT; - mutex_lock(&server->root_setup_lock); - if (server->root_setuped) - result = -EBUSY; - else { - if (sr.volNumber < 0) { - server->m.mounted_vol[0] = 0; - vnum = NCP_NUMBER_OF_VOLUMES; - de = 0; - dosde = 0; - result = 0; - } else if (sr.volNumber >= NCP_NUMBER_OF_VOLUMES) { - result = -EINVAL; - } else if (ncp_mount_subdir(server, sr.volNumber, - sr.namespace, sr.dirEntNum, - &vnum, &de, &dosde)) { - result = -ENOENT; - } else - result = 0; - - if (result == 0) { - dentry = inode->i_sb->s_root; - if (dentry) { - struct inode* s_inode = dentry->d_inode; - - if (s_inode) { - NCP_FINFO(s_inode)->volNumber = vnum; - NCP_FINFO(s_inode)->dirEntNum = de; - NCP_FINFO(s_inode)->DosDirNum = dosde; - server->root_setuped = 1; - } else { - DPRINTK("ncpfs: s_root->d_inode==NULL\n"); - result = -EIO; - } - } else { - DPRINTK("ncpfs: s_root==NULL\n"); - result = -EIO; - } - } - result = 0; + if (sr.volNumber < 0) { + server->m.mounted_vol[0] = 0; + vnum = NCP_NUMBER_OF_VOLUMES; + de = 0; + dosde = 0; + } else if (sr.volNumber >= NCP_NUMBER_OF_VOLUMES) { + return -EINVAL; + } else if (ncp_mount_subdir(server, sr.volNumber, + sr.namespace, sr.dirEntNum, + &vnum, &de, &dosde)) { + return -ENOENT; } - mutex_unlock(&server->root_setup_lock); + + dentry = inode->i_sb->s_root; + server->root_setuped = 1; + if (dentry) { + struct inode* s_inode = dentry->d_inode; + + if (s_inode) { + NCP_FINFO(s_inode)->volNumber = vnum; + NCP_FINFO(s_inode)->dirEntNum = de; + NCP_FINFO(s_inode)->DosDirNum = dosde; + } else + DPRINTK("ncpfs: s_root->d_inode==NULL\n"); + } else + DPRINTK("ncpfs: s_root==NULL\n"); - return result; + return 0; } -#ifdef CONFIG_NCPFS_PACKET_SIGNING +#ifdef CONFIG_NCPFS_PACKET_SIGNING case NCP_IOC_SIGN_INIT: - { - struct ncp_sign_init sign; + if (file_permission(filp, MAY_WRITE) != 0 + && uid != server->m.mounted_uid) + return -EACCES; + + if (argp) { + if (server->sign_wanted) + { + struct ncp_sign_init sign; - if (argp) if (copy_from_user(&sign, argp, sizeof(sign))) return -EFAULT; - ncp_lock_server(server); - mutex_lock(&server->rcv.creq_mutex); - if (argp) { - if (server->sign_wanted) { - memcpy(server->sign_root,sign.sign_root,8); - memcpy(server->sign_last,sign.sign_last,16); - server->sign_active = 1; - } - /* ignore when signatures not wanted */ - } else { - server->sign_active = 0; + memcpy(server->sign_root,sign.sign_root,8); + memcpy(server->sign_last,sign.sign_last,16); + server->sign_active = 1; } - mutex_unlock(&server->rcv.creq_mutex); - ncp_unlock_server(server); - return 0; + /* ignore when signatures not wanted */ + } else { + server->sign_active = 0; } - + return 0; + case NCP_IOC_SIGN_WANTED: - { - int state; - - ncp_lock_server(server); - state = server->sign_wanted; - ncp_unlock_server(server); - if (put_user(state, (int __user *)argp)) - return -EFAULT; - return 0; - } + if (file_permission(filp, MAY_READ) != 0 + && uid != server->m.mounted_uid) + return -EACCES; + + if (put_user(server->sign_wanted, (int __user *)argp)) + return -EFAULT; + return 0; case NCP_IOC_SET_SIGN_WANTED: { int newstate; + if (file_permission(filp, MAY_WRITE) != 0 + && uid != server->m.mounted_uid) + return -EACCES; + /* get only low 8 bits... */ if (get_user(newstate, (unsigned char __user *)argp)) return -EFAULT; - result = 0; - ncp_lock_server(server); if (server->sign_active) { /* cannot turn signatures OFF when active */ - if (!newstate) - result = -EINVAL; + if (!newstate) return -EINVAL; } else { server->sign_wanted = newstate != 0; } - ncp_unlock_server(server); - return result; + return 0; } #endif /* CONFIG_NCPFS_PACKET_SIGNING */ #ifdef CONFIG_NCPFS_IOCTL_LOCKING case NCP_IOC_LOCKUNLOCK: + if (file_permission(filp, MAY_WRITE) != 0 + && uid != server->m.mounted_uid) + return -EACCES; + { struct ncp_lock_ioctl rqdata; @@ -544,13 +541,16 @@ static long __ncp_ioctl(struct inode *inode, unsigned int cmd, unsigned long arg { return result; } + result = -EIO; + if (!ncp_conn_valid(server)) + goto outrel; result = -EISDIR; if (!S_ISREG(inode->i_mode)) goto outrel; if (rqdata.cmd == NCP_LOCK_CLEAR) { result = ncp_ClearPhysicalRecord(NCP_SERVER(inode), - NCP_FINFO(inode)->file_handle, + NCP_FINFO(inode)->file_handle, rqdata.offset, rqdata.length); if (result > 0) result = 0; /* no such lock */ @@ -573,7 +573,7 @@ static long __ncp_ioctl(struct inode *inode, unsigned int cmd, unsigned long arg rqdata.timeout); if (result > 0) result = -EAGAIN; } -outrel: +outrel: ncp_inode_close(inode); return result; } @@ -581,62 +581,60 @@ static long __ncp_ioctl(struct inode *inode, unsigned int cmd, unsigned long arg #ifdef CONFIG_COMPAT case NCP_IOC_GETOBJECTNAME_32: + if (uid != server->m.mounted_uid) + return -EACCES; { struct compat_ncp_objectname_ioctl user; size_t outl; if (copy_from_user(&user, argp, sizeof(user))) return -EFAULT; - down_read(&server->auth_rwsem); user.auth_type = server->auth.auth_type; outl = user.object_name_len; user.object_name_len = server->auth.object_name_len; if (outl > user.object_name_len) outl = user.object_name_len; - result = 0; if (outl) { if (copy_to_user(compat_ptr(user.object_name), server->auth.object_name, - outl)) - result = -EFAULT; + outl)) return -EFAULT; } - up_read(&server->auth_rwsem); - if (!result && copy_to_user(argp, &user, sizeof(user))) - result = -EFAULT; - return result; + if (copy_to_user(argp, &user, sizeof(user))) + return -EFAULT; + return 0; } #endif case NCP_IOC_GETOBJECTNAME: + if (uid != server->m.mounted_uid) + return -EACCES; { struct ncp_objectname_ioctl user; size_t outl; if (copy_from_user(&user, argp, sizeof(user))) return -EFAULT; - down_read(&server->auth_rwsem); user.auth_type = server->auth.auth_type; outl = user.object_name_len; user.object_name_len = server->auth.object_name_len; if (outl > user.object_name_len) outl = user.object_name_len; - result = 0; if (outl) { if (copy_to_user(user.object_name, server->auth.object_name, - outl)) - result = -EFAULT; + outl)) return -EFAULT; } - up_read(&server->auth_rwsem); - if (!result && copy_to_user(argp, &user, sizeof(user))) - result = -EFAULT; - return result; + if (copy_to_user(argp, &user, sizeof(user))) + return -EFAULT; + return 0; } #ifdef CONFIG_COMPAT case NCP_IOC_SETOBJECTNAME_32: #endif case NCP_IOC_SETOBJECTNAME: + if (uid != server->m.mounted_uid) + return -EACCES; { struct ncp_objectname_ioctl user; void* newname; @@ -668,7 +666,9 @@ static long __ncp_ioctl(struct inode *inode, unsigned int cmd, unsigned long arg } else { newname = NULL; } - down_write(&server->auth_rwsem); + /* enter critical section */ + /* maybe that kfree can sleep so do that this way */ + /* it is at least more SMP friendly (in future...) */ oldname = server->auth.object_name; oldnamelen = server->auth.object_name_len; oldprivate = server->priv.data; @@ -678,7 +678,7 @@ static long __ncp_ioctl(struct inode *inode, unsigned int cmd, unsigned long arg server->auth.object_name = newname; server->priv.len = 0; server->priv.data = NULL; - up_write(&server->auth_rwsem); + /* leave critical section */ kfree(oldprivate); kfree(oldname); return 0; @@ -688,6 +688,8 @@ static long __ncp_ioctl(struct inode *inode, unsigned int cmd, unsigned long arg case NCP_IOC_GETPRIVATEDATA_32: #endif case NCP_IOC_GETPRIVATEDATA: + if (uid != server->m.mounted_uid) + return -EACCES; { struct ncp_privatedata_ioctl user; size_t outl; @@ -704,20 +706,14 @@ static long __ncp_ioctl(struct inode *inode, unsigned int cmd, unsigned long arg if (copy_from_user(&user, argp, sizeof(user))) return -EFAULT; - down_read(&server->auth_rwsem); outl = user.len; user.len = server->priv.len; if (outl > user.len) outl = user.len; - result = 0; if (outl) { if (copy_to_user(user.data, server->priv.data, - outl)) - result = -EFAULT; + outl)) return -EFAULT; } - up_read(&server->auth_rwsem); - if (result) - return result; #ifdef CONFIG_COMPAT if (cmd == NCP_IOC_GETPRIVATEDATA_32) { struct compat_ncp_privatedata_ioctl user32; @@ -737,6 +733,8 @@ static long __ncp_ioctl(struct inode *inode, unsigned int cmd, unsigned long arg case NCP_IOC_SETPRIVATEDATA_32: #endif case NCP_IOC_SETPRIVATEDATA: + if (uid != server->m.mounted_uid) + return -EACCES; { struct ncp_privatedata_ioctl user; void* new; @@ -764,12 +762,12 @@ static long __ncp_ioctl(struct inode *inode, unsigned int cmd, unsigned long arg } else { new = NULL; } - down_write(&server->auth_rwsem); + /* enter critical section */ old = server->priv.data; oldlen = server->priv.len; server->priv.len = user.len; server->priv.data = new; - up_write(&server->auth_rwsem); + /* leave critical section */ kfree(old); return 0; } @@ -777,13 +775,17 @@ static long __ncp_ioctl(struct inode *inode, unsigned int cmd, unsigned long arg #ifdef CONFIG_NCPFS_NLS case NCP_IOC_SETCHARSETS: return ncp_set_charsets(server, argp); - + case NCP_IOC_GETCHARSETS: return ncp_get_charsets(server, argp); #endif /* CONFIG_NCPFS_NLS */ case NCP_IOC_SETDENTRYTTL: + if (file_permission(filp, MAY_WRITE) != 0 && + uid != server->m.mounted_uid) + return -EACCES; + { u_int32_t user; @@ -793,13 +795,13 @@ static long __ncp_ioctl(struct inode *inode, unsigned int cmd, unsigned long arg if (user > 20000) return -EINVAL; user = (user * HZ) / 1000; - atomic_set(&server->dentry_ttl, user); + server->dentry_ttl = user; return 0; } - + case NCP_IOC_GETDENTRYTTL: { - u_int32_t user = (atomic_read(&server->dentry_ttl) * 1000) / HZ; + u_int32_t user = (server->dentry_ttl * 1000) / HZ; if (copy_to_user(argp, &user, sizeof(user))) return -EFAULT; return 0; @@ -809,103 +811,59 @@ static long __ncp_ioctl(struct inode *inode, unsigned int cmd, unsigned long arg return -EINVAL; } -long ncp_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) +static int ncp_ioctl_need_write(unsigned int cmd) { - struct inode *inode = filp->f_dentry->d_inode; - struct ncp_server *server = NCP_SERVER(inode); - uid_t uid = current_uid(); - int need_drop_write = 0; - long ret; - switch (cmd) { + case NCP_IOC_GET_FS_INFO: + case NCP_IOC_GET_FS_INFO_V2: + case NCP_IOC_NCPREQUEST: + case NCP_IOC_SETDENTRYTTL: + case NCP_IOC_SIGN_INIT: + case NCP_IOC_LOCKUNLOCK: + case NCP_IOC_SET_SIGN_WANTED: + return 1; + case NCP_IOC_GETOBJECTNAME: + case NCP_IOC_SETOBJECTNAME: + case NCP_IOC_GETPRIVATEDATA: + case NCP_IOC_SETPRIVATEDATA: case NCP_IOC_SETCHARSETS: + case NCP_IOC_GETCHARSETS: case NCP_IOC_CONN_LOGGED_IN: + case NCP_IOC_GETDENTRYTTL: + case NCP_IOC_GETMOUNTUID2: + case NCP_IOC_SIGN_WANTED: + case NCP_IOC_GETROOT: case NCP_IOC_SETROOT: - if (!capable(CAP_SYS_ADMIN)) { - ret = -EACCES; - goto out; - } - break; + return 0; + default: + /* unknown IOCTL command, assume write */ + return 1; } - if (server->m.mounted_uid != uid) { - switch (cmd) { +} + +long ncp_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) +{ + long ret; + + lock_kernel(); + if (ncp_ioctl_need_write(cmd)) { /* - * Only mount owner can issue these ioctls. Information - * necessary to authenticate to other NDS servers are - * stored here. + * inside the ioctl(), any failures which + * are because of file_permission() are + * -EACCESS, so it seems consistent to keep + * that here. */ - case NCP_IOC_GETOBJECTNAME: - case NCP_IOC_SETOBJECTNAME: - case NCP_IOC_GETPRIVATEDATA: - case NCP_IOC_SETPRIVATEDATA: -#ifdef CONFIG_COMPAT - case NCP_IOC_GETOBJECTNAME_32: - case NCP_IOC_SETOBJECTNAME_32: - case NCP_IOC_GETPRIVATEDATA_32: - case NCP_IOC_SETPRIVATEDATA_32: -#endif + if (mnt_want_write(filp->f_path.mnt)) { ret = -EACCES; goto out; - /* - * These require write access on the inode if user id - * does not match. Note that they do not write to the - * file... But old code did mnt_want_write, so I keep - * it as is. Of course not for mountpoint owner, as - * that breaks read-only mounts altogether as ncpmount - * needs working NCP_IOC_NCPREQUEST and - * NCP_IOC_GET_FS_INFO. Some of these codes (setdentryttl, - * signinit, setsignwanted) should be probably restricted - * to owner only, or even more to CAP_SYS_ADMIN). - */ - case NCP_IOC_GET_FS_INFO: - case NCP_IOC_GET_FS_INFO_V2: - case NCP_IOC_NCPREQUEST: - case NCP_IOC_SETDENTRYTTL: - case NCP_IOC_SIGN_INIT: - case NCP_IOC_LOCKUNLOCK: - case NCP_IOC_SET_SIGN_WANTED: -#ifdef CONFIG_COMPAT - case NCP_IOC_GET_FS_INFO_V2_32: - case NCP_IOC_NCPREQUEST_32: -#endif - ret = mnt_want_write_file(filp); - if (ret) - goto out; - need_drop_write = 1; - ret = inode_permission(inode, MAY_WRITE); - if (ret) - goto outDropWrite; - break; - /* - * Read access required. - */ - case NCP_IOC_GETMOUNTUID16: - case NCP_IOC_GETMOUNTUID32: - case NCP_IOC_GETMOUNTUID64: - case NCP_IOC_GETROOT: - case NCP_IOC_SIGN_WANTED: - ret = inode_permission(inode, MAY_READ); - if (ret) - goto out; - break; - /* - * Anybody can read these. - */ - case NCP_IOC_GETCHARSETS: - case NCP_IOC_GETDENTRYTTL: - default: - /* Three codes below are protected by CAP_SYS_ADMIN above. */ - case NCP_IOC_SETCHARSETS: - case NCP_IOC_CONN_LOGGED_IN: - case NCP_IOC_SETROOT: - break; } } - ret = __ncp_ioctl(inode, cmd, arg); -outDropWrite: - if (need_drop_write) + ret = __ncp_ioctl(filp, cmd, arg); + if (ncp_ioctl_need_write(cmd)) mnt_drop_write(filp->f_path.mnt); + out: + unlock_kernel(); return ret; } @@ -914,8 +872,10 @@ long ncp_compat_ioctl(struct file *file, unsigned int cmd, unsigned long arg) { long ret; + lock_kernel(); arg = (unsigned long) compat_ptr(arg); ret = ncp_ioctl(file, cmd, arg); + unlock_kernel(); return ret; } #endif diff --git a/trunk/fs/ncpfs/ncplib_kernel.c b/trunk/fs/ncpfs/ncplib_kernel.c index a95615a0b6ac..0ec6237a5970 100644 --- a/trunk/fs/ncpfs/ncplib_kernel.c +++ b/trunk/fs/ncpfs/ncplib_kernel.c @@ -107,17 +107,17 @@ ncp_reply_data(struct ncp_server *server, int offset) return &(server->packet[sizeof(struct ncp_reply_header) + offset]); } -static inline u8 BVAL(const void *data) +static inline u8 BVAL(void *data) { - return *(const u8 *)data; + return *(u8 *)data; } static u8 ncp_reply_byte(struct ncp_server *server, int offset) { - return *(const u8 *)ncp_reply_data(server, offset); + return *(u8 *)ncp_reply_data(server, offset); } -static inline u16 WVAL_LH(const void *data) +static inline u16 WVAL_LH(void *data) { return get_unaligned_le16(data); } @@ -134,7 +134,7 @@ ncp_reply_be16(struct ncp_server *server, int offset) return get_unaligned_be16(ncp_reply_data(server, offset)); } -static inline u32 DVAL_LH(const void *data) +static inline u32 DVAL_LH(void *data) { return get_unaligned_le32(data); } @@ -349,9 +349,9 @@ int ncp_dirhandle_free(struct ncp_server* server, __u8 dirhandle) { return result; } -void ncp_extract_file_info(const void *structure, struct nw_info_struct *target) +void ncp_extract_file_info(void *structure, struct nw_info_struct *target) { - const __u8 *name_len; + __u8 *name_len; const int info_struct_size = offsetof(struct nw_info_struct, nameLen); memcpy(target, structure, info_struct_size); @@ -364,7 +364,7 @@ void ncp_extract_file_info(const void *structure, struct nw_info_struct *target) } #ifdef CONFIG_NCPFS_NFS_NS -static inline void ncp_extract_nfs_info(const unsigned char *structure, +static inline void ncp_extract_nfs_info(unsigned char *structure, struct nw_nfs_info *target) { target->mode = DVAL_LH(structure); @@ -417,7 +417,7 @@ int ncp_obtain_nfs_info(struct ncp_server *server, * Returns information for a (one-component) name relative to * the specified directory. */ -int ncp_obtain_info(struct ncp_server *server, struct inode *dir, const char *path, +int ncp_obtain_info(struct ncp_server *server, struct inode *dir, char *path, struct nw_info_struct *target) { __u8 volnum = NCP_FINFO(dir)->volNumber; @@ -452,16 +452,16 @@ int ncp_obtain_info(struct ncp_server *server, struct inode *dir, const char *pa #ifdef CONFIG_NCPFS_NFS_NS static int ncp_obtain_DOS_dir_base(struct ncp_server *server, - __u8 ns, __u8 volnum, __le32 dirent, - const char *path, /* At most 1 component */ + __u8 volnum, __le32 dirent, + char *path, /* At most 1 component */ __le32 *DOS_dir_base) { int result; ncp_init_request(server); ncp_add_byte(server, 6); /* subfunction */ - ncp_add_byte(server, ns); - ncp_add_byte(server, ns); + ncp_add_byte(server, server->name_space[volnum]); + ncp_add_byte(server, server->name_space[volnum]); ncp_add_word(server, cpu_to_le16(0x8006)); /* get all */ ncp_add_dword(server, RIM_DIRECTORY); ncp_add_handle_path(server, volnum, dirent, 1, path); @@ -523,27 +523,10 @@ ncp_get_known_namespace(struct ncp_server *server, __u8 volume) #endif /* defined(CONFIG_NCPFS_OS2_NS) || defined(CONFIG_NCPFS_NFS_NS) */ } -int -ncp_update_known_namespace(struct ncp_server *server, __u8 volume, int *ret_ns) -{ - int ns = ncp_get_known_namespace(server, volume); - - if (ret_ns) - *ret_ns = ns; - - DPRINTK("lookup_vol: namespace[%d] = %d\n", - volume, server->name_space[volume]); - - if (server->name_space[volume] == ns) - return 0; - server->name_space[volume] = ns; - return 1; -} - static int ncp_ObtainSpecificDirBase(struct ncp_server *server, __u8 nsSrc, __u8 nsDst, __u8 vol_num, __le32 dir_base, - const char *path, /* At most 1 component */ + char *path, /* At most 1 component */ __le32 *dirEntNum, __le32 *DosDirNum) { int result; @@ -577,13 +560,14 @@ ncp_mount_subdir(struct ncp_server *server, { int dstNS; int result; - - ncp_update_known_namespace(server, volNumber, &dstNS); + + dstNS = ncp_get_known_namespace(server, volNumber); if ((result = ncp_ObtainSpecificDirBase(server, srcNS, dstNS, volNumber, dirEntNum, NULL, newDirEnt, newDosEnt)) != 0) { return result; } + server->name_space[volNumber] = dstNS; *volume = volNumber; server->m.mounted_vol[1] = 0; server->m.mounted_vol[0] = 'X'; @@ -591,10 +575,11 @@ ncp_mount_subdir(struct ncp_server *server, } int -ncp_get_volume_root(struct ncp_server *server, - const char *volname, __u32* volume, __le32* dirent, __le32* dosdirent) +ncp_get_volume_root(struct ncp_server *server, const char *volname, + __u32* volume, __le32* dirent, __le32* dosdirent) { int result; + __u8 volnum; DPRINTK("ncp_get_volume_root: looking up vol %s\n", volname); @@ -616,14 +601,21 @@ ncp_get_volume_root(struct ncp_server *server, return result; } *dirent = *dosdirent = ncp_reply_dword(server, 4); - *volume = ncp_reply_byte(server, 8); + volnum = ncp_reply_byte(server, 8); ncp_unlock_server(server); + *volume = volnum; + + server->name_space[volnum] = ncp_get_known_namespace(server, volnum); + + DPRINTK("lookup_vol: namespace[%d] = %d\n", + volnum, server->name_space[volnum]); + return 0; } int -ncp_lookup_volume(struct ncp_server *server, - const char *volname, struct nw_info_struct *target) +ncp_lookup_volume(struct ncp_server *server, const char *volname, + struct nw_info_struct *target) { int result; @@ -633,7 +625,6 @@ ncp_lookup_volume(struct ncp_server *server, if (result) { return result; } - ncp_update_known_namespace(server, target->volNumber, NULL); target->nameLen = strlen(volname); memcpy(target->entryName, volname, target->nameLen+1); target->attributes = aDIR; @@ -685,8 +676,8 @@ int ncp_modify_nfs_info(struct ncp_server *server, __u8 volnum, __le32 dirent, { int result = 0; - ncp_init_request(server); if (server->name_space[volnum] == NW_NS_NFS) { + ncp_init_request(server); ncp_add_byte(server, 25); /* subfunction */ ncp_add_byte(server, server->name_space[volnum]); ncp_add_byte(server, NW_NS_NFS); @@ -699,8 +690,8 @@ int ncp_modify_nfs_info(struct ncp_server *server, __u8 volnum, __le32 dirent, ncp_add_dword_lh(server, 1); /* nlinks */ ncp_add_dword_lh(server, rdev); result = ncp_request(server, 87); + ncp_unlock_server(server); } - ncp_unlock_server(server); return result; } #endif @@ -709,7 +700,7 @@ int ncp_modify_nfs_info(struct ncp_server *server, __u8 volnum, __le32 dirent, static int ncp_DeleteNSEntry(struct ncp_server *server, __u8 have_dir_base, __u8 volnum, __le32 dirent, - const char* name, __u8 ns, __le16 attr) + char* name, __u8 ns, __le16 attr) { int result; @@ -743,25 +734,23 @@ ncp_del_file_or_subdir2(struct ncp_server *server, int ncp_del_file_or_subdir(struct ncp_server *server, - struct inode *dir, const char *name) + struct inode *dir, char *name) { __u8 volnum = NCP_FINFO(dir)->volNumber; __le32 dirent = NCP_FINFO(dir)->dirEntNum; - int name_space; - name_space = server->name_space[volnum]; #ifdef CONFIG_NCPFS_NFS_NS - if (name_space == NW_NS_NFS) + if (server->name_space[volnum]==NW_NS_NFS) { int result; - result=ncp_obtain_DOS_dir_base(server, name_space, volnum, dirent, name, &dirent); + result=ncp_obtain_DOS_dir_base(server, volnum, dirent, name, &dirent); if (result) return result; - name = NULL; - name_space = NW_NS_DOS; + return ncp_DeleteNSEntry(server, 1, volnum, dirent, NULL, NW_NS_DOS, cpu_to_le16(0x8006)); } + else #endif /* CONFIG_NCPFS_NFS_NS */ - return ncp_DeleteNSEntry(server, 1, volnum, dirent, name, name_space, cpu_to_le16(0x8006)); + return ncp_DeleteNSEntry(server, 1, volnum, dirent, name, server->name_space[volnum], cpu_to_le16(0x8006)); } static inline void ConvertToNWfromDWORD(__u16 v0, __u16 v1, __u8 ret[6]) @@ -776,7 +765,7 @@ static inline void ConvertToNWfromDWORD(__u16 v0, __u16 v1, __u8 ret[6]) /* If both dir and name are NULL, then in target there's already a looked-up entry that wants to be opened. */ int ncp_open_create_file_or_subdir(struct ncp_server *server, - struct inode *dir, const char *name, + struct inode *dir, char *name, int open_create_mode, __le32 create_attributes, __le16 desired_acc_rights, @@ -901,8 +890,8 @@ int ncp_search_for_fileset(struct ncp_server *server, static int ncp_RenameNSEntry(struct ncp_server *server, - struct inode *old_dir, const char *old_name, __le16 old_type, - struct inode *new_dir, const char *new_name) + struct inode *old_dir, char *old_name, __le16 old_type, + struct inode *new_dir, char *new_name) { int result = -EINVAL; @@ -940,8 +929,8 @@ ncp_RenameNSEntry(struct ncp_server *server, } int ncp_ren_or_mov_file_or_subdir(struct ncp_server *server, - struct inode *old_dir, const char *old_name, - struct inode *new_dir, const char *new_name) + struct inode *old_dir, char *old_name, + struct inode *new_dir, char *new_name) { int result; __le16 old_type = cpu_to_le16(0x06); @@ -969,7 +958,7 @@ int ncp_read_kernel(struct ncp_server *server, const char *file_id, __u32 offset, __u16 to_read, char *target, int *bytes_read) { - const char *source; + char *source; int result; ncp_init_request(server); diff --git a/trunk/fs/ncpfs/ncplib_kernel.h b/trunk/fs/ncpfs/ncplib_kernel.h index 3c57eca634ce..2441d1ab57dc 100644 --- a/trunk/fs/ncpfs/ncplib_kernel.h +++ b/trunk/fs/ncpfs/ncplib_kernel.h @@ -65,11 +65,10 @@ static inline void ncp_inode_close(struct inode *inode) { atomic_dec(&NCP_FINFO(inode)->opened); } -void ncp_extract_file_info(const void* src, struct nw_info_struct* target); -int ncp_obtain_info(struct ncp_server *server, struct inode *, const char *, +void ncp_extract_file_info(void* src, struct nw_info_struct* target); +int ncp_obtain_info(struct ncp_server *server, struct inode *, char *, struct nw_info_struct *target); int ncp_obtain_nfs_info(struct ncp_server *server, struct nw_info_struct *target); -int ncp_update_known_namespace(struct ncp_server *server, __u8 volume, int *ret_ns); int ncp_get_volume_root(struct ncp_server *server, const char *volname, __u32 *volume, __le32 *dirent, __le32 *dosdirent); int ncp_lookup_volume(struct ncp_server *, const char *, struct nw_info_struct *); @@ -81,8 +80,8 @@ int ncp_modify_nfs_info(struct ncp_server *, __u8 volnum, __le32 dirent, __u32 mode, __u32 rdev); int ncp_del_file_or_subdir2(struct ncp_server *, struct dentry*); -int ncp_del_file_or_subdir(struct ncp_server *, struct inode *, const char *); -int ncp_open_create_file_or_subdir(struct ncp_server *, struct inode *, const char *, +int ncp_del_file_or_subdir(struct ncp_server *, struct inode *, char *); +int ncp_open_create_file_or_subdir(struct ncp_server *, struct inode *, char *, int, __le32, __le16, struct ncp_entry_info *); int ncp_initialize_search(struct ncp_server *, struct inode *, @@ -94,7 +93,7 @@ int ncp_search_for_fileset(struct ncp_server *server, char** rbuf, size_t* rsize); int ncp_ren_or_mov_file_or_subdir(struct ncp_server *server, - struct inode *, const char *, struct inode *, const char *); + struct inode *, char *, struct inode *, char *); int @@ -171,13 +170,13 @@ static inline int ncp_strnicmp(struct nls_table *t, const unsigned char *s1, #endif /* CONFIG_NCPFS_NLS */ #define NCP_GET_AGE(dentry) (jiffies - (dentry)->d_time) -#define NCP_MAX_AGE(server) atomic_read(&(server)->dentry_ttl) +#define NCP_MAX_AGE(server) ((server)->dentry_ttl) #define NCP_TEST_AGE(server,dentry) (NCP_GET_AGE(dentry) < NCP_MAX_AGE(server)) static inline void ncp_age_dentry(struct ncp_server* server, struct dentry* dentry) { - dentry->d_time = jiffies - NCP_MAX_AGE(server); + dentry->d_time = jiffies - server->dentry_ttl; } static inline void diff --git a/trunk/fs/ncpfs/ncpsign_kernel.c b/trunk/fs/ncpfs/ncpsign_kernel.c index d8b2d7e6910b..7c0b5c21e6cf 100644 --- a/trunk/fs/ncpfs/ncpsign_kernel.c +++ b/trunk/fs/ncpfs/ncpsign_kernel.c @@ -15,21 +15,21 @@ /* i386: 32-bit, little endian, handles mis-alignment */ #ifdef __i386__ -#define GET_LE32(p) (*(const int *)(p)) +#define GET_LE32(p) (*(int *)(p)) #define PUT_LE32(p,v) { *(int *)(p)=v; } #else /* from include/ncplib.h */ -#define BVAL(buf,pos) (((const __u8 *)(buf))[pos]) +#define BVAL(buf,pos) (((__u8 *)(buf))[pos]) #define PVAL(buf,pos) ((unsigned)BVAL(buf,pos)) -#define BSET(buf,pos,val) (((__u8 *)(buf))[pos] = (val)) +#define BSET(buf,pos,val) (BVAL(buf,pos) = (val)) static inline __u16 -WVAL_LH(const __u8 * buf, int pos) +WVAL_LH(__u8 * buf, int pos) { return PVAL(buf, pos) | PVAL(buf, pos + 1) << 8; } static inline __u32 -DVAL_LH(const __u8 * buf, int pos) +DVAL_LH(__u8 * buf, int pos) { return WVAL_LH(buf, pos) | WVAL_LH(buf, pos + 2) << 16; } diff --git a/trunk/fs/ncpfs/sock.c b/trunk/fs/ncpfs/sock.c index 668bd267346e..c7ff6c700a6e 100644 --- a/trunk/fs/ncpfs/sock.c +++ b/trunk/fs/ncpfs/sock.c @@ -746,6 +746,7 @@ static int ncp_do_request(struct ncp_server *server, int size, return -EIO; } if (!ncp_conn_valid(server)) { + printk(KERN_ERR "ncpfs: Connection invalid!\n"); return -EIO; } { diff --git a/trunk/fs/nfs/Kconfig b/trunk/fs/nfs/Kconfig index b950415d7c43..f7e13db613cb 100644 --- a/trunk/fs/nfs/Kconfig +++ b/trunk/fs/nfs/Kconfig @@ -1,7 +1,6 @@ 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 diff --git a/trunk/fs/nfs/delegation.c b/trunk/fs/nfs/delegation.c index 232a7eead33a..b9c3c43cea1d 100644 --- a/trunk/fs/nfs/delegation.c +++ b/trunk/fs/nfs/delegation.c @@ -71,20 +71,20 @@ static int nfs_delegation_claim_locks(struct nfs_open_context *ctx, struct nfs4_ if (inode->i_flock == NULL) goto out; - /* Protect inode->i_flock using the file locks lock */ - lock_flocks(); + /* Protect inode->i_flock using the BKL */ + lock_kernel(); for (fl = inode->i_flock; fl != NULL; fl = fl->fl_next) { if (!(fl->fl_flags & (FL_POSIX|FL_FLOCK))) continue; if (nfs_file_open_context(fl->fl_file) != ctx) continue; - unlock_flocks(); + unlock_kernel(); status = nfs4_lock_delegation_recall(state, fl); if (status < 0) goto out; - lock_flocks(); + lock_kernel(); } - unlock_flocks(); + unlock_kernel(); out: return status; } diff --git a/trunk/fs/nfs/nfs4state.c b/trunk/fs/nfs/nfs4state.c index 96524c5dca6b..3e2f19b04c06 100644 --- a/trunk/fs/nfs/nfs4state.c +++ b/trunk/fs/nfs/nfs4state.c @@ -40,7 +40,7 @@ #include #include -#include +#include #include #include #include @@ -970,13 +970,13 @@ static int nfs4_reclaim_locks(struct nfs4_state *state, const struct nfs4_state_ /* Guard against delegation returns and new lock/unlock calls */ down_write(&nfsi->rwsem); /* Protect inode->i_flock using the BKL */ - lock_flocks(); + lock_kernel(); for (fl = inode->i_flock; fl != NULL; fl = fl->fl_next) { if (!(fl->fl_flags & (FL_POSIX|FL_FLOCK))) continue; if (nfs_file_open_context(fl->fl_file)->state != state) continue; - unlock_flocks(); + unlock_kernel(); status = ops->recover_lock(state, fl); switch (status) { case 0: @@ -1003,9 +1003,9 @@ static int nfs4_reclaim_locks(struct nfs4_state *state, const struct nfs4_state_ /* kill_proc(fl->fl_pid, SIGLOST, 1); */ status = 0; } - lock_flocks(); + lock_kernel(); } - unlock_flocks(); + unlock_kernel(); out: up_write(&nfsi->rwsem); return status; diff --git a/trunk/fs/nfsd/Kconfig b/trunk/fs/nfsd/Kconfig index 7cf4ddafb4ab..4264377552e2 100644 --- a/trunk/fs/nfsd/Kconfig +++ b/trunk/fs/nfsd/Kconfig @@ -2,7 +2,6 @@ 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 diff --git a/trunk/fs/nfsd/nfs4state.c b/trunk/fs/nfsd/nfs4state.c index a7292fcf7718..cf0d2ffb3c84 100644 --- a/trunk/fs/nfsd/nfs4state.c +++ b/trunk/fs/nfsd/nfs4state.c @@ -33,7 +33,7 @@ */ #include -#include +#include #include #include #include @@ -3895,7 +3895,7 @@ check_for_locks(struct nfs4_file *filp, struct nfs4_stateowner *lowner) struct inode *inode = filp->fi_inode; int status = 0; - lock_flocks(); + lock_kernel(); for (flpp = &inode->i_flock; *flpp != NULL; flpp = &(*flpp)->fl_next) { if ((*flpp)->fl_owner == (fl_owner_t)lowner) { status = 1; @@ -3903,7 +3903,7 @@ check_for_locks(struct nfs4_file *filp, struct nfs4_stateowner *lowner) } } out: - unlock_flocks(); + unlock_kernel(); return status; } diff --git a/trunk/fs/nfsd/nfsctl.c b/trunk/fs/nfsd/nfsctl.c index 06fa87e52e82..b53b1d042f1f 100644 --- a/trunk/fs/nfsd/nfsctl.c +++ b/trunk/fs/nfsd/nfsctl.c @@ -137,7 +137,6 @@ static const struct file_operations transaction_ops = { .write = nfsctl_transaction_write, .read = nfsctl_transaction_read, .release = simple_transaction_release, - .llseek = default_llseek, }; static int exports_open(struct inode *inode, struct file *file) diff --git a/trunk/fs/nilfs2/ioctl.c b/trunk/fs/nilfs2/ioctl.c index 0442ee3b394f..f90a33d9a5b0 100644 --- a/trunk/fs/nilfs2/ioctl.c +++ b/trunk/fs/nilfs2/ioctl.c @@ -22,6 +22,7 @@ #include #include +#include /* lock_kernel(), unlock_kernel() */ #include #include /* capable() */ #include /* copy_from_user(), copy_to_user() */ diff --git a/trunk/fs/nilfs2/super.c b/trunk/fs/nilfs2/super.c index 9f4913f78408..922263393c76 100644 --- a/trunk/fs/nilfs2/super.c +++ b/trunk/fs/nilfs2/super.c @@ -45,6 +45,7 @@ #include #include #include +#include #include #include #include @@ -341,6 +342,8 @@ static void nilfs_put_super(struct super_block *sb) struct nilfs_sb_info *sbi = NILFS_SB(sb); struct the_nilfs *nilfs = sbi->s_nilfs; + lock_kernel(); + nilfs_detach_segment_constructor(sbi); if (!(sb->s_flags & MS_RDONLY)) { @@ -358,6 +361,8 @@ static void nilfs_put_super(struct super_block *sb) sbi->s_super = NULL; sb->s_fs_info = NULL; nilfs_put_sbinfo(sbi); + + unlock_kernel(); } static int nilfs_sync_fs(struct super_block *sb, int wait) @@ -944,6 +949,8 @@ static int nilfs_remount(struct super_block *sb, int *flags, char *data) struct nilfs_mount_options old_opts; int was_snapshot, err; + lock_kernel(); + down_write(&nilfs->ns_super_sem); old_sb_flags = sb->s_flags; old_opts.mount_opt = sbi->s_mount_opt; @@ -1017,6 +1024,7 @@ static int nilfs_remount(struct super_block *sb, int *flags, char *data) } out: up_write(&nilfs->ns_super_sem); + unlock_kernel(); return 0; restore_opts: @@ -1024,6 +1032,7 @@ static int nilfs_remount(struct super_block *sb, int *flags, char *data) sbi->s_mount_opt = old_opts.mount_opt; sbi->s_snapshot_cno = old_opts.snapshot_cno; up_write(&nilfs->ns_super_sem); + unlock_kernel(); return err; } @@ -1196,6 +1205,7 @@ nilfs_get_sb(struct file_system_type *fs_type, int flags, put_nilfs(nilfs); failed: close_bdev_exclusive(sd.bdev, mode); + return err; cancel_new: diff --git a/trunk/fs/no-block.c b/trunk/fs/no-block.c index 6e40e42a43de..d269a93d3467 100644 --- a/trunk/fs/no-block.c +++ b/trunk/fs/no-block.c @@ -19,5 +19,4 @@ static int no_blkdev_open(struct inode * inode, struct file * filp) const struct file_operations def_blk_fops = { .open = no_blkdev_open, - .llseek = noop_llseek, }; diff --git a/trunk/fs/notify/fanotify/fanotify_user.c b/trunk/fs/notify/fanotify/fanotify_user.c index bbcb98e7fcc6..5ed8e58d7bfc 100644 --- a/trunk/fs/notify/fanotify/fanotify_user.c +++ b/trunk/fs/notify/fanotify/fanotify_user.c @@ -433,7 +433,6 @@ static const struct file_operations fanotify_fops = { .release = fanotify_release, .unlocked_ioctl = fanotify_ioctl, .compat_ioctl = fanotify_ioctl, - .llseek = noop_llseek, }; static void fanotify_free_mark(struct fsnotify_mark *fsn_mark) diff --git a/trunk/fs/notify/inotify/inotify_user.c b/trunk/fs/notify/inotify/inotify_user.c index 24edc1185d53..bf7f6d776c31 100644 --- a/trunk/fs/notify/inotify/inotify_user.c +++ b/trunk/fs/notify/inotify/inotify_user.c @@ -344,7 +344,6 @@ static const struct file_operations inotify_fops = { .release = inotify_release, .unlocked_ioctl = inotify_ioctl, .compat_ioctl = inotify_ioctl, - .llseek = noop_llseek, }; diff --git a/trunk/fs/ntfs/super.c b/trunk/fs/ntfs/super.c index 19c5180f8a28..512806171bfa 100644 --- a/trunk/fs/ntfs/super.c +++ b/trunk/fs/ntfs/super.c @@ -30,6 +30,7 @@ #include #include #include +#include #include #include "sysctl.h" @@ -444,6 +445,7 @@ static int ntfs_remount(struct super_block *sb, int *flags, char *opt) ntfs_debug("Entering with remount options string: %s", opt); + lock_kernel(); #ifndef NTFS_RW /* For read-only compiled driver, enforce read-only flag. */ *flags |= MS_RDONLY; @@ -467,15 +469,18 @@ static int ntfs_remount(struct super_block *sb, int *flags, char *opt) if (NVolErrors(vol)) { ntfs_error(sb, "Volume has errors and is read-only%s", es); + unlock_kernel(); return -EROFS; } if (vol->vol_flags & VOLUME_IS_DIRTY) { ntfs_error(sb, "Volume is dirty and read-only%s", es); + unlock_kernel(); return -EROFS; } if (vol->vol_flags & VOLUME_MODIFIED_BY_CHKDSK) { ntfs_error(sb, "Volume has been modified by chkdsk " "and is read-only%s", es); + unlock_kernel(); return -EROFS; } if (vol->vol_flags & VOLUME_MUST_MOUNT_RO_MASK) { @@ -483,11 +488,13 @@ static int ntfs_remount(struct super_block *sb, int *flags, char *opt) "(0x%x) and is read-only%s", (unsigned)le16_to_cpu(vol->vol_flags), es); + unlock_kernel(); return -EROFS; } if (ntfs_set_volume_flags(vol, VOLUME_IS_DIRTY)) { ntfs_error(sb, "Failed to set dirty bit in volume " "information flags%s", es); + unlock_kernel(); return -EROFS; } #if 0 @@ -507,18 +514,21 @@ static int ntfs_remount(struct super_block *sb, int *flags, char *opt) ntfs_error(sb, "Failed to empty journal $LogFile%s", es); NVolSetErrors(vol); + unlock_kernel(); return -EROFS; } if (!ntfs_mark_quotas_out_of_date(vol)) { ntfs_error(sb, "Failed to mark quotas out of date%s", es); NVolSetErrors(vol); + unlock_kernel(); return -EROFS; } if (!ntfs_stamp_usnjrnl(vol)) { ntfs_error(sb, "Failed to stamp transation log " "($UsnJrnl)%s", es); NVolSetErrors(vol); + unlock_kernel(); return -EROFS; } } else if (!(sb->s_flags & MS_RDONLY) && (*flags & MS_RDONLY)) { @@ -534,9 +544,11 @@ static int ntfs_remount(struct super_block *sb, int *flags, char *opt) // TODO: Deal with *flags. - if (!parse_options(vol, opt)) + if (!parse_options(vol, opt)) { + unlock_kernel(); return -EINVAL; - + } + unlock_kernel(); ntfs_debug("Done."); return 0; } @@ -2249,6 +2261,8 @@ static void ntfs_put_super(struct super_block *sb) ntfs_debug("Entering."); + lock_kernel(); + #ifdef NTFS_RW /* * Commit all inodes while they are still open in case some of them @@ -2419,6 +2433,8 @@ static void ntfs_put_super(struct super_block *sb) sb->s_fs_info = NULL; kfree(vol); + + unlock_kernel(); } /** @@ -2756,6 +2772,8 @@ static int ntfs_fill_super(struct super_block *sb, void *opt, const int silent) init_rwsem(&vol->mftbmp_lock); init_rwsem(&vol->lcnbmp_lock); + unlock_kernel(); + /* By default, enable sparse support. */ NVolSetSparseEnabled(vol); @@ -2922,6 +2940,7 @@ static int ntfs_fill_super(struct super_block *sb, void *opt, const int silent) } mutex_unlock(&ntfs_lock); sb->s_export_op = &ntfs_export_ops; + lock_kernel(); lockdep_on(); return 0; } @@ -3038,6 +3057,7 @@ static int ntfs_fill_super(struct super_block *sb, void *opt, const int silent) } /* Errors at this stage are irrelevant. */ err_out_now: + lock_kernel(); sb->s_fs_info = NULL; kfree(vol); ntfs_debug("Failed, returning -EINVAL."); diff --git a/trunk/fs/ocfs2/dlmfs/dlmfs.c b/trunk/fs/ocfs2/dlmfs/dlmfs.c index a7ebd9d42dc8..c2903b84bb7a 100644 --- a/trunk/fs/ocfs2/dlmfs/dlmfs.c +++ b/trunk/fs/ocfs2/dlmfs/dlmfs.c @@ -612,7 +612,6 @@ static const struct file_operations dlmfs_file_operations = { .poll = dlmfs_file_poll, .read = dlmfs_file_read, .write = dlmfs_file_write, - .llseek = default_llseek, }; static const struct inode_operations dlmfs_dir_inode_operations = { diff --git a/trunk/fs/ocfs2/stack_user.c b/trunk/fs/ocfs2/stack_user.c index 252e7c82f929..2dc57bca0688 100644 --- a/trunk/fs/ocfs2/stack_user.c +++ b/trunk/fs/ocfs2/stack_user.c @@ -22,6 +22,7 @@ #include #include #include +#include #include #include @@ -611,10 +612,12 @@ static int ocfs2_control_open(struct inode *inode, struct file *file) return -ENOMEM; p->op_this_node = -1; + lock_kernel(); mutex_lock(&ocfs2_control_lock); file->private_data = p; list_add(&p->op_list, &ocfs2_control_private_list); mutex_unlock(&ocfs2_control_lock); + unlock_kernel(); return 0; } @@ -625,7 +628,6 @@ static const struct file_operations ocfs2_control_fops = { .read = ocfs2_control_read, .write = ocfs2_control_write, .owner = THIS_MODULE, - .llseek = default_llseek, }; static struct miscdevice ocfs2_control_device = { diff --git a/trunk/fs/ocfs2/super.c b/trunk/fs/ocfs2/super.c index 56f0cb395820..a8a0ca44f88f 100644 --- a/trunk/fs/ocfs2/super.c +++ b/trunk/fs/ocfs2/super.c @@ -630,6 +630,8 @@ static int ocfs2_remount(struct super_block *sb, int *flags, char *data) struct ocfs2_super *osb = OCFS2_SB(sb); u32 tmp; + lock_kernel(); + if (!ocfs2_parse_options(sb, data, &parsed_options, 1) || !ocfs2_check_set_options(sb, &parsed_options)) { ret = -EINVAL; @@ -737,6 +739,7 @@ static int ocfs2_remount(struct super_block *sb, int *flags, char *data) MS_POSIXACL : 0); } out: + unlock_kernel(); return ret; } @@ -1693,9 +1696,13 @@ static void ocfs2_put_super(struct super_block *sb) { mlog_entry("(0x%p)\n", sb); + lock_kernel(); + ocfs2_sync_blockdev(sb); ocfs2_dismount_volume(sb, 0); + unlock_kernel(); + mlog_exit_void(); } diff --git a/trunk/fs/proc/base.c b/trunk/fs/proc/base.c index dc5d5f51f3fe..8e4addaa5424 100644 --- a/trunk/fs/proc/base.c +++ b/trunk/fs/proc/base.c @@ -1151,7 +1151,6 @@ static ssize_t oom_score_adj_write(struct file *file, const char __user *buf, static const struct file_operations proc_oom_score_adj_operations = { .read = oom_score_adj_read, .write = oom_score_adj_write, - .llseek = default_llseek, }; #ifdef CONFIG_AUDITSYSCALL @@ -2040,13 +2039,11 @@ static ssize_t proc_fdinfo_read(struct file *file, char __user *buf, static const struct file_operations proc_fdinfo_file_operations = { .open = nonseekable_open, .read = proc_fdinfo_read, - .llseek = no_llseek, }; static const struct file_operations proc_fd_operations = { .read = generic_read_dir, .readdir = proc_readfd, - .llseek = default_llseek, }; /* @@ -2115,7 +2112,6 @@ static int proc_readfdinfo(struct file *filp, void *dirent, filldir_t filldir) static const struct file_operations proc_fdinfo_operations = { .read = generic_read_dir, .readdir = proc_readfdinfo, - .llseek = default_llseek, }; /* @@ -2347,7 +2343,6 @@ static int proc_attr_dir_readdir(struct file * filp, static const struct file_operations proc_attr_dir_operations = { .read = generic_read_dir, .readdir = proc_attr_dir_readdir, - .llseek = default_llseek, }; static struct dentry *proc_attr_dir_lookup(struct inode *dir, @@ -2756,7 +2751,6 @@ static int proc_tgid_base_readdir(struct file * filp, static const struct file_operations proc_tgid_base_operations = { .read = generic_read_dir, .readdir = proc_tgid_base_readdir, - .llseek = default_llseek, }; static struct dentry *proc_tgid_base_lookup(struct inode *dir, struct dentry *dentry, struct nameidata *nd){ @@ -3094,7 +3088,6 @@ static struct dentry *proc_tid_base_lookup(struct inode *dir, struct dentry *den static const struct file_operations proc_tid_base_operations = { .read = generic_read_dir, .readdir = proc_tid_base_readdir, - .llseek = default_llseek, }; static const struct inode_operations proc_tid_base_inode_operations = { @@ -3331,5 +3324,4 @@ static const struct inode_operations proc_task_inode_operations = { static const struct file_operations proc_task_operations = { .read = generic_read_dir, .readdir = proc_task_readdir, - .llseek = default_llseek, }; diff --git a/trunk/fs/proc/proc_sysctl.c b/trunk/fs/proc/proc_sysctl.c index 2fc52552271d..5be436ea088e 100644 --- a/trunk/fs/proc/proc_sysctl.c +++ b/trunk/fs/proc/proc_sysctl.c @@ -364,7 +364,6 @@ static int proc_sys_getattr(struct vfsmount *mnt, struct dentry *dentry, struct static const struct file_operations proc_sys_file_operations = { .read = proc_sys_read, .write = proc_sys_write, - .llseek = default_llseek, }; static const struct file_operations proc_sys_dir_file_operations = { diff --git a/trunk/fs/proc/root.c b/trunk/fs/proc/root.c index 93d99b316325..4258384ed22d 100644 --- a/trunk/fs/proc/root.c +++ b/trunk/fs/proc/root.c @@ -179,7 +179,6 @@ static int proc_root_readdir(struct file * filp, static const struct file_operations proc_root_operations = { .read = generic_read_dir, .readdir = proc_root_readdir, - .llseek = default_llseek, }; /* diff --git a/trunk/fs/proc/task_mmu.c b/trunk/fs/proc/task_mmu.c index 871e25ed0069..1dbca4e8cc16 100644 --- a/trunk/fs/proc/task_mmu.c +++ b/trunk/fs/proc/task_mmu.c @@ -539,7 +539,6 @@ static ssize_t clear_refs_write(struct file *file, const char __user *buf, const struct file_operations proc_clear_refs_operations = { .write = clear_refs_write, - .llseek = noop_llseek, }; struct pagemapread { diff --git a/trunk/fs/qnx4/dir.c b/trunk/fs/qnx4/dir.c index 7b0329468a5d..6e8fc62b40a8 100644 --- a/trunk/fs/qnx4/dir.c +++ b/trunk/fs/qnx4/dir.c @@ -11,6 +11,7 @@ * 20-06-1998 by Frank Denis : Linux 2.1.99+ & dcache support. */ +#include #include #include "qnx4.h" @@ -28,6 +29,8 @@ static int qnx4_readdir(struct file *filp, void *dirent, filldir_t filldir) QNX4DEBUG((KERN_INFO "qnx4_readdir:i_size = %ld\n", (long) inode->i_size)); QNX4DEBUG((KERN_INFO "filp->f_pos = %ld\n", (long) filp->f_pos)); + lock_kernel(); + while (filp->f_pos < inode->i_size) { blknum = qnx4_block_map( inode, filp->f_pos >> QNX4_BLOCK_SIZE_BITS ); bh = sb_bread(inode->i_sb, blknum); @@ -68,6 +71,7 @@ static int qnx4_readdir(struct file *filp, void *dirent, filldir_t filldir) brelse(bh); } out: + unlock_kernel(); return 0; } diff --git a/trunk/fs/qnx4/inode.c b/trunk/fs/qnx4/inode.c index 01bad30026fc..16829722be93 100644 --- a/trunk/fs/qnx4/inode.c +++ b/trunk/fs/qnx4/inode.c @@ -16,6 +16,7 @@ #include #include #include +#include #include #include #include @@ -156,6 +157,8 @@ static int qnx4_statfs(struct dentry *dentry, struct kstatfs *buf) struct super_block *sb = dentry->d_sb; u64 id = huge_encode_dev(sb->s_bdev->bd_dev); + lock_kernel(); + buf->f_type = sb->s_magic; buf->f_bsize = sb->s_blocksize; buf->f_blocks = le32_to_cpu(qnx4_sb(sb)->BitMap->di_size) * 8; @@ -165,6 +168,8 @@ static int qnx4_statfs(struct dentry *dentry, struct kstatfs *buf) buf->f_fsid.val[0] = (u32)id; buf->f_fsid.val[1] = (u32)(id >> 32); + unlock_kernel(); + return 0; } @@ -278,6 +283,7 @@ static int qnx4_fill_super(struct super_block *s, void *data, int silent) goto outi; brelse(bh); + return 0; outi: diff --git a/trunk/fs/qnx4/namei.c b/trunk/fs/qnx4/namei.c index 275327b5615e..58703ebba879 100644 --- a/trunk/fs/qnx4/namei.c +++ b/trunk/fs/qnx4/namei.c @@ -12,6 +12,7 @@ * 04-07-1998 by Frank Denis : first step for rmdir/unlink. */ +#include #include #include "qnx4.h" @@ -108,6 +109,7 @@ struct dentry * qnx4_lookup(struct inode *dir, struct dentry *dentry, struct nam int len = dentry->d_name.len; struct inode *foundinode = NULL; + lock_kernel(); if (!(bh = qnx4_find_entry(len, dir, name, &de, &ino))) goto out; /* The entry is linked, let's get the real info */ @@ -121,11 +123,13 @@ struct dentry * qnx4_lookup(struct inode *dir, struct dentry *dentry, struct nam foundinode = qnx4_iget(dir->i_sb, ino); if (IS_ERR(foundinode)) { + unlock_kernel(); QNX4DEBUG((KERN_ERR "qnx4: lookup->iget -> error %ld\n", PTR_ERR(foundinode))); return ERR_CAST(foundinode); } out: + unlock_kernel(); d_add(dentry, foundinode); return NULL; diff --git a/trunk/fs/read_write.c b/trunk/fs/read_write.c index e757ef26e4ce..74e36586e4d3 100644 --- a/trunk/fs/read_write.c +++ b/trunk/fs/read_write.c @@ -124,7 +124,7 @@ loff_t default_llseek(struct file *file, loff_t offset, int origin) { loff_t retval; - mutex_lock(&file->f_dentry->d_inode->i_mutex); + lock_kernel(); switch (origin) { case SEEK_END: offset += i_size_read(file->f_path.dentry->d_inode); @@ -145,7 +145,7 @@ loff_t default_llseek(struct file *file, loff_t offset, int origin) retval = offset; } out: - mutex_unlock(&file->f_dentry->d_inode->i_mutex); + unlock_kernel(); return retval; } EXPORT_SYMBOL(default_llseek); @@ -156,6 +156,7 @@ loff_t vfs_llseek(struct file *file, loff_t offset, int origin) fn = no_llseek; if (file->f_mode & FMODE_LSEEK) { + fn = default_llseek; if (file->f_op && file->f_op->llseek) fn = file->f_op->llseek; } diff --git a/trunk/fs/romfs/super.c b/trunk/fs/romfs/super.c index 268580535c92..42d213546894 100644 --- a/trunk/fs/romfs/super.c +++ b/trunk/fs/romfs/super.c @@ -282,7 +282,6 @@ static struct dentry *romfs_lookup(struct inode *dir, struct dentry *dentry, static const struct file_operations romfs_dir_operations = { .read = generic_read_dir, .readdir = romfs_readdir, - .llseek = default_llseek, }; static const struct inode_operations romfs_dir_inode_operations = { diff --git a/trunk/fs/signalfd.c b/trunk/fs/signalfd.c index 74047304b01a..1c5a6add779d 100644 --- a/trunk/fs/signalfd.c +++ b/trunk/fs/signalfd.c @@ -206,7 +206,6 @@ static const struct file_operations signalfd_fops = { .release = signalfd_release, .poll = signalfd_poll, .read = signalfd_read, - .llseek = noop_llseek, }; SYSCALL_DEFINE4(signalfd4, int, ufd, sigset_t __user *, user_mask, diff --git a/trunk/fs/smbfs/Kconfig b/trunk/fs/smbfs/Kconfig index 2bc24a8c4039..e668127c8b2e 100644 --- a/trunk/fs/smbfs/Kconfig +++ b/trunk/fs/smbfs/Kconfig @@ -1,6 +1,5 @@ config SMB_FS tristate "SMB file system support (OBSOLETE, please use CIFS)" - depends on BKL # probably unfixable depends on INET select NLS help diff --git a/trunk/fs/smbfs/inode.c b/trunk/fs/smbfs/inode.c index 8fc5e50e142f..450c91941988 100644 --- a/trunk/fs/smbfs/inode.c +++ b/trunk/fs/smbfs/inode.c @@ -501,8 +501,6 @@ static int smb_fill_super(struct super_block *sb, void *raw_data, int silent) void *mem; static int warn_count; - lock_kernel(); - if (warn_count < 5) { warn_count++; printk(KERN_EMERG "smbfs is deprecated and will be removed" @@ -623,7 +621,6 @@ static int smb_fill_super(struct super_block *sb, void *raw_data, int silent) smb_new_dentry(sb->s_root); - unlock_kernel(); return 0; out_no_root: @@ -646,11 +643,9 @@ static int smb_fill_super(struct super_block *sb, void *raw_data, int silent) out_no_data: printk(KERN_ERR "smb_fill_super: missing data argument\n"); out_fail: - unlock_kernel(); return -EINVAL; out_no_server: printk(KERN_ERR "smb_fill_super: cannot allocate struct smb_sb_info\n"); - unlock_kernel(); return -ENOMEM; } diff --git a/trunk/fs/squashfs/dir.c b/trunk/fs/squashfs/dir.c index 0dc340aa2be9..12b933ac6585 100644 --- a/trunk/fs/squashfs/dir.c +++ b/trunk/fs/squashfs/dir.c @@ -230,6 +230,5 @@ static int squashfs_readdir(struct file *file, void *dirent, filldir_t filldir) const struct file_operations squashfs_dir_ops = { .read = generic_read_dir, - .readdir = squashfs_readdir, - .llseek = default_llseek, + .readdir = squashfs_readdir }; diff --git a/trunk/fs/squashfs/super.c b/trunk/fs/squashfs/super.c index 07a4f1156048..88b4f8606652 100644 --- a/trunk/fs/squashfs/super.c +++ b/trunk/fs/squashfs/super.c @@ -30,6 +30,7 @@ #include #include #include +#include #include #include #include @@ -353,6 +354,8 @@ static int squashfs_remount(struct super_block *sb, int *flags, char *data) static void squashfs_put_super(struct super_block *sb) { + lock_kernel(); + if (sb->s_fs_info) { struct squashfs_sb_info *sbi = sb->s_fs_info; squashfs_cache_delete(sbi->block_cache); @@ -367,6 +370,8 @@ static void squashfs_put_super(struct super_block *sb) kfree(sb->s_fs_info); sb->s_fs_info = NULL; } + + unlock_kernel(); } diff --git a/trunk/fs/timerfd.c b/trunk/fs/timerfd.c index 8c4fc1425b3e..b86ab8eff79a 100644 --- a/trunk/fs/timerfd.c +++ b/trunk/fs/timerfd.c @@ -144,7 +144,6 @@ static const struct file_operations timerfd_fops = { .release = timerfd_release, .poll = timerfd_poll, .read = timerfd_read, - .llseek = noop_llseek, }; static struct file *timerfd_fget(int fd) diff --git a/trunk/fs/ubifs/debug.c b/trunk/fs/ubifs/debug.c index c6c553fd0b3d..c2a68baa782f 100644 --- a/trunk/fs/ubifs/debug.c +++ b/trunk/fs/ubifs/debug.c @@ -2625,7 +2625,6 @@ static const struct file_operations dfs_fops = { .open = open_debugfs_file, .write = write_debugfs_file, .owner = THIS_MODULE, - .llseek = default_llseek, }; /** diff --git a/trunk/fs/udf/Kconfig b/trunk/fs/udf/Kconfig index f8def3c8ea4c..0e0e99bd6bce 100644 --- a/trunk/fs/udf/Kconfig +++ b/trunk/fs/udf/Kconfig @@ -1,6 +1,5 @@ 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 diff --git a/trunk/fs/udf/super.c b/trunk/fs/udf/super.c index 76f3d6d97b40..65412d84a45d 100644 --- a/trunk/fs/udf/super.c +++ b/trunk/fs/udf/super.c @@ -1880,8 +1880,6 @@ static int udf_fill_super(struct super_block *sb, void *options, int silent) struct kernel_lb_addr rootdir, fileset; struct udf_sb_info *sbi; - lock_kernel(); - uopt.flags = (1 << UDF_FLAG_USE_AD_IN_ICB) | (1 << UDF_FLAG_STRICT); uopt.uid = -1; uopt.gid = -1; @@ -1890,10 +1888,8 @@ static int udf_fill_super(struct super_block *sb, void *options, int silent) uopt.dmode = UDF_INVALID_MODE; sbi = kzalloc(sizeof(struct udf_sb_info), GFP_KERNEL); - if (!sbi) { - unlock_kernel(); + if (!sbi) return -ENOMEM; - } sb->s_fs_info = sbi; @@ -2039,7 +2035,6 @@ static int udf_fill_super(struct super_block *sb, void *options, int silent) goto error_out; } sb->s_maxbytes = MAX_LFS_FILESIZE; - unlock_kernel(); return 0; error_out: @@ -2060,7 +2055,6 @@ static int udf_fill_super(struct super_block *sb, void *options, int silent) kfree(sbi); sb->s_fs_info = NULL; - unlock_kernel(); return -EINVAL; } diff --git a/trunk/fs/ufs/Kconfig b/trunk/fs/ufs/Kconfig index 30c8f223253d..e4f10a40768a 100644 --- a/trunk/fs/ufs/Kconfig +++ b/trunk/fs/ufs/Kconfig @@ -1,7 +1,6 @@ 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 diff --git a/trunk/fs/ufs/super.c b/trunk/fs/ufs/super.c index 6b9be90dae7d..d510c1b91817 100644 --- a/trunk/fs/ufs/super.c +++ b/trunk/fs/ufs/super.c @@ -696,8 +696,6 @@ static int ufs_fill_super(struct super_block *sb, void *data, int silent) unsigned maxsymlen; int ret = -EINVAL; - lock_kernel(); - uspi = NULL; ubh = NULL; flags = 0; @@ -1165,7 +1163,6 @@ static int ufs_fill_super(struct super_block *sb, void *data, int silent) goto failed; UFSD("EXIT\n"); - unlock_kernel(); return 0; dalloc_failed: @@ -1177,12 +1174,10 @@ static int ufs_fill_super(struct super_block *sb, void *data, int silent) kfree(sbi); sb->s_fs_info = NULL; UFSD("EXIT (FAILED)\n"); - unlock_kernel(); return ret; failed_nomem: UFSD("EXIT (NOMEM)\n"); - unlock_kernel(); return -ENOMEM; } diff --git a/trunk/include/asm-generic/atomic.h b/trunk/include/asm-generic/atomic.h index e994197f84b7..fd57b8477fab 100644 --- a/trunk/include/asm-generic/atomic.h +++ b/trunk/include/asm-generic/atomic.h @@ -120,23 +120,14 @@ static inline void atomic_dec(atomic_t *v) #define atomic_dec_and_test(v) (atomic_sub_return(1, (v)) == 0) #define atomic_inc_and_test(v) (atomic_add_return(1, (v)) == 0) -#define atomic_xchg(ptr, v) (xchg(&(ptr)->counter, (v))) -#define atomic_cmpxchg(v, old, new) (cmpxchg(&((v)->counter), (old), (new))) - -#define cmpxchg_local(ptr, o, n) \ - ((__typeof__(*(ptr)))__cmpxchg_local_generic((ptr), (unsigned long)(o),\ - (unsigned long)(n), sizeof(*(ptr)))) - -#define cmpxchg64_local(ptr, o, n) __cmpxchg64_local_generic((ptr), (o), (n)) - -static inline int atomic_add_unless(atomic_t *v, int a, int u) -{ - int c, old; - c = atomic_read(v); - while (c != u && (old = atomic_cmpxchg(v, c, c + a)) != c) - c = old; - return c != u; -} +#define atomic_add_unless(v, a, u) \ +({ \ + int c, old; \ + c = atomic_read(v); \ + while (c != (u) && (old = atomic_cmpxchg((v), c, c + (a))) != c) \ + c = old; \ + c != (u); \ +}) #define atomic_inc_not_zero(v) atomic_add_unless((v), 1, 0) @@ -150,6 +141,15 @@ static inline void atomic_clear_mask(unsigned long mask, unsigned long *addr) raw_local_irq_restore(flags); } +#define atomic_xchg(ptr, v) (xchg(&(ptr)->counter, (v))) +#define atomic_cmpxchg(v, old, new) (cmpxchg(&((v)->counter), (old), (new))) + +#define cmpxchg_local(ptr, o, n) \ + ((__typeof__(*(ptr)))__cmpxchg_local_generic((ptr), (unsigned long)(o),\ + (unsigned long)(n), sizeof(*(ptr)))) + +#define cmpxchg64_local(ptr, o, n) __cmpxchg64_local_generic((ptr), (o), (n)) + /* Assume that atomic operations are already serializing */ #define smp_mb__before_atomic_dec() barrier() #define smp_mb__after_atomic_dec() barrier() diff --git a/trunk/include/asm-generic/bitops/find.h b/trunk/include/asm-generic/bitops/find.h index 110fa700f853..1914e9742512 100644 --- a/trunk/include/asm-generic/bitops/find.h +++ b/trunk/include/asm-generic/bitops/find.h @@ -1,50 +1,15 @@ #ifndef _ASM_GENERIC_BITOPS_FIND_H_ #define _ASM_GENERIC_BITOPS_FIND_H_ -/** - * find_next_bit - find the next set bit in a memory region - * @addr: The address to base the search on - * @offset: The bitnumber to start searching at - * @size: The bitmap size in bits - */ +#ifndef CONFIG_GENERIC_FIND_NEXT_BIT extern unsigned long find_next_bit(const unsigned long *addr, unsigned long size, unsigned long offset); -/** - * find_next_zero_bit - find the next cleared bit in a memory region - * @addr: The address to base the search on - * @offset: The bitnumber to start searching at - * @size: The bitmap size in bits - */ extern unsigned long find_next_zero_bit(const unsigned long *addr, unsigned long size, unsigned long offset); - -#ifdef CONFIG_GENERIC_FIND_FIRST_BIT - -/** - * find_first_bit - find the first set bit in a memory region - * @addr: The address to start the search at - * @size: The maximum size to search - * - * Returns the bit number of the first set bit. - */ -extern unsigned long find_first_bit(const unsigned long *addr, - unsigned long size); - -/** - * find_first_zero_bit - find the first cleared bit in a memory region - * @addr: The address to start the search at - * @size: The maximum size to search - * - * Returns the bit number of the first cleared bit. - */ -extern unsigned long find_first_zero_bit(const unsigned long *addr, - unsigned long size); -#else /* CONFIG_GENERIC_FIND_FIRST_BIT */ +#endif #define find_first_bit(addr, size) find_next_bit((addr), (size), 0) #define find_first_zero_bit(addr, size) find_next_zero_bit((addr), (size), 0) -#endif /* CONFIG_GENERIC_FIND_FIRST_BIT */ - #endif /*_ASM_GENERIC_BITOPS_FIND_H_ */ diff --git a/trunk/include/asm-generic/fcntl.h b/trunk/include/asm-generic/fcntl.h index 0fc16e3f0bfc..a70b2d2bfc14 100644 --- a/trunk/include/asm-generic/fcntl.h +++ b/trunk/include/asm-generic/fcntl.h @@ -122,7 +122,7 @@ struct f_owner_ex { int type; - __kernel_pid_t pid; + pid_t pid; }; /* for F_[GET|SET]FL */ diff --git a/trunk/include/asm-generic/io.h b/trunk/include/asm-generic/io.h index 3577ca11a0be..118601fce92d 100644 --- a/trunk/include/asm-generic/io.h +++ b/trunk/include/asm-generic/io.h @@ -19,9 +19,7 @@ #include #endif -#ifndef mmiowb #define mmiowb() do {} while (0) -#endif /*****************************************************************************/ /* @@ -30,51 +28,39 @@ * differently. On the simple architectures, we just read/write the * memory location directly. */ -#ifndef __raw_readb static inline u8 __raw_readb(const volatile void __iomem *addr) { return *(const volatile u8 __force *) addr; } -#endif -#ifndef __raw_readw static inline u16 __raw_readw(const volatile void __iomem *addr) { return *(const volatile u16 __force *) addr; } -#endif -#ifndef __raw_readl static inline u32 __raw_readl(const volatile void __iomem *addr) { return *(const volatile u32 __force *) addr; } -#endif #define readb __raw_readb #define readw(addr) __le16_to_cpu(__raw_readw(addr)) #define readl(addr) __le32_to_cpu(__raw_readl(addr)) -#ifndef __raw_writeb static inline void __raw_writeb(u8 b, volatile void __iomem *addr) { *(volatile u8 __force *) addr = b; } -#endif -#ifndef __raw_writew static inline void __raw_writew(u16 b, volatile void __iomem *addr) { *(volatile u16 __force *) addr = b; } -#endif -#ifndef __raw_writel static inline void __raw_writel(u32 b, volatile void __iomem *addr) { *(volatile u32 __force *) addr = b; } -#endif #define writeb __raw_writeb #define writew(b,addr) __raw_writew(__cpu_to_le16(b),addr) @@ -136,7 +122,6 @@ static inline void outl(u32 b, unsigned long addr) #define outw_p(x, addr) outw((x), (addr)) #define outl_p(x, addr) outl((x), (addr)) -#ifndef insb static inline void insb(unsigned long addr, void *buffer, int count) { if (count) { @@ -147,9 +132,7 @@ static inline void insb(unsigned long addr, void *buffer, int count) } while (--count); } } -#endif -#ifndef insw static inline void insw(unsigned long addr, void *buffer, int count) { if (count) { @@ -160,9 +143,7 @@ static inline void insw(unsigned long addr, void *buffer, int count) } while (--count); } } -#endif -#ifndef insl static inline void insl(unsigned long addr, void *buffer, int count) { if (count) { @@ -173,9 +154,7 @@ static inline void insl(unsigned long addr, void *buffer, int count) } while (--count); } } -#endif -#ifndef outsb static inline void outsb(unsigned long addr, const void *buffer, int count) { if (count) { @@ -185,9 +164,7 @@ static inline void outsb(unsigned long addr, const void *buffer, int count) } while (--count); } } -#endif -#ifndef outsw static inline void outsw(unsigned long addr, const void *buffer, int count) { if (count) { @@ -197,9 +174,7 @@ static inline void outsw(unsigned long addr, const void *buffer, int count) } while (--count); } } -#endif -#ifndef outsl static inline void outsl(unsigned long addr, const void *buffer, int count) { if (count) { @@ -209,7 +184,6 @@ static inline void outsl(unsigned long addr, const void *buffer, int count) } while (--count); } } -#endif #ifndef CONFIG_GENERIC_IOMAP #define ioread8(addr) readb(addr) diff --git a/trunk/include/asm-generic/kdebug.h b/trunk/include/asm-generic/kdebug.h index d1814497bcdb..11e57b6a85fc 100644 --- a/trunk/include/asm-generic/kdebug.h +++ b/trunk/include/asm-generic/kdebug.h @@ -3,7 +3,7 @@ enum die_val { DIE_UNUSED, - DIE_OOPS = 1, + DIE_OOPS=1 }; #endif /* _ASM_GENERIC_KDEBUG_H */ diff --git a/trunk/include/asm-generic/system.h b/trunk/include/asm-generic/system.h index 4b0b9cbbfae5..efa403b5e121 100644 --- a/trunk/include/asm-generic/system.h +++ b/trunk/include/asm-generic/system.h @@ -21,7 +21,6 @@ #include #include -#include struct task_struct; @@ -137,6 +136,25 @@ unsigned long __xchg(unsigned long x, volatile void *ptr, int size) #define xchg(ptr, x) \ ((__typeof__(*(ptr))) __xchg((unsigned long)(x), (ptr), sizeof(*(ptr)))) +static inline unsigned long __cmpxchg(volatile unsigned long *m, + unsigned long old, unsigned long new) +{ + unsigned long retval; + unsigned long flags; + + local_irq_save(flags); + retval = *m; + if (retval == old) + *m = new; + local_irq_restore(flags); + return retval; +} + +#define cmpxchg(ptr, o, n) \ + ((__typeof__(*(ptr))) __cmpxchg((unsigned long *)(ptr), \ + (unsigned long)(o), \ + (unsigned long)(n))) + #endif /* !__ASSEMBLY__ */ #endif /* __KERNEL__ */ diff --git a/trunk/include/linux/bitops.h b/trunk/include/linux/bitops.h index 827cc95711ef..fc68053378ce 100644 --- a/trunk/include/linux/bitops.h +++ b/trunk/include/linux/bitops.h @@ -136,6 +136,28 @@ static inline unsigned long __ffs64(u64 word) } #ifdef __KERNEL__ +#ifdef CONFIG_GENERIC_FIND_FIRST_BIT + +/** + * find_first_bit - find the first set bit in a memory region + * @addr: The address to start the search at + * @size: The maximum size to search + * + * Returns the bit number of the first set bit. + */ +extern unsigned long find_first_bit(const unsigned long *addr, + unsigned long size); + +/** + * find_first_zero_bit - find the first cleared bit in a memory region + * @addr: The address to start the search at + * @size: The maximum size to search + * + * Returns the bit number of the first cleared bit. + */ +extern unsigned long find_first_zero_bit(const unsigned long *addr, + unsigned long size); +#endif /* CONFIG_GENERIC_FIND_FIRST_BIT */ #ifdef CONFIG_GENERIC_FIND_LAST_BIT /** @@ -149,5 +171,28 @@ extern unsigned long find_last_bit(const unsigned long *addr, unsigned long size); #endif /* CONFIG_GENERIC_FIND_LAST_BIT */ +#ifdef CONFIG_GENERIC_FIND_NEXT_BIT + +/** + * find_next_bit - find the next set bit in a memory region + * @addr: The address to base the search on + * @offset: The bitnumber to start searching at + * @size: The bitmap size in bits + */ +extern unsigned long find_next_bit(const unsigned long *addr, + unsigned long size, unsigned long offset); + +/** + * find_next_zero_bit - find the next cleared bit in a memory region + * @addr: The address to base the search on + * @offset: The bitnumber to start searching at + * @size: The bitmap size in bits + */ + +extern unsigned long find_next_zero_bit(const unsigned long *addr, + unsigned long size, + unsigned long offset); + +#endif /* CONFIG_GENERIC_FIND_NEXT_BIT */ #endif /* __KERNEL__ */ #endif diff --git a/trunk/include/linux/fs.h b/trunk/include/linux/fs.h index 0a81b87ea158..7d6f18fddfdb 100644 --- a/trunk/include/linux/fs.h +++ b/trunk/include/linux/fs.h @@ -1093,6 +1093,10 @@ struct file_lock { #include +/* temporary stubs for BKL removal */ +#define lock_flocks() lock_kernel() +#define unlock_flocks() unlock_kernel() + extern void send_sigio(struct fown_struct *fown, int fd, int band); #ifdef CONFIG_FILE_LOCKING @@ -1131,8 +1135,6 @@ extern int vfs_setlease(struct file *, long, struct file_lock **); extern int lease_modify(struct file_lock **, int); extern int lock_may_read(struct inode *, loff_t start, unsigned long count); extern int lock_may_write(struct inode *, loff_t start, unsigned long count); -extern void lock_flocks(void); -extern void unlock_flocks(void); #else /* !CONFIG_FILE_LOCKING */ static inline int fcntl_getlk(struct file *file, struct flock __user *user) { @@ -1275,14 +1277,6 @@ static inline int lock_may_write(struct inode *inode, loff_t start, return 1; } -static inline void lock_flocks(void) -{ -} - -static inline void unlock_flocks(void) -{ -} - #endif /* !CONFIG_FILE_LOCKING */ @@ -2462,7 +2456,6 @@ static const struct file_operations __fops = { \ .release = simple_attr_release, \ .read = simple_attr_read, \ .write = simple_attr_write, \ - .llseek = generic_file_llseek, \ }; static inline void __attribute__((format(printf, 1, 2))) diff --git a/trunk/include/linux/ncp_fs.h b/trunk/include/linux/ncp_fs.h index ef663061d5ac..4522aed00906 100644 --- a/trunk/include/linux/ncp_fs.h +++ b/trunk/include/linux/ncp_fs.h @@ -241,6 +241,34 @@ int ncp_mmap(struct file *, struct vm_area_struct *); /* linux/fs/ncpfs/ncplib_kernel.c */ int ncp_make_closed(struct inode *); +#define ncp_namespace(i) (NCP_SERVER(i)->name_space[NCP_FINFO(i)->volNumber]) + +static inline int ncp_preserve_entry_case(struct inode *i, __u32 nscreator) +{ +#ifdef CONFIG_NCPFS_SMALLDOS + int ns = ncp_namespace(i); + + if ((ns == NW_NS_DOS) +#ifdef CONFIG_NCPFS_OS2_NS + || ((ns == NW_NS_OS2) && (nscreator == NW_NS_DOS)) +#endif /* CONFIG_NCPFS_OS2_NS */ + ) + return 0; +#endif /* CONFIG_NCPFS_SMALLDOS */ + return 1; +} + +#define ncp_preserve_case(i) (ncp_namespace(i) != NW_NS_DOS) + +static inline int ncp_case_sensitive(struct inode *i) +{ +#ifdef CONFIG_NCPFS_NFS_NS + return ncp_namespace(i) == NW_NS_NFS; +#else + return 0; +#endif /* CONFIG_NCPFS_NFS_NS */ +} + #endif /* __KERNEL__ */ #endif /* _LINUX_NCP_FS_H */ diff --git a/trunk/include/linux/ncp_fs_sb.h b/trunk/include/linux/ncp_fs_sb.h index d64b0e894336..8da05bc098ca 100644 --- a/trunk/include/linux/ncp_fs_sb.h +++ b/trunk/include/linux/ncp_fs_sb.h @@ -62,7 +62,6 @@ struct ncp_server { int ncp_reply_size; int root_setuped; - struct mutex root_setup_lock; /* info for packet signing */ int sign_wanted; /* 1=Server needs signed packets */ @@ -82,14 +81,13 @@ struct ncp_server { size_t len; void* data; } priv; - struct rw_semaphore auth_rwsem; /* nls info: codepage for volume and charset for I/O */ struct nls_table *nls_vol; struct nls_table *nls_io; /* maximum age in jiffies */ - atomic_t dentry_ttl; + int dentry_ttl; /* miscellaneous */ unsigned int flags; diff --git a/trunk/include/linux/percpu-defs.h b/trunk/include/linux/percpu-defs.h index 018db9a62ffe..27ef6b190ea6 100644 --- a/trunk/include/linux/percpu-defs.h +++ b/trunk/include/linux/percpu-defs.h @@ -147,18 +147,6 @@ #define DEFINE_PER_CPU_READ_MOSTLY(type, name) \ DEFINE_PER_CPU_SECTION(type, name, "..readmostly") -/* - * Declaration/definition used for large per-CPU variables that must be - * aligned to something larger than the pagesize. - */ -#define DECLARE_PER_CPU_MULTIPAGE_ALIGNED(type, name, size) \ - DECLARE_PER_CPU_SECTION(type, name, "..page_aligned") \ - __aligned(size) - -#define DEFINE_PER_CPU_MULTIPAGE_ALIGNED(type, name, size) \ - DEFINE_PER_CPU_SECTION(type, name, "..page_aligned") \ - __aligned(size) - /* * Intermodule exports for per-CPU variables. sparse forgets about * address space across EXPORT_SYMBOL(), change EXPORT_SYMBOL() to diff --git a/trunk/include/linux/smp_lock.h b/trunk/include/linux/smp_lock.h index 291f721144c2..2ea1dd1ba21c 100644 --- a/trunk/include/linux/smp_lock.h +++ b/trunk/include/linux/smp_lock.h @@ -54,15 +54,12 @@ static inline void cycle_kernel_lock(void) #else -#ifdef CONFIG_BKL /* provoke build bug if not set */ #define lock_kernel() #define unlock_kernel() -#define cycle_kernel_lock() do { } while(0) -#define kernel_locked() 1 -#endif /* CONFIG_BKL */ - #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_LOCK_KERNEL */ #endif /* __LINUX_SMPLOCK_H */ diff --git a/trunk/include/pcmcia/ds.h b/trunk/include/pcmcia/ds.h index d830c87ff0a7..8479b66c067b 100644 --- a/trunk/include/pcmcia/ds.h +++ b/trunk/include/pcmcia/ds.h @@ -259,6 +259,8 @@ void pcmcia_disable_device(struct pcmcia_device *p_dev); #define CONF_ENABLE_SPKR 0x0002 #define CONF_ENABLE_PULSE_IRQ 0x0004 #define CONF_ENABLE_ESR 0x0008 +#define CONF_ENABLE_IOCARD 0x0010 /* auto-enabled if IO resources or IRQ + * (CONF_ENABLE_IRQ) in use */ /* flags used by pcmcia_loop_config() autoconfiguration */ #define CONF_AUTO_CHECK_VCC 0x0100 /* check for matching Vcc? */ diff --git a/trunk/init/Kconfig b/trunk/init/Kconfig index be85a0ab1b82..36890f0c8456 100644 --- a/trunk/init/Kconfig +++ b/trunk/init/Kconfig @@ -71,7 +71,7 @@ config BROKEN_ON_SMP config LOCK_KERNEL bool - depends on (SMP || PREEMPT) && BKL + depends on SMP || PREEMPT default y config INIT_ENV_ARG_LIMIT diff --git a/trunk/init/main.c b/trunk/init/main.c index e59af24a0b7c..9684c9670b48 100644 --- a/trunk/init/main.c +++ b/trunk/init/main.c @@ -424,6 +424,7 @@ 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; @@ -817,6 +818,7 @@ 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(); diff --git a/trunk/ipc/mqueue.c b/trunk/ipc/mqueue.c index e1e7b9635f5d..c60e519e2917 100644 --- a/trunk/ipc/mqueue.c +++ b/trunk/ipc/mqueue.c @@ -1219,7 +1219,6 @@ static const struct file_operations mqueue_file_operations = { .flush = mqueue_flush_file, .poll = mqueue_poll_file, .read = mqueue_read_file, - .llseek = default_llseek, }; static const struct super_operations mqueue_super_ops = { diff --git a/trunk/ipc/shm.c b/trunk/ipc/shm.c index 7bc46a9fe1f8..52ed77eb9713 100644 --- a/trunk/ipc/shm.c +++ b/trunk/ipc/shm.c @@ -298,7 +298,6 @@ static const struct file_operations shm_file_operations = { #ifndef CONFIG_MMU .get_unmapped_area = shm_get_unmapped_area, #endif - .llseek = noop_llseek, }; static const struct file_operations shm_file_operations_huge = { @@ -306,7 +305,6 @@ static const struct file_operations shm_file_operations_huge = { .fsync = shm_fsync, .release = shm_release, .get_unmapped_area = shm_get_unmapped_area, - .llseek = noop_llseek, }; int is_file_shm_hugepages(struct file *file) diff --git a/trunk/kernel/cgroup.c b/trunk/kernel/cgroup.c index 7b69b8d0313d..291ba3d04bea 100644 --- a/trunk/kernel/cgroup.c +++ b/trunk/kernel/cgroup.c @@ -52,6 +52,7 @@ #include #include #include +#include #include #include #include /* TODO: replace with more sophisticated array */ @@ -1221,6 +1222,7 @@ static int cgroup_remount(struct super_block *sb, int *flags, char *data) struct cgroup *cgrp = &root->top_cgroup; struct cgroup_sb_opts opts; + lock_kernel(); mutex_lock(&cgrp->dentry->d_inode->i_mutex); mutex_lock(&cgroup_mutex); @@ -1253,6 +1255,7 @@ static int cgroup_remount(struct super_block *sb, int *flags, char *data) kfree(opts.name); mutex_unlock(&cgroup_mutex); mutex_unlock(&cgrp->dentry->d_inode->i_mutex); + unlock_kernel(); return ret; } @@ -1565,6 +1568,7 @@ static int cgroup_get_sb(struct file_system_type *fs_type, out_err: kfree(opts.release_agent); kfree(opts.name); + return ret; } diff --git a/trunk/kernel/configs.c b/trunk/kernel/configs.c index b4066b44a99d..abaee684ecbf 100644 --- a/trunk/kernel/configs.c +++ b/trunk/kernel/configs.c @@ -66,7 +66,6 @@ ikconfig_read_current(struct file *file, char __user *buf, static const struct file_operations ikconfig_file_ops = { .owner = THIS_MODULE, .read = ikconfig_read_current, - .llseek = default_llseek, }; static int __init ikconfig_init(void) diff --git a/trunk/kernel/gcov/fs.c b/trunk/kernel/gcov/fs.c index 9bd0934f6c33..f83972b16564 100644 --- a/trunk/kernel/gcov/fs.c +++ b/trunk/kernel/gcov/fs.c @@ -561,7 +561,6 @@ static ssize_t reset_read(struct file *file, char __user *addr, size_t len, static const struct file_operations gcov_reset_fops = { .write = reset_write, .read = reset_read, - .llseek = noop_llseek, }; /* diff --git a/trunk/kernel/kprobes.c b/trunk/kernel/kprobes.c index 56a891914273..ec4210c6501e 100644 --- a/trunk/kernel/kprobes.c +++ b/trunk/kernel/kprobes.c @@ -2000,7 +2000,6 @@ static ssize_t write_enabled_file_bool(struct file *file, static const struct file_operations fops_kp = { .read = read_enabled_file_bool, .write = write_enabled_file_bool, - .llseek = default_llseek, }; static int __kprobes debugfs_kprobe_init(void) diff --git a/trunk/kernel/pm_qos_params.c b/trunk/kernel/pm_qos_params.c index a96b850ba08a..645e541a45f6 100644 --- a/trunk/kernel/pm_qos_params.c +++ b/trunk/kernel/pm_qos_params.c @@ -110,7 +110,6 @@ static const struct file_operations pm_qos_power_fops = { .write = pm_qos_power_write, .open = pm_qos_power_open, .release = pm_qos_power_release, - .llseek = noop_llseek, }; /* unlocked internal variant */ diff --git a/trunk/kernel/profile.c b/trunk/kernel/profile.c index 66f841b7fbd3..b22a899934cc 100644 --- a/trunk/kernel/profile.c +++ b/trunk/kernel/profile.c @@ -555,7 +555,6 @@ static ssize_t write_profile(struct file *file, const char __user *buf, static const struct file_operations proc_profile_operations = { .read = read_profile, .write = write_profile, - .llseek = default_llseek, }; #ifdef CONFIG_SMP diff --git a/trunk/kernel/rtmutex-tester.c b/trunk/kernel/rtmutex-tester.c index 66cb89bc5ef1..a56f629b057a 100644 --- a/trunk/kernel/rtmutex-tester.c +++ b/trunk/kernel/rtmutex-tester.c @@ -76,9 +76,7 @@ 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; @@ -135,18 +133,14 @@ 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; diff --git a/trunk/kernel/trace/blktrace.c b/trunk/kernel/trace/blktrace.c index bc251ed66724..959f8d6c8cc1 100644 --- a/trunk/kernel/trace/blktrace.c +++ b/trunk/kernel/trace/blktrace.c @@ -23,6 +23,7 @@ #include #include #include +#include #include #include @@ -325,7 +326,6 @@ static const struct file_operations blk_dropped_fops = { .owner = THIS_MODULE, .open = blk_dropped_open, .read = blk_dropped_read, - .llseek = default_llseek, }; static int blk_msg_open(struct inode *inode, struct file *filp) @@ -365,7 +365,6 @@ static const struct file_operations blk_msg_fops = { .owner = THIS_MODULE, .open = blk_msg_open, .write = blk_msg_write, - .llseek = noop_llseek, }; /* @@ -640,6 +639,7 @@ 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,6 +667,7 @@ int blk_trace_ioctl(struct block_device *bdev, unsigned cmd, char __user *arg) } mutex_unlock(&bdev->bd_mutex); + unlock_kernel(); return ret; } @@ -1651,9 +1652,10 @@ 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; + goto out_unlock_kernel; q = blk_trace_get_queue(bdev); if (q == NULL) @@ -1681,7 +1683,8 @@ static ssize_t sysfs_blk_trace_attr_show(struct device *dev, mutex_unlock(&bdev->bd_mutex); out_bdput: bdput(bdev); -out: +out_unlock_kernel: + unlock_kernel(); return ret; } @@ -1711,10 +1714,11 @@ 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; + goto out_unlock_kernel; q = blk_trace_get_queue(bdev); if (q == NULL) @@ -1749,6 +1753,8 @@ static ssize_t sysfs_blk_trace_attr_store(struct device *dev, mutex_unlock(&bdev->bd_mutex); out_bdput: bdput(bdev); +out_unlock_kernel: + unlock_kernel(); out: return ret ? ret : count; } diff --git a/trunk/kernel/trace/ftrace.c b/trunk/kernel/trace/ftrace.c index f3dadae83883..ebd80d50c474 100644 --- a/trunk/kernel/trace/ftrace.c +++ b/trunk/kernel/trace/ftrace.c @@ -800,7 +800,6 @@ static const struct file_operations ftrace_profile_fops = { .open = tracing_open_generic, .read = ftrace_profile_read, .write = ftrace_profile_write, - .llseek = default_llseek, }; /* used to initialize the real stat files */ @@ -2670,7 +2669,6 @@ static const struct file_operations ftrace_graph_fops = { .read = seq_read, .write = ftrace_graph_write, .release = ftrace_graph_release, - .llseek = seq_lseek, }; #endif /* CONFIG_FUNCTION_GRAPH_TRACER */ diff --git a/trunk/kernel/trace/ring_buffer.c b/trunk/kernel/trace/ring_buffer.c index c3dab054d18e..c5a632a669e1 100644 --- a/trunk/kernel/trace/ring_buffer.c +++ b/trunk/kernel/trace/ring_buffer.c @@ -3974,7 +3974,6 @@ static const struct file_operations rb_simple_fops = { .open = tracing_open_generic, .read = rb_simple_read, .write = rb_simple_write, - .llseek = default_llseek, }; diff --git a/trunk/kernel/trace/trace_events.c b/trunk/kernel/trace/trace_events.c index 0725eeab1937..398c0e8b332c 100644 --- a/trunk/kernel/trace/trace_events.c +++ b/trunk/kernel/trace/trace_events.c @@ -932,7 +932,6 @@ static const struct file_operations ftrace_enable_fops = { .open = tracing_open_generic, .read = event_enable_read, .write = event_enable_write, - .llseek = default_llseek, }; static const struct file_operations ftrace_event_format_fops = { @@ -945,34 +944,29 @@ static const struct file_operations ftrace_event_format_fops = { static const struct file_operations ftrace_event_id_fops = { .open = tracing_open_generic, .read = event_id_read, - .llseek = default_llseek, }; static const struct file_operations ftrace_event_filter_fops = { .open = tracing_open_generic, .read = event_filter_read, .write = event_filter_write, - .llseek = default_llseek, }; static const struct file_operations ftrace_subsystem_filter_fops = { .open = tracing_open_generic, .read = subsystem_filter_read, .write = subsystem_filter_write, - .llseek = default_llseek, }; static const struct file_operations ftrace_system_enable_fops = { .open = tracing_open_generic, .read = system_enable_read, .write = system_enable_write, - .llseek = default_llseek, }; static const struct file_operations ftrace_show_header_fops = { .open = tracing_open_generic, .read = show_header, - .llseek = default_llseek, }; static struct dentry *event_trace_events_dir(void) diff --git a/trunk/kernel/trace/trace_stack.c b/trunk/kernel/trace/trace_stack.c index 4c5dead0c239..a6b7e0e0f3eb 100644 --- a/trunk/kernel/trace/trace_stack.c +++ b/trunk/kernel/trace/trace_stack.c @@ -195,7 +195,6 @@ static const struct file_operations stack_max_size_fops = { .open = tracing_open_generic, .read = stack_max_size_read, .write = stack_max_size_write, - .llseek = default_llseek, }; static void * diff --git a/trunk/lib/Kconfig.debug b/trunk/lib/Kconfig.debug index 7b2a8ca97ada..21ac83070a80 100644 --- a/trunk/lib/Kconfig.debug +++ b/trunk/lib/Kconfig.debug @@ -461,15 +461,6 @@ 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 diff --git a/trunk/lib/dma-debug.c b/trunk/lib/dma-debug.c index 4bfb0471f106..01e64270e246 100644 --- a/trunk/lib/dma-debug.c +++ b/trunk/lib/dma-debug.c @@ -590,7 +590,6 @@ static ssize_t filter_write(struct file *file, const char __user *userbuf, static const struct file_operations filter_fops = { .read = filter_read, .write = filter_write, - .llseek = default_llseek, }; static int dma_debug_fs_init(void) diff --git a/trunk/net/atm/proc.c b/trunk/net/atm/proc.c index f85da0779e5e..6262aeae398e 100644 --- a/trunk/net/atm/proc.c +++ b/trunk/net/atm/proc.c @@ -38,7 +38,6 @@ static ssize_t proc_dev_atm_read(struct file *file, char __user *buf, static const struct file_operations proc_atm_dev_ops = { .owner = THIS_MODULE, .read = proc_dev_atm_read, - .llseek = noop_llseek, }; static void add_stats(struct seq_file *seq, const char *aal, diff --git a/trunk/net/dccp/probe.c b/trunk/net/dccp/probe.c index 33d0e6297c21..078e48d442fd 100644 --- a/trunk/net/dccp/probe.c +++ b/trunk/net/dccp/probe.c @@ -149,7 +149,6 @@ static const struct file_operations dccpprobe_fops = { .owner = THIS_MODULE, .open = dccpprobe_open, .read = dccpprobe_read, - .llseek = noop_llseek, }; static __init int dccpprobe_init(void) diff --git a/trunk/net/ipv4/tcp_probe.c b/trunk/net/ipv4/tcp_probe.c index 6211e2114173..f8efada580e8 100644 --- a/trunk/net/ipv4/tcp_probe.c +++ b/trunk/net/ipv4/tcp_probe.c @@ -214,7 +214,6 @@ static const struct file_operations tcpprobe_fops = { .owner = THIS_MODULE, .open = tcpprobe_open, .read = tcpprobe_read, - .llseek = noop_llseek, }; static __init int tcpprobe_init(void) diff --git a/trunk/net/ipx/Kconfig b/trunk/net/ipx/Kconfig index 02549cb2c328..e9ad0062fbb6 100644 --- a/trunk/net/ipx/Kconfig +++ b/trunk/net/ipx/Kconfig @@ -3,7 +3,6 @@ # 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 diff --git a/trunk/net/mac80211/debugfs.c b/trunk/net/mac80211/debugfs.c index b8b0ae79a743..a694c593ff6a 100644 --- a/trunk/net/mac80211/debugfs.c +++ b/trunk/net/mac80211/debugfs.c @@ -36,7 +36,6 @@ static ssize_t name## _read(struct file *file, char __user *userbuf, \ static const struct file_operations name## _ops = { \ .read = name## _read, \ .open = mac80211_open_file_generic, \ - .llseek = generic_file_llseek, \ }; #define DEBUGFS_ADD(name) \ @@ -102,8 +101,7 @@ static ssize_t tsf_write(struct file *file, static const struct file_operations tsf_ops = { .read = tsf_read, .write = tsf_write, - .open = mac80211_open_file_generic, - .llseek = default_llseek, + .open = mac80211_open_file_generic }; static ssize_t reset_write(struct file *file, const char __user *user_buf, @@ -122,7 +120,6 @@ static ssize_t reset_write(struct file *file, const char __user *user_buf, static const struct file_operations reset_ops = { .write = reset_write, .open = mac80211_open_file_generic, - .llseek = noop_llseek, }; static ssize_t noack_read(struct file *file, char __user *user_buf, @@ -158,8 +155,7 @@ static ssize_t noack_write(struct file *file, static const struct file_operations noack_ops = { .read = noack_read, .write = noack_write, - .open = mac80211_open_file_generic, - .llseek = default_llseek, + .open = mac80211_open_file_generic }; static ssize_t uapsd_queues_read(struct file *file, char __user *user_buf, @@ -205,8 +201,7 @@ static ssize_t uapsd_queues_write(struct file *file, static const struct file_operations uapsd_queues_ops = { .read = uapsd_queues_read, .write = uapsd_queues_write, - .open = mac80211_open_file_generic, - .llseek = default_llseek, + .open = mac80211_open_file_generic }; static ssize_t uapsd_max_sp_len_read(struct file *file, char __user *user_buf, @@ -252,8 +247,7 @@ static ssize_t uapsd_max_sp_len_write(struct file *file, static const struct file_operations uapsd_max_sp_len_ops = { .read = uapsd_max_sp_len_read, .write = uapsd_max_sp_len_write, - .open = mac80211_open_file_generic, - .llseek = default_llseek, + .open = mac80211_open_file_generic }; static ssize_t channel_type_read(struct file *file, char __user *user_buf, @@ -285,8 +279,7 @@ static ssize_t channel_type_read(struct file *file, char __user *user_buf, static const struct file_operations channel_type_ops = { .read = channel_type_read, - .open = mac80211_open_file_generic, - .llseek = default_llseek, + .open = mac80211_open_file_generic }; static ssize_t queues_read(struct file *file, char __user *user_buf, @@ -309,8 +302,7 @@ static ssize_t queues_read(struct file *file, char __user *user_buf, static const struct file_operations queues_ops = { .read = queues_read, - .open = mac80211_open_file_generic, - .llseek = default_llseek, + .open = mac80211_open_file_generic }; /* statistics stuff */ @@ -354,7 +346,6 @@ static ssize_t stats_ ##name## _read(struct file *file, \ static const struct file_operations stats_ ##name## _ops = { \ .read = stats_ ##name## _read, \ .open = mac80211_open_file_generic, \ - .llseek = generic_file_llseek, \ }; #define DEBUGFS_STATS_ADD(name, field) \ diff --git a/trunk/net/mac80211/debugfs_key.c b/trunk/net/mac80211/debugfs_key.c index 7cd8dd9fc240..fa5e76e658ef 100644 --- a/trunk/net/mac80211/debugfs_key.c +++ b/trunk/net/mac80211/debugfs_key.c @@ -32,7 +32,6 @@ static ssize_t key_##name##_read(struct file *file, \ static const struct file_operations key_ ##name## _ops = { \ .read = key_##name##_read, \ .open = mac80211_open_file_generic, \ - .llseek = generic_file_llseek, \ } #define KEY_FILE(name, format) \ @@ -47,7 +46,6 @@ static const struct file_operations key_ ##name## _ops = { \ static const struct file_operations key_ ##name## _ops = { \ .read = key_conf_##name##_read, \ .open = mac80211_open_file_generic, \ - .llseek = generic_file_llseek, \ } #define KEY_CONF_FILE(name, format) \ diff --git a/trunk/net/mac80211/debugfs_netdev.c b/trunk/net/mac80211/debugfs_netdev.c index 8ad33eef7dda..20b2998fa0ed 100644 --- a/trunk/net/mac80211/debugfs_netdev.c +++ b/trunk/net/mac80211/debugfs_netdev.c @@ -121,7 +121,6 @@ static const struct file_operations name##_ops = { \ .read = ieee80211_if_read_##name, \ .write = (_write), \ .open = mac80211_open_file_generic, \ - .llseek = generic_file_llseek, \ } #define __IEEE80211_IF_FILE_W(name) \ diff --git a/trunk/net/mac80211/debugfs_sta.c b/trunk/net/mac80211/debugfs_sta.c index 6a8fdc372c43..76839d4dfaac 100644 --- a/trunk/net/mac80211/debugfs_sta.c +++ b/trunk/net/mac80211/debugfs_sta.c @@ -36,7 +36,6 @@ static ssize_t sta_ ##name## _read(struct file *file, \ static const struct file_operations sta_ ##name## _ops = { \ .read = sta_##name##_read, \ .open = mac80211_open_file_generic, \ - .llseek = generic_file_llseek, \ } #define STA_OPS_RW(name) \ @@ -44,7 +43,6 @@ static const struct file_operations sta_ ##name## _ops = { \ .read = sta_##name##_read, \ .write = sta_##name##_write, \ .open = mac80211_open_file_generic, \ - .llseek = generic_file_llseek, \ } #define STA_FILE(name, field, format) \ diff --git a/trunk/net/mac80211/rate.c b/trunk/net/mac80211/rate.c index 334cbd3d2aae..be04d46110fe 100644 --- a/trunk/net/mac80211/rate.c +++ b/trunk/net/mac80211/rate.c @@ -145,7 +145,6 @@ static ssize_t rcname_read(struct file *file, char __user *userbuf, static const struct file_operations rcname_ops = { .read = rcname_read, .open = mac80211_open_file_generic, - .llseek = default_llseek, }; #endif diff --git a/trunk/net/mac80211/rc80211_minstrel_debugfs.c b/trunk/net/mac80211/rc80211_minstrel_debugfs.c index a290ad231d77..241e76f3fdf2 100644 --- a/trunk/net/mac80211/rc80211_minstrel_debugfs.c +++ b/trunk/net/mac80211/rc80211_minstrel_debugfs.c @@ -122,7 +122,6 @@ static const struct file_operations minstrel_stat_fops = { .open = minstrel_stats_open, .read = minstrel_stats_read, .release = minstrel_stats_release, - .llseek = default_llseek, }; void diff --git a/trunk/net/mac80211/rc80211_minstrel_ht_debugfs.c b/trunk/net/mac80211/rc80211_minstrel_ht_debugfs.c index cefcb5d2dae6..4a5a4b3e7799 100644 --- a/trunk/net/mac80211/rc80211_minstrel_ht_debugfs.c +++ b/trunk/net/mac80211/rc80211_minstrel_ht_debugfs.c @@ -90,7 +90,7 @@ minstrel_ht_stats_open(struct inode *inode, struct file *file) MINSTREL_TRUNC(mi->avg_ampdu_len * 10) % 10); ms->len = p - ms->buf; - return nonseekable_open(inode, file); + return 0; } static const struct file_operations minstrel_ht_stat_fops = { @@ -98,7 +98,6 @@ static const struct file_operations minstrel_ht_stat_fops = { .open = minstrel_ht_stats_open, .read = minstrel_stats_read, .release = minstrel_stats_release, - .llseek = no_llseek, }; void diff --git a/trunk/net/mac80211/rc80211_pid_debugfs.c b/trunk/net/mac80211/rc80211_pid_debugfs.c index 7905f79cc2e4..47438b4a9af5 100644 --- a/trunk/net/mac80211/rc80211_pid_debugfs.c +++ b/trunk/net/mac80211/rc80211_pid_debugfs.c @@ -206,7 +206,6 @@ static const struct file_operations rc_pid_fop_events = { .poll = rate_control_pid_events_poll, .open = rate_control_pid_events_open, .release = rate_control_pid_events_release, - .llseek = noop_llseek, }; void rate_control_pid_add_sta_debugfs(void *priv, void *priv_sta, diff --git a/trunk/net/netfilter/xt_recent.c b/trunk/net/netfilter/xt_recent.c index d2ff15a2412b..76aec6a44762 100644 --- a/trunk/net/netfilter/xt_recent.c +++ b/trunk/net/netfilter/xt_recent.c @@ -567,7 +567,6 @@ static const struct file_operations recent_mt_fops = { .write = recent_mt_proc_write, .release = seq_release_private, .owner = THIS_MODULE, - .llseek = seq_lseek, }; static int __net_init recent_proc_net_init(struct net *net) diff --git a/trunk/net/nonet.c b/trunk/net/nonet.c index b1a73fda9c12..92e76640c7cd 100644 --- a/trunk/net/nonet.c +++ b/trunk/net/nonet.c @@ -22,5 +22,4 @@ static int sock_no_open(struct inode *irrelevant, struct file *dontcare) const struct file_operations bad_sock_fops = { .owner = THIS_MODULE, .open = sock_no_open, - .llseek = noop_llseek, }; diff --git a/trunk/net/rfkill/core.c b/trunk/net/rfkill/core.c index 04f599089e6d..51875a0c5d48 100644 --- a/trunk/net/rfkill/core.c +++ b/trunk/net/rfkill/core.c @@ -1241,7 +1241,6 @@ static const struct file_operations rfkill_fops = { .unlocked_ioctl = rfkill_fop_ioctl, .compat_ioctl = rfkill_fop_ioctl, #endif - .llseek = no_llseek, }; static struct miscdevice rfkill_miscdev = { diff --git a/trunk/net/sctp/probe.c b/trunk/net/sctp/probe.c index 289b1ba62cac..db3a42b8b349 100644 --- a/trunk/net/sctp/probe.c +++ b/trunk/net/sctp/probe.c @@ -117,7 +117,6 @@ static const struct file_operations sctpprobe_fops = { .owner = THIS_MODULE, .open = sctpprobe_open, .read = sctpprobe_read, - .llseek = noop_llseek, }; sctp_disposition_t jsctp_sf_eat_sack(const struct sctp_endpoint *ep, diff --git a/trunk/net/socket.c b/trunk/net/socket.c index 9eac5c394134..2270b941bcc7 100644 --- a/trunk/net/socket.c +++ b/trunk/net/socket.c @@ -502,7 +502,6 @@ static int sock_no_open(struct inode *irrelevant, struct file *dontcare) const struct file_operations bad_sock_fops = { .owner = THIS_MODULE, .open = sock_no_open, - .llseek = noop_llseek, }; /** diff --git a/trunk/net/sunrpc/cache.c b/trunk/net/sunrpc/cache.c index 7dce81a926c5..2b06410e584e 100644 --- a/trunk/net/sunrpc/cache.c +++ b/trunk/net/sunrpc/cache.c @@ -28,6 +28,7 @@ #include #include #include +#include #include #include #include @@ -1347,10 +1348,15 @@ 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; - return cache_ioctl(inode, filp, cmd, arg, cd); + lock_kernel(); + ret = cache_ioctl(inode, filp, cmd, arg, cd); + unlock_kernel(); + + return ret; } static int cache_open_procfs(struct inode *inode, struct file *filp) @@ -1435,7 +1441,6 @@ static const struct file_operations cache_flush_operations_procfs = { .read = read_flush_procfs, .write = write_flush_procfs, .release = release_flush_procfs, - .llseek = no_llseek, }; static void remove_cache_proc_entries(struct cache_detail *cd) @@ -1550,8 +1555,13 @@ 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; - return cache_ioctl(inode, filp, cmd, arg, cd); + lock_kernel(); + ret = cache_ioctl(inode, filp, cmd, arg, cd); + unlock_kernel(); + + return ret; } static int cache_open_pipefs(struct inode *inode, struct file *filp) @@ -1636,7 +1646,6 @@ const struct file_operations cache_flush_operations_pipefs = { .read = read_flush_pipefs, .write = write_flush_pipefs, .release = release_flush_pipefs, - .llseek = no_llseek, }; int sunrpc_cache_register_pipefs(struct dentry *parent, diff --git a/trunk/net/sunrpc/rpc_pipe.c b/trunk/net/sunrpc/rpc_pipe.c index 28bcd52e3ce9..8c8eef2b8f26 100644 --- a/trunk/net/sunrpc/rpc_pipe.c +++ b/trunk/net/sunrpc/rpc_pipe.c @@ -27,6 +27,7 @@ #include #include #include +#include static struct vfsmount *rpc_mount __read_mostly; static int rpc_mount_count; @@ -308,33 +309,40 @@ rpc_pipe_poll(struct file *filp, struct poll_table_struct *wait) return mask; } -static long -rpc_pipe_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) +static int +rpc_pipe_ioctl_unlocked(struct file *filp, unsigned int cmd, unsigned long arg) { - struct inode *inode = filp->f_path.dentry->d_inode; - struct rpc_inode *rpci = RPC_I(inode); + struct rpc_inode *rpci = RPC_I(filp->f_path.dentry->d_inode); int len; switch (cmd) { case FIONREAD: - spin_lock(&inode->i_lock); - if (rpci->ops == NULL) { - spin_unlock(&inode->i_lock); + if (rpci->ops == NULL) 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, diff --git a/trunk/net/wireless/debugfs.c b/trunk/net/wireless/debugfs.c index 39765bcfb472..a4991a3efec0 100644 --- a/trunk/net/wireless/debugfs.c +++ b/trunk/net/wireless/debugfs.c @@ -34,7 +34,6 @@ static ssize_t name## _read(struct file *file, char __user *userbuf, \ static const struct file_operations name## _ops = { \ .read = name## _read, \ .open = cfg80211_open_file_generic, \ - .llseek = generic_file_llseek, \ }; DEBUGFS_READONLY_FILE(rts_threshold, 20, "%d", @@ -103,7 +102,6 @@ static ssize_t ht40allow_map_read(struct file *file, static const struct file_operations ht40allow_map_ops = { .read = ht40allow_map_read, .open = cfg80211_open_file_generic, - .llseek = default_llseek, }; #define DEBUGFS_ADD(name) \ diff --git a/trunk/net/x25/Kconfig b/trunk/net/x25/Kconfig index 2196e55e4f61..e6759c9660bb 100644 --- a/trunk/net/x25/Kconfig +++ b/trunk/net/x25/Kconfig @@ -5,7 +5,6 @@ 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 diff --git a/trunk/samples/kfifo/bytestream-example.c b/trunk/samples/kfifo/bytestream-example.c index cfe40addda76..178061e87ffe 100644 --- a/trunk/samples/kfifo/bytestream-example.c +++ b/trunk/samples/kfifo/bytestream-example.c @@ -148,7 +148,6 @@ static const struct file_operations fifo_fops = { .owner = THIS_MODULE, .read = fifo_read, .write = fifo_write, - .llseek = noop_llseek, }; static int __init example_init(void) diff --git a/trunk/samples/kfifo/inttype-example.c b/trunk/samples/kfifo/inttype-example.c index 6f8e79e76c9e..71b2aabca96a 100644 --- a/trunk/samples/kfifo/inttype-example.c +++ b/trunk/samples/kfifo/inttype-example.c @@ -141,7 +141,6 @@ static const struct file_operations fifo_fops = { .owner = THIS_MODULE, .read = fifo_read, .write = fifo_write, - .llseek = noop_llseek, }; static int __init example_init(void) diff --git a/trunk/samples/kfifo/record-example.c b/trunk/samples/kfifo/record-example.c index 2d7529eeb294..e68bd16a5da4 100644 --- a/trunk/samples/kfifo/record-example.c +++ b/trunk/samples/kfifo/record-example.c @@ -155,7 +155,6 @@ static const struct file_operations fifo_fops = { .owner = THIS_MODULE, .read = fifo_read, .write = fifo_write, - .llseek = noop_llseek, }; static int __init example_init(void) diff --git a/trunk/samples/tracepoints/tracepoint-sample.c b/trunk/samples/tracepoints/tracepoint-sample.c index f4d89e008c32..26fab33ffa8c 100644 --- a/trunk/samples/tracepoints/tracepoint-sample.c +++ b/trunk/samples/tracepoints/tracepoint-sample.c @@ -30,7 +30,6 @@ static int my_open(struct inode *inode, struct file *file) static const struct file_operations mark_ops = { .open = my_open, - .llseek = noop_llseek, }; static int __init sample_init(void) diff --git a/trunk/security/apparmor/apparmorfs.c b/trunk/security/apparmor/apparmorfs.c index 0848292982a2..544ff5837cb6 100644 --- a/trunk/security/apparmor/apparmorfs.c +++ b/trunk/security/apparmor/apparmorfs.c @@ -88,8 +88,7 @@ static ssize_t profile_load(struct file *f, const char __user *buf, size_t size, } static const struct file_operations aa_fs_profile_load = { - .write = profile_load, - .llseek = default_llseek, + .write = profile_load }; /* .replace file hook fn to load and/or replace policy */ @@ -110,8 +109,7 @@ static ssize_t profile_replace(struct file *f, const char __user *buf, } static const struct file_operations aa_fs_profile_replace = { - .write = profile_replace, - .llseek = default_llseek, + .write = profile_replace }; /* .remove file hook fn to remove loaded policy */ @@ -138,8 +136,7 @@ static ssize_t profile_remove(struct file *f, const char __user *buf, } static const struct file_operations aa_fs_profile_remove = { - .write = profile_remove, - .llseek = default_llseek, + .write = profile_remove }; /** Base file system setup **/ diff --git a/trunk/security/inode.c b/trunk/security/inode.c index 88839866cbcd..8c777f022ad1 100644 --- a/trunk/security/inode.c +++ b/trunk/security/inode.c @@ -53,7 +53,6 @@ static const struct file_operations default_file_ops = { .read = default_read_file, .write = default_write_file, .open = default_open, - .llseek = noop_llseek, }; static struct inode *get_inode(struct super_block *sb, int mode, dev_t dev) diff --git a/trunk/security/smack/smackfs.c b/trunk/security/smack/smackfs.c index 7512502d0162..a2b72d77f926 100644 --- a/trunk/security/smack/smackfs.c +++ b/trunk/security/smack/smackfs.c @@ -968,7 +968,6 @@ static ssize_t smk_write_doi(struct file *file, const char __user *buf, static const struct file_operations smk_doi_ops = { .read = smk_read_doi, .write = smk_write_doi, - .llseek = default_llseek, }; /** @@ -1032,7 +1031,6 @@ static ssize_t smk_write_direct(struct file *file, const char __user *buf, static const struct file_operations smk_direct_ops = { .read = smk_read_direct, .write = smk_write_direct, - .llseek = default_llseek, }; /** @@ -1114,7 +1112,6 @@ static ssize_t smk_write_ambient(struct file *file, const char __user *buf, static const struct file_operations smk_ambient_ops = { .read = smk_read_ambient, .write = smk_write_ambient, - .llseek = default_llseek, }; /** @@ -1194,7 +1191,6 @@ static ssize_t smk_write_onlycap(struct file *file, const char __user *buf, static const struct file_operations smk_onlycap_ops = { .read = smk_read_onlycap, .write = smk_write_onlycap, - .llseek = default_llseek, }; /** @@ -1259,7 +1255,6 @@ static ssize_t smk_write_logging(struct file *file, const char __user *buf, static const struct file_operations smk_logging_ops = { .read = smk_read_logging, .write = smk_write_logging, - .llseek = default_llseek, }; /** * smk_fill_super - fill the /smackfs superblock diff --git a/trunk/sound/core/seq/oss/seq_oss.c b/trunk/sound/core/seq/oss/seq_oss.c index a1f1a2f00ccb..f25e3cc7ddfa 100644 --- a/trunk/sound/core/seq/oss/seq_oss.c +++ b/trunk/sound/core/seq/oss/seq_oss.c @@ -220,7 +220,6 @@ static const struct file_operations seq_oss_f_ops = .poll = odev_poll, .unlocked_ioctl = odev_ioctl, .compat_ioctl = odev_ioctl_compat, - .llseek = noop_llseek, }; static int __init diff --git a/trunk/sound/core/sound.c b/trunk/sound/core/sound.c index 62a093efb453..ac42af42b787 100644 --- a/trunk/sound/core/sound.c +++ b/trunk/sound/core/sound.c @@ -184,8 +184,7 @@ static int snd_open(struct inode *inode, struct file *file) static const struct file_operations snd_fops = { .owner = THIS_MODULE, - .open = snd_open, - .llseek = noop_llseek, + .open = snd_open }; #ifdef CONFIG_SND_DYNAMIC_MINORS diff --git a/trunk/sound/oss/msnd_pinnacle.c b/trunk/sound/oss/msnd_pinnacle.c index ca942f7cd231..2e48b17667d0 100644 --- a/trunk/sound/oss/msnd_pinnacle.c +++ b/trunk/sound/oss/msnd_pinnacle.c @@ -1117,7 +1117,6 @@ static const struct file_operations dev_fileops = { .unlocked_ioctl = dev_ioctl, .open = dev_open, .release = dev_release, - .llseek = noop_llseek, }; static int reset_dsp(void) diff --git a/trunk/sound/soc/soc-core.c b/trunk/sound/soc/soc-core.c index 4057d35343bb..acc91daa1c55 100644 --- a/trunk/sound/soc/soc-core.c +++ b/trunk/sound/soc/soc-core.c @@ -223,7 +223,6 @@ static const struct file_operations codec_reg_fops = { .open = codec_reg_open_file, .read = codec_reg_read_file, .write = codec_reg_write_file, - .llseek = default_llseek, }; static void soc_init_codec_debugfs(struct snd_soc_codec *codec) diff --git a/trunk/sound/soc/soc-dapm.c b/trunk/sound/soc/soc-dapm.c index 72a53d0a41e9..03cb7c05ebec 100644 --- a/trunk/sound/soc/soc-dapm.c +++ b/trunk/sound/soc/soc-dapm.c @@ -1089,7 +1089,6 @@ static ssize_t dapm_widget_power_read_file(struct file *file, static const struct file_operations dapm_widget_power_fops = { .open = dapm_widget_power_open_file, .read = dapm_widget_power_read_file, - .llseek = default_llseek, }; void snd_soc_dapm_debugfs_init(struct snd_soc_codec *codec) diff --git a/trunk/sound/sound_core.c b/trunk/sound/sound_core.c index c03bbaefdbc3..cb61317df509 100644 --- a/trunk/sound/sound_core.c +++ b/trunk/sound/sound_core.c @@ -165,7 +165,6 @@ static const struct file_operations soundcore_fops = /* We must have an owner or the module locking fails */ .owner = THIS_MODULE, .open = soundcore_open, - .llseek = noop_llseek, }; /* diff --git a/trunk/virt/kvm/kvm_main.c b/trunk/virt/kvm/kvm_main.c index 60e5e4612b0b..5186e728c53e 100644 --- a/trunk/virt/kvm/kvm_main.c +++ b/trunk/virt/kvm/kvm_main.c @@ -1305,7 +1305,6 @@ static struct file_operations kvm_vcpu_fops = { .unlocked_ioctl = kvm_vcpu_ioctl, .compat_ioctl = kvm_vcpu_ioctl, .mmap = kvm_vcpu_mmap, - .llseek = noop_llseek, }; /* @@ -1775,7 +1774,6 @@ static struct file_operations kvm_vm_fops = { .compat_ioctl = kvm_vm_compat_ioctl, #endif .mmap = kvm_vm_mmap, - .llseek = noop_llseek, }; static int kvm_dev_ioctl_create_vm(void) @@ -1869,7 +1867,6 @@ static long kvm_dev_ioctl(struct file *filp, static struct file_operations kvm_chardev_ops = { .unlocked_ioctl = kvm_dev_ioctl, .compat_ioctl = kvm_dev_ioctl, - .llseek = noop_llseek, }; static struct miscdevice kvm_dev = {