diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2008-07-14 17:48:31 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2008-07-14 17:48:31 -0400 |
commit | d1794f2c5b5817eb79ccc5e00701ca748d1b073a (patch) | |
tree | 5a4c98e694e88a8c82f342d0cc9edb2a4cbbef36 /arch | |
parent | a41eebab7537890409ea9dfe0fcda9b5fbdb090d (diff) | |
parent | 2fceef397f9880b212a74c418290ce69e7ac00eb (diff) |
Merge branch 'bkl-removal' of git://git.lwn.net/linux-2.6
* 'bkl-removal' of git://git.lwn.net/linux-2.6: (146 commits)
IB/umad: BKL is not needed for ib_umad_open()
IB/uverbs: BKL is not needed for ib_uverbs_open()
bf561-coreb: BKL unneeded for open()
Call fasync() functions without the BKL
snd/PCM: fasync BKL pushdown
ipmi: fasync BKL pushdown
ecryptfs: fasync BKL pushdown
Bluetooth VHCI: fasync BKL pushdown
tty_io: fasync BKL pushdown
tun: fasync BKL pushdown
i2o: fasync BKL pushdown
mpt: fasync BKL pushdown
Remove BKL from remote_llseek v2
Make FAT users happier by not deadlocking
x86-mce: BKL pushdown
vmwatchdog: BKL pushdown
vmcp: BKL pushdown
via-pmu: BKL pushdown
uml-random: BKL pushdown
uml-mmapper: BKL pushdown
...
Diffstat (limited to 'arch')
29 files changed, 180 insertions, 59 deletions
diff --git a/arch/blackfin/mach-bf561/coreb.c b/arch/blackfin/mach-bf561/coreb.c index 1b44e9e6dc3b..8598098c0840 100644 --- a/arch/blackfin/mach-bf561/coreb.c +++ b/arch/blackfin/mach-bf561/coreb.c | |||
@@ -194,6 +194,7 @@ static loff_t coreb_lseek(struct file *file, loff_t offset, int origin) | |||
194 | return ret; | 194 | return ret; |
195 | } | 195 | } |
196 | 196 | ||
197 | /* No BKL needed here */ | ||
197 | static int coreb_open(struct inode *inode, struct file *file) | 198 | static int coreb_open(struct inode *inode, struct file *file) |
198 | { | 199 | { |
199 | spin_lock_irq(&coreb_lock); | 200 | spin_lock_irq(&coreb_lock); |
diff --git a/arch/cris/arch-v10/drivers/eeprom.c b/arch/cris/arch-v10/drivers/eeprom.c index f1cac9dc75b8..1f2ae909d3e6 100644 --- a/arch/cris/arch-v10/drivers/eeprom.c +++ b/arch/cris/arch-v10/drivers/eeprom.c | |||
@@ -28,6 +28,7 @@ | |||
28 | #include <linux/init.h> | 28 | #include <linux/init.h> |
29 | #include <linux/delay.h> | 29 | #include <linux/delay.h> |
30 | #include <linux/interrupt.h> | 30 | #include <linux/interrupt.h> |
31 | #include <linux/smp_lock.h> | ||
31 | #include <linux/wait.h> | 32 | #include <linux/wait.h> |
32 | #include <asm/uaccess.h> | 33 | #include <asm/uaccess.h> |
33 | #include "i2c.h" | 34 | #include "i2c.h" |
@@ -375,10 +376,9 @@ int __init eeprom_init(void) | |||
375 | } | 376 | } |
376 | 377 | ||
377 | /* Opens the device. */ | 378 | /* Opens the device. */ |
378 | |||
379 | static int eeprom_open(struct inode * inode, struct file * file) | 379 | static int eeprom_open(struct inode * inode, struct file * file) |
380 | { | 380 | { |
381 | 381 | cycle_kernel_lock(); | |
382 | if(iminor(inode) != EEPROM_MINOR_NR) | 382 | if(iminor(inode) != EEPROM_MINOR_NR) |
383 | return -ENXIO; | 383 | return -ENXIO; |
384 | if(imajor(inode) != EEPROM_MAJOR_NR) | 384 | if(imajor(inode) != EEPROM_MAJOR_NR) |
diff --git a/arch/cris/arch-v10/drivers/gpio.c b/arch/cris/arch-v10/drivers/gpio.c index 68a998bd1069..86048e697eb5 100644 --- a/arch/cris/arch-v10/drivers/gpio.c +++ b/arch/cris/arch-v10/drivers/gpio.c | |||
@@ -16,6 +16,7 @@ | |||
16 | #include <linux/errno.h> | 16 | #include <linux/errno.h> |
17 | #include <linux/kernel.h> | 17 | #include <linux/kernel.h> |
18 | #include <linux/fs.h> | 18 | #include <linux/fs.h> |
19 | #include <linux/smp_lock.h> | ||
19 | #include <linux/string.h> | 20 | #include <linux/string.h> |
20 | #include <linux/poll.h> | 21 | #include <linux/poll.h> |
21 | #include <linux/init.h> | 22 | #include <linux/init.h> |
@@ -323,6 +324,7 @@ gpio_open(struct inode *inode, struct file *filp) | |||
323 | if (!priv) | 324 | if (!priv) |
324 | return -ENOMEM; | 325 | return -ENOMEM; |
325 | 326 | ||
327 | lock_kernel(); | ||
326 | priv->minor = p; | 328 | priv->minor = p; |
327 | 329 | ||
328 | /* initialize the io/alarm struct */ | 330 | /* initialize the io/alarm struct */ |
@@ -357,6 +359,7 @@ gpio_open(struct inode *inode, struct file *filp) | |||
357 | alarmlist = priv; | 359 | alarmlist = priv; |
358 | spin_unlock_irqrestore(&gpio_lock, flags); | 360 | spin_unlock_irqrestore(&gpio_lock, flags); |
359 | 361 | ||
362 | unlock_kernel(); | ||
360 | return 0; | 363 | return 0; |
361 | } | 364 | } |
362 | 365 | ||
diff --git a/arch/cris/arch-v10/drivers/i2c.c b/arch/cris/arch-v10/drivers/i2c.c index d6d22067d0c8..2797e67ce4f4 100644 --- a/arch/cris/arch-v10/drivers/i2c.c +++ b/arch/cris/arch-v10/drivers/i2c.c | |||
@@ -15,6 +15,7 @@ | |||
15 | #include <linux/module.h> | 15 | #include <linux/module.h> |
16 | #include <linux/sched.h> | 16 | #include <linux/sched.h> |
17 | #include <linux/slab.h> | 17 | #include <linux/slab.h> |
18 | #include <linux/smp_lock.h> | ||
18 | #include <linux/errno.h> | 19 | #include <linux/errno.h> |
19 | #include <linux/kernel.h> | 20 | #include <linux/kernel.h> |
20 | #include <linux/fs.h> | 21 | #include <linux/fs.h> |
@@ -566,6 +567,7 @@ i2c_readreg(unsigned char theSlave, unsigned char theReg) | |||
566 | static int | 567 | static int |
567 | i2c_open(struct inode *inode, struct file *filp) | 568 | i2c_open(struct inode *inode, struct file *filp) |
568 | { | 569 | { |
570 | cycle_kernel_lock(); | ||
569 | return 0; | 571 | return 0; |
570 | } | 572 | } |
571 | 573 | ||
diff --git a/arch/cris/arch-v10/drivers/sync_serial.c b/arch/cris/arch-v10/drivers/sync_serial.c index 069546e342c5..91fea623c7c9 100644 --- a/arch/cris/arch-v10/drivers/sync_serial.c +++ b/arch/cris/arch-v10/drivers/sync_serial.c | |||
@@ -21,6 +21,7 @@ | |||
21 | #include <linux/interrupt.h> | 21 | #include <linux/interrupt.h> |
22 | #include <linux/poll.h> | 22 | #include <linux/poll.h> |
23 | #include <linux/init.h> | 23 | #include <linux/init.h> |
24 | #include <linux/smp_lock.h> | ||
24 | #include <linux/timer.h> | 25 | #include <linux/timer.h> |
25 | #include <asm/irq.h> | 26 | #include <asm/irq.h> |
26 | #include <asm/dma.h> | 27 | #include <asm/dma.h> |
@@ -443,18 +444,21 @@ static int sync_serial_open(struct inode *inode, struct file *file) | |||
443 | int dev = MINOR(inode->i_rdev); | 444 | int dev = MINOR(inode->i_rdev); |
444 | struct sync_port *port; | 445 | struct sync_port *port; |
445 | int mode; | 446 | int mode; |
447 | int err = -EBUSY; | ||
446 | 448 | ||
449 | lock_kernel(); | ||
447 | DEBUG(printk(KERN_DEBUG "Open sync serial port %d\n", dev)); | 450 | DEBUG(printk(KERN_DEBUG "Open sync serial port %d\n", dev)); |
448 | 451 | ||
449 | if (dev < 0 || dev >= NUMBER_OF_PORTS || !ports[dev].enabled) { | 452 | if (dev < 0 || dev >= NUMBER_OF_PORTS || !ports[dev].enabled) { |
450 | DEBUG(printk(KERN_DEBUG "Invalid minor %d\n", dev)); | 453 | DEBUG(printk(KERN_DEBUG "Invalid minor %d\n", dev)); |
451 | return -ENODEV; | 454 | err = -ENODEV; |
455 | goto out; | ||
452 | } | 456 | } |
453 | port = &ports[dev]; | 457 | port = &ports[dev]; |
454 | /* Allow open this device twice (assuming one reader and one writer) */ | 458 | /* Allow open this device twice (assuming one reader and one writer) */ |
455 | if (port->busy == 2) { | 459 | if (port->busy == 2) { |
456 | DEBUG(printk(KERN_DEBUG "Device is busy.. \n")); | 460 | DEBUG(printk(KERN_DEBUG "Device is busy.. \n")); |
457 | return -EBUSY; | 461 | goto out; |
458 | } | 462 | } |
459 | if (port->init_irqs) { | 463 | if (port->init_irqs) { |
460 | if (port->use_dma) { | 464 | if (port->use_dma) { |
@@ -465,14 +469,14 @@ static int sync_serial_open(struct inode *inode, struct file *file) | |||
465 | &ports[0])) { | 469 | &ports[0])) { |
466 | printk(KERN_CRIT "Can't alloc " | 470 | printk(KERN_CRIT "Can't alloc " |
467 | "sync serial port 1 IRQ"); | 471 | "sync serial port 1 IRQ"); |
468 | return -EBUSY; | 472 | goto out; |
469 | } else if (request_irq(25, rx_interrupt, 0, | 473 | } else if (request_irq(25, rx_interrupt, 0, |
470 | "synchronous serial 1 dma rx", | 474 | "synchronous serial 1 dma rx", |
471 | &ports[0])) { | 475 | &ports[0])) { |
472 | free_irq(24, &port[0]); | 476 | free_irq(24, &port[0]); |
473 | printk(KERN_CRIT "Can't alloc " | 477 | printk(KERN_CRIT "Can't alloc " |
474 | "sync serial port 1 IRQ"); | 478 | "sync serial port 1 IRQ"); |
475 | return -EBUSY; | 479 | goto out; |
476 | } else if (cris_request_dma(8, | 480 | } else if (cris_request_dma(8, |
477 | "synchronous serial 1 dma tr", | 481 | "synchronous serial 1 dma tr", |
478 | DMA_VERBOSE_ON_ERROR, | 482 | DMA_VERBOSE_ON_ERROR, |
@@ -482,7 +486,7 @@ static int sync_serial_open(struct inode *inode, struct file *file) | |||
482 | printk(KERN_CRIT "Can't alloc " | 486 | printk(KERN_CRIT "Can't alloc " |
483 | "sync serial port 1 " | 487 | "sync serial port 1 " |
484 | "TX DMA channel"); | 488 | "TX DMA channel"); |
485 | return -EBUSY; | 489 | goto out; |
486 | } else if (cris_request_dma(9, | 490 | } else if (cris_request_dma(9, |
487 | "synchronous serial 1 dma rec", | 491 | "synchronous serial 1 dma rec", |
488 | DMA_VERBOSE_ON_ERROR, | 492 | DMA_VERBOSE_ON_ERROR, |
@@ -493,7 +497,7 @@ static int sync_serial_open(struct inode *inode, struct file *file) | |||
493 | printk(KERN_CRIT "Can't alloc " | 497 | printk(KERN_CRIT "Can't alloc " |
494 | "sync serial port 1 " | 498 | "sync serial port 1 " |
495 | "RX DMA channel"); | 499 | "RX DMA channel"); |
496 | return -EBUSY; | 500 | goto out; |
497 | } | 501 | } |
498 | #endif | 502 | #endif |
499 | RESET_DMA(8); WAIT_DMA(8); | 503 | RESET_DMA(8); WAIT_DMA(8); |
@@ -520,14 +524,14 @@ static int sync_serial_open(struct inode *inode, struct file *file) | |||
520 | &ports[1])) { | 524 | &ports[1])) { |
521 | printk(KERN_CRIT "Can't alloc " | 525 | printk(KERN_CRIT "Can't alloc " |
522 | "sync serial port 3 IRQ"); | 526 | "sync serial port 3 IRQ"); |
523 | return -EBUSY; | 527 | goto out; |
524 | } else if (request_irq(21, rx_interrupt, 0, | 528 | } else if (request_irq(21, rx_interrupt, 0, |
525 | "synchronous serial 3 dma rx", | 529 | "synchronous serial 3 dma rx", |
526 | &ports[1])) { | 530 | &ports[1])) { |
527 | free_irq(20, &ports[1]); | 531 | free_irq(20, &ports[1]); |
528 | printk(KERN_CRIT "Can't alloc " | 532 | printk(KERN_CRIT "Can't alloc " |
529 | "sync serial port 3 IRQ"); | 533 | "sync serial port 3 IRQ"); |
530 | return -EBUSY; | 534 | goto out; |
531 | } else if (cris_request_dma(4, | 535 | } else if (cris_request_dma(4, |
532 | "synchronous serial 3 dma tr", | 536 | "synchronous serial 3 dma tr", |
533 | DMA_VERBOSE_ON_ERROR, | 537 | DMA_VERBOSE_ON_ERROR, |
@@ -537,7 +541,7 @@ static int sync_serial_open(struct inode *inode, struct file *file) | |||
537 | printk(KERN_CRIT "Can't alloc " | 541 | printk(KERN_CRIT "Can't alloc " |
538 | "sync serial port 3 " | 542 | "sync serial port 3 " |
539 | "TX DMA channel"); | 543 | "TX DMA channel"); |
540 | return -EBUSY; | 544 | goto out; |
541 | } else if (cris_request_dma(5, | 545 | } else if (cris_request_dma(5, |
542 | "synchronous serial 3 dma rec", | 546 | "synchronous serial 3 dma rec", |
543 | DMA_VERBOSE_ON_ERROR, | 547 | DMA_VERBOSE_ON_ERROR, |
@@ -548,7 +552,7 @@ static int sync_serial_open(struct inode *inode, struct file *file) | |||
548 | printk(KERN_CRIT "Can't alloc " | 552 | printk(KERN_CRIT "Can't alloc " |
549 | "sync serial port 3 " | 553 | "sync serial port 3 " |
550 | "RX DMA channel"); | 554 | "RX DMA channel"); |
551 | return -EBUSY; | 555 | goto out; |
552 | } | 556 | } |
553 | #endif | 557 | #endif |
554 | RESET_DMA(4); WAIT_DMA(4); | 558 | RESET_DMA(4); WAIT_DMA(4); |
@@ -581,7 +585,7 @@ static int sync_serial_open(struct inode *inode, struct file *file) | |||
581 | &ports[0])) { | 585 | &ports[0])) { |
582 | printk(KERN_CRIT "Can't alloc " | 586 | printk(KERN_CRIT "Can't alloc " |
583 | "sync serial manual irq"); | 587 | "sync serial manual irq"); |
584 | return -EBUSY; | 588 | goto out; |
585 | } | 589 | } |
586 | } else if (port == &ports[1]) { | 590 | } else if (port == &ports[1]) { |
587 | if (request_irq(8, | 591 | if (request_irq(8, |
@@ -591,7 +595,7 @@ static int sync_serial_open(struct inode *inode, struct file *file) | |||
591 | &ports[1])) { | 595 | &ports[1])) { |
592 | printk(KERN_CRIT "Can't alloc " | 596 | printk(KERN_CRIT "Can't alloc " |
593 | "sync serial manual irq"); | 597 | "sync serial manual irq"); |
594 | return -EBUSY; | 598 | goto out; |
595 | } | 599 | } |
596 | } | 600 | } |
597 | port->init_irqs = 0; | 601 | port->init_irqs = 0; |
@@ -620,7 +624,11 @@ static int sync_serial_open(struct inode *inode, struct file *file) | |||
620 | *R_IRQ_MASK1_SET = 1 << port->data_avail_bit; | 624 | *R_IRQ_MASK1_SET = 1 << port->data_avail_bit; |
621 | DEBUG(printk(KERN_DEBUG "sser%d rec started\n", dev)); | 625 | DEBUG(printk(KERN_DEBUG "sser%d rec started\n", dev)); |
622 | } | 626 | } |
623 | return 0; | 627 | ret = 0; |
628 | |||
629 | out: | ||
630 | unlock_kernel(); | ||
631 | return ret; | ||
624 | } | 632 | } |
625 | 633 | ||
626 | static int sync_serial_release(struct inode *inode, struct file *file) | 634 | static int sync_serial_release(struct inode *inode, struct file *file) |
diff --git a/arch/cris/arch-v32/drivers/cryptocop.c b/arch/cris/arch-v32/drivers/cryptocop.c index 9fb58202be99..67c61ea86813 100644 --- a/arch/cris/arch-v32/drivers/cryptocop.c +++ b/arch/cris/arch-v32/drivers/cryptocop.c | |||
@@ -11,6 +11,7 @@ | |||
11 | #include <linux/string.h> | 11 | #include <linux/string.h> |
12 | #include <linux/fs.h> | 12 | #include <linux/fs.h> |
13 | #include <linux/mm.h> | 13 | #include <linux/mm.h> |
14 | #include <linux/smp_lock.h> | ||
14 | #include <linux/spinlock.h> | 15 | #include <linux/spinlock.h> |
15 | #include <linux/stddef.h> | 16 | #include <linux/stddef.h> |
16 | 17 | ||
@@ -2302,11 +2303,11 @@ static int cryptocop_job_setup(struct cryptocop_prio_job **pj, struct cryptocop_ | |||
2302 | return 0; | 2303 | return 0; |
2303 | } | 2304 | } |
2304 | 2305 | ||
2305 | |||
2306 | static int cryptocop_open(struct inode *inode, struct file *filp) | 2306 | static int cryptocop_open(struct inode *inode, struct file *filp) |
2307 | { | 2307 | { |
2308 | int p = iminor(inode); | 2308 | int p = iminor(inode); |
2309 | 2309 | ||
2310 | cycle_kernel_lock(); | ||
2310 | if (p != CRYPTOCOP_MINOR) return -EINVAL; | 2311 | if (p != CRYPTOCOP_MINOR) return -EINVAL; |
2311 | 2312 | ||
2312 | filp->private_data = NULL; | 2313 | filp->private_data = NULL; |
diff --git a/arch/cris/arch-v32/drivers/i2c.c b/arch/cris/arch-v32/drivers/i2c.c index c2fb7a5c1396..179e7b804331 100644 --- a/arch/cris/arch-v32/drivers/i2c.c +++ b/arch/cris/arch-v32/drivers/i2c.c | |||
@@ -33,6 +33,7 @@ | |||
33 | #include <linux/fs.h> | 33 | #include <linux/fs.h> |
34 | #include <linux/string.h> | 34 | #include <linux/string.h> |
35 | #include <linux/init.h> | 35 | #include <linux/init.h> |
36 | #include <linux/smp_lock.h> | ||
36 | 37 | ||
37 | #include <asm/etraxi2c.h> | 38 | #include <asm/etraxi2c.h> |
38 | 39 | ||
@@ -636,6 +637,7 @@ i2c_readreg(unsigned char theSlave, unsigned char theReg) | |||
636 | static int | 637 | static int |
637 | i2c_open(struct inode *inode, struct file *filp) | 638 | i2c_open(struct inode *inode, struct file *filp) |
638 | { | 639 | { |
640 | cycle_kernel_lock(); | ||
639 | return 0; | 641 | return 0; |
640 | } | 642 | } |
641 | 643 | ||
diff --git a/arch/cris/arch-v32/drivers/mach-a3/gpio.c b/arch/cris/arch-v32/drivers/mach-a3/gpio.c index de107dad9f4f..ef98608e5067 100644 --- a/arch/cris/arch-v32/drivers/mach-a3/gpio.c +++ b/arch/cris/arch-v32/drivers/mach-a3/gpio.c | |||
@@ -23,6 +23,7 @@ | |||
23 | #include <linux/init.h> | 23 | #include <linux/init.h> |
24 | #include <linux/interrupt.h> | 24 | #include <linux/interrupt.h> |
25 | #include <linux/spinlock.h> | 25 | #include <linux/spinlock.h> |
26 | #include <linux/smp_lock.h> | ||
26 | 27 | ||
27 | #include <asm/etraxgpio.h> | 28 | #include <asm/etraxgpio.h> |
28 | #include <hwregs/reg_map.h> | 29 | #include <hwregs/reg_map.h> |
@@ -390,6 +391,8 @@ static int gpio_open(struct inode *inode, struct file *filp) | |||
390 | 391 | ||
391 | if (!priv) | 392 | if (!priv) |
392 | return -ENOMEM; | 393 | return -ENOMEM; |
394 | |||
395 | lock_kernel(); | ||
393 | memset(priv, 0, sizeof(*priv)); | 396 | memset(priv, 0, sizeof(*priv)); |
394 | 397 | ||
395 | priv->minor = p; | 398 | priv->minor = p; |
@@ -412,6 +415,7 @@ static int gpio_open(struct inode *inode, struct file *filp) | |||
412 | spin_unlock_irq(&gpio_lock); | 415 | spin_unlock_irq(&gpio_lock); |
413 | } | 416 | } |
414 | 417 | ||
418 | unlock_kernel(); | ||
415 | return 0; | 419 | return 0; |
416 | } | 420 | } |
417 | 421 | ||
diff --git a/arch/cris/arch-v32/drivers/mach-fs/gpio.c b/arch/cris/arch-v32/drivers/mach-fs/gpio.c index 7863fd4efc2b..fe1fde893887 100644 --- a/arch/cris/arch-v32/drivers/mach-fs/gpio.c +++ b/arch/cris/arch-v32/drivers/mach-fs/gpio.c | |||
@@ -22,6 +22,7 @@ | |||
22 | #include <linux/init.h> | 22 | #include <linux/init.h> |
23 | #include <linux/interrupt.h> | 23 | #include <linux/interrupt.h> |
24 | #include <linux/spinlock.h> | 24 | #include <linux/spinlock.h> |
25 | #include <linux/smp_lock.h> | ||
25 | 26 | ||
26 | #include <asm/etraxgpio.h> | 27 | #include <asm/etraxgpio.h> |
27 | #include <hwregs/reg_map.h> | 28 | #include <hwregs/reg_map.h> |
@@ -426,9 +427,10 @@ gpio_open(struct inode *inode, struct file *filp) | |||
426 | return -EINVAL; | 427 | return -EINVAL; |
427 | 428 | ||
428 | priv = kmalloc(sizeof(struct gpio_private), GFP_KERNEL); | 429 | priv = kmalloc(sizeof(struct gpio_private), GFP_KERNEL); |
429 | |||
430 | if (!priv) | 430 | if (!priv) |
431 | return -ENOMEM; | 431 | return -ENOMEM; |
432 | |||
433 | lock_kernel(); | ||
432 | memset(priv, 0, sizeof(*priv)); | 434 | memset(priv, 0, sizeof(*priv)); |
433 | 435 | ||
434 | priv->minor = p; | 436 | priv->minor = p; |
@@ -449,6 +451,7 @@ gpio_open(struct inode *inode, struct file *filp) | |||
449 | alarmlist = priv; | 451 | alarmlist = priv; |
450 | spin_unlock_irq(&alarm_lock); | 452 | spin_unlock_irq(&alarm_lock); |
451 | 453 | ||
454 | unlock_kernel(); | ||
452 | return 0; | 455 | return 0; |
453 | } | 456 | } |
454 | 457 | ||
diff --git a/arch/cris/arch-v32/drivers/sync_serial.c b/arch/cris/arch-v32/drivers/sync_serial.c index 47c377df6fb3..d2a0fbf5341f 100644 --- a/arch/cris/arch-v32/drivers/sync_serial.c +++ b/arch/cris/arch-v32/drivers/sync_serial.c | |||
@@ -14,6 +14,7 @@ | |||
14 | #include <linux/major.h> | 14 | #include <linux/major.h> |
15 | #include <linux/sched.h> | 15 | #include <linux/sched.h> |
16 | #include <linux/slab.h> | 16 | #include <linux/slab.h> |
17 | #include <linux/smp_lock.h> | ||
17 | #include <linux/interrupt.h> | 18 | #include <linux/interrupt.h> |
18 | #include <linux/poll.h> | 19 | #include <linux/poll.h> |
19 | #include <linux/init.h> | 20 | #include <linux/init.h> |
@@ -429,23 +430,26 @@ static inline int sync_data_avail_to_end(struct sync_port *port) | |||
429 | static int sync_serial_open(struct inode *inode, struct file *file) | 430 | static int sync_serial_open(struct inode *inode, struct file *file) |
430 | { | 431 | { |
431 | int dev = iminor(inode); | 432 | int dev = iminor(inode); |
433 | int ret = -EBUSY; | ||
432 | sync_port *port; | 434 | sync_port *port; |
433 | reg_dma_rw_cfg cfg = {.en = regk_dma_yes}; | 435 | reg_dma_rw_cfg cfg = {.en = regk_dma_yes}; |
434 | reg_dma_rw_intr_mask intr_mask = {.data = regk_dma_yes}; | 436 | reg_dma_rw_intr_mask intr_mask = {.data = regk_dma_yes}; |
435 | 437 | ||
438 | lock_kernel(); | ||
436 | DEBUG(printk(KERN_DEBUG "Open sync serial port %d\n", dev)); | 439 | DEBUG(printk(KERN_DEBUG "Open sync serial port %d\n", dev)); |
437 | 440 | ||
438 | if (dev < 0 || dev >= NBR_PORTS || !ports[dev].enabled) | 441 | if (dev < 0 || dev >= NBR_PORTS || !ports[dev].enabled) |
439 | { | 442 | { |
440 | DEBUG(printk(KERN_DEBUG "Invalid minor %d\n", dev)); | 443 | DEBUG(printk(KERN_DEBUG "Invalid minor %d\n", dev)); |
441 | return -ENODEV; | 444 | ret = -ENODEV; |
445 | goto out; | ||
442 | } | 446 | } |
443 | port = &ports[dev]; | 447 | port = &ports[dev]; |
444 | /* Allow open this device twice (assuming one reader and one writer) */ | 448 | /* Allow open this device twice (assuming one reader and one writer) */ |
445 | if (port->busy == 2) | 449 | if (port->busy == 2) |
446 | { | 450 | { |
447 | DEBUG(printk(KERN_DEBUG "Device is busy.. \n")); | 451 | DEBUG(printk(KERN_DEBUG "Device is busy.. \n")); |
448 | return -EBUSY; | 452 | goto out; |
449 | } | 453 | } |
450 | 454 | ||
451 | 455 | ||
@@ -459,7 +463,7 @@ static int sync_serial_open(struct inode *inode, struct file *file) | |||
459 | "synchronous serial 0 dma tr", | 463 | "synchronous serial 0 dma tr", |
460 | &ports[0])) { | 464 | &ports[0])) { |
461 | printk(KERN_CRIT "Can't allocate sync serial port 0 IRQ"); | 465 | printk(KERN_CRIT "Can't allocate sync serial port 0 IRQ"); |
462 | return -EBUSY; | 466 | goto out; |
463 | } else if (request_irq(DMA_IN_INTR_VECT, | 467 | } else if (request_irq(DMA_IN_INTR_VECT, |
464 | rx_interrupt, | 468 | rx_interrupt, |
465 | 0, | 469 | 0, |
@@ -467,7 +471,7 @@ static int sync_serial_open(struct inode *inode, struct file *file) | |||
467 | &ports[0])) { | 471 | &ports[0])) { |
468 | free_irq(DMA_OUT_INTR_VECT, &port[0]); | 472 | free_irq(DMA_OUT_INTR_VECT, &port[0]); |
469 | printk(KERN_CRIT "Can't allocate sync serial port 0 IRQ"); | 473 | printk(KERN_CRIT "Can't allocate sync serial port 0 IRQ"); |
470 | return -EBUSY; | 474 | goto out; |
471 | } else if (crisv32_request_dma(OUT_DMA_NBR, | 475 | } else if (crisv32_request_dma(OUT_DMA_NBR, |
472 | "synchronous serial 0 dma tr", | 476 | "synchronous serial 0 dma tr", |
473 | DMA_VERBOSE_ON_ERROR, | 477 | DMA_VERBOSE_ON_ERROR, |
@@ -476,7 +480,7 @@ static int sync_serial_open(struct inode *inode, struct file *file) | |||
476 | free_irq(DMA_OUT_INTR_VECT, &port[0]); | 480 | free_irq(DMA_OUT_INTR_VECT, &port[0]); |
477 | free_irq(DMA_IN_INTR_VECT, &port[0]); | 481 | free_irq(DMA_IN_INTR_VECT, &port[0]); |
478 | printk(KERN_CRIT "Can't allocate sync serial port 0 TX DMA channel"); | 482 | printk(KERN_CRIT "Can't allocate sync serial port 0 TX DMA channel"); |
479 | return -EBUSY; | 483 | goto out; |
480 | } else if (crisv32_request_dma(IN_DMA_NBR, | 484 | } else if (crisv32_request_dma(IN_DMA_NBR, |
481 | "synchronous serial 0 dma rec", | 485 | "synchronous serial 0 dma rec", |
482 | DMA_VERBOSE_ON_ERROR, | 486 | DMA_VERBOSE_ON_ERROR, |
@@ -486,7 +490,7 @@ static int sync_serial_open(struct inode *inode, struct file *file) | |||
486 | free_irq(DMA_OUT_INTR_VECT, &port[0]); | 490 | free_irq(DMA_OUT_INTR_VECT, &port[0]); |
487 | free_irq(DMA_IN_INTR_VECT, &port[0]); | 491 | free_irq(DMA_IN_INTR_VECT, &port[0]); |
488 | printk(KERN_CRIT "Can't allocate sync serial port 1 RX DMA channel"); | 492 | printk(KERN_CRIT "Can't allocate sync serial port 1 RX DMA channel"); |
489 | return -EBUSY; | 493 | goto out; |
490 | } | 494 | } |
491 | #endif | 495 | #endif |
492 | } | 496 | } |
@@ -499,7 +503,7 @@ static int sync_serial_open(struct inode *inode, struct file *file) | |||
499 | "synchronous serial 1 dma tr", | 503 | "synchronous serial 1 dma tr", |
500 | &ports[1])) { | 504 | &ports[1])) { |
501 | printk(KERN_CRIT "Can't allocate sync serial port 1 IRQ"); | 505 | printk(KERN_CRIT "Can't allocate sync serial port 1 IRQ"); |
502 | return -EBUSY; | 506 | goto out; |
503 | } else if (request_irq(DMA7_INTR_VECT, | 507 | } else if (request_irq(DMA7_INTR_VECT, |
504 | rx_interrupt, | 508 | rx_interrupt, |
505 | 0, | 509 | 0, |
@@ -507,7 +511,7 @@ static int sync_serial_open(struct inode *inode, struct file *file) | |||
507 | &ports[1])) { | 511 | &ports[1])) { |
508 | free_irq(DMA6_INTR_VECT, &ports[1]); | 512 | free_irq(DMA6_INTR_VECT, &ports[1]); |
509 | printk(KERN_CRIT "Can't allocate sync serial port 3 IRQ"); | 513 | printk(KERN_CRIT "Can't allocate sync serial port 3 IRQ"); |
510 | return -EBUSY; | 514 | goto out; |
511 | } else if (crisv32_request_dma( | 515 | } else if (crisv32_request_dma( |
512 | SYNC_SER1_TX_DMA_NBR, | 516 | SYNC_SER1_TX_DMA_NBR, |
513 | "synchronous serial 1 dma tr", | 517 | "synchronous serial 1 dma tr", |
@@ -517,7 +521,7 @@ static int sync_serial_open(struct inode *inode, struct file *file) | |||
517 | free_irq(DMA6_INTR_VECT, &ports[1]); | 521 | free_irq(DMA6_INTR_VECT, &ports[1]); |
518 | free_irq(DMA7_INTR_VECT, &ports[1]); | 522 | free_irq(DMA7_INTR_VECT, &ports[1]); |
519 | printk(KERN_CRIT "Can't allocate sync serial port 3 TX DMA channel"); | 523 | printk(KERN_CRIT "Can't allocate sync serial port 3 TX DMA channel"); |
520 | return -EBUSY; | 524 | goto out; |
521 | } else if (crisv32_request_dma( | 525 | } else if (crisv32_request_dma( |
522 | SYNC_SER1_RX_DMA_NBR, | 526 | SYNC_SER1_RX_DMA_NBR, |
523 | "synchronous serial 3 dma rec", | 527 | "synchronous serial 3 dma rec", |
@@ -528,7 +532,7 @@ static int sync_serial_open(struct inode *inode, struct file *file) | |||
528 | free_irq(DMA6_INTR_VECT, &ports[1]); | 532 | free_irq(DMA6_INTR_VECT, &ports[1]); |
529 | free_irq(DMA7_INTR_VECT, &ports[1]); | 533 | free_irq(DMA7_INTR_VECT, &ports[1]); |
530 | printk(KERN_CRIT "Can't allocate sync serial port 3 RX DMA channel"); | 534 | printk(KERN_CRIT "Can't allocate sync serial port 3 RX DMA channel"); |
531 | return -EBUSY; | 535 | goto out; |
532 | } | 536 | } |
533 | #endif | 537 | #endif |
534 | } | 538 | } |
@@ -554,7 +558,7 @@ static int sync_serial_open(struct inode *inode, struct file *file) | |||
554 | "synchronous serial manual irq", | 558 | "synchronous serial manual irq", |
555 | &ports[0])) { | 559 | &ports[0])) { |
556 | printk("Can't allocate sync serial manual irq"); | 560 | printk("Can't allocate sync serial manual irq"); |
557 | return -EBUSY; | 561 | goto out; |
558 | } | 562 | } |
559 | } | 563 | } |
560 | #ifdef CONFIG_ETRAXFS | 564 | #ifdef CONFIG_ETRAXFS |
@@ -565,7 +569,7 @@ static int sync_serial_open(struct inode *inode, struct file *file) | |||
565 | "synchronous serial manual irq", | 569 | "synchronous serial manual irq", |
566 | &ports[1])) { | 570 | &ports[1])) { |
567 | printk(KERN_CRIT "Can't allocate sync serial manual irq"); | 571 | printk(KERN_CRIT "Can't allocate sync serial manual irq"); |
568 | return -EBUSY; | 572 | goto out; |
569 | } | 573 | } |
570 | } | 574 | } |
571 | #endif | 575 | #endif |
@@ -578,7 +582,10 @@ static int sync_serial_open(struct inode *inode, struct file *file) | |||
578 | } /* port->init_irqs */ | 582 | } /* port->init_irqs */ |
579 | 583 | ||
580 | port->busy++; | 584 | port->busy++; |
581 | return 0; | 585 | ret = 0; |
586 | out: | ||
587 | unlock_kernel(); | ||
588 | return ret; | ||
582 | } | 589 | } |
583 | 590 | ||
584 | static int sync_serial_release(struct inode *inode, struct file *file) | 591 | static int sync_serial_release(struct inode *inode, struct file *file) |
diff --git a/arch/m68k/bvme6000/rtc.c b/arch/m68k/bvme6000/rtc.c index a812d03879f8..e8ac3f7d72df 100644 --- a/arch/m68k/bvme6000/rtc.c +++ b/arch/m68k/bvme6000/rtc.c | |||
@@ -10,6 +10,7 @@ | |||
10 | #include <linux/errno.h> | 10 | #include <linux/errno.h> |
11 | #include <linux/miscdevice.h> | 11 | #include <linux/miscdevice.h> |
12 | #include <linux/slab.h> | 12 | #include <linux/slab.h> |
13 | #include <linux/smp_lock.h> | ||
13 | #include <linux/ioport.h> | 14 | #include <linux/ioport.h> |
14 | #include <linux/capability.h> | 15 | #include <linux/capability.h> |
15 | #include <linux/fcntl.h> | 16 | #include <linux/fcntl.h> |
@@ -140,10 +141,14 @@ static int rtc_ioctl(struct inode *inode, struct file *file, unsigned int cmd, | |||
140 | 141 | ||
141 | static int rtc_open(struct inode *inode, struct file *file) | 142 | static int rtc_open(struct inode *inode, struct file *file) |
142 | { | 143 | { |
143 | if(rtc_status) | 144 | lock_kernel(); |
145 | if(rtc_status) { | ||
146 | unlock_kernel(); | ||
144 | return -EBUSY; | 147 | return -EBUSY; |
148 | } | ||
145 | 149 | ||
146 | rtc_status = 1; | 150 | rtc_status = 1; |
151 | unlock_kernel(); | ||
147 | return 0; | 152 | return 0; |
148 | } | 153 | } |
149 | 154 | ||
diff --git a/arch/m68k/mvme16x/rtc.c b/arch/m68k/mvme16x/rtc.c index e341387787ab..432a9f13b2ed 100644 --- a/arch/m68k/mvme16x/rtc.c +++ b/arch/m68k/mvme16x/rtc.c | |||
@@ -10,6 +10,7 @@ | |||
10 | #include <linux/errno.h> | 10 | #include <linux/errno.h> |
11 | #include <linux/miscdevice.h> | 11 | #include <linux/miscdevice.h> |
12 | #include <linux/slab.h> | 12 | #include <linux/slab.h> |
13 | #include <linux/smp_lock.h> | ||
13 | #include <linux/ioport.h> | 14 | #include <linux/ioport.h> |
14 | #include <linux/capability.h> | 15 | #include <linux/capability.h> |
15 | #include <linux/fcntl.h> | 16 | #include <linux/fcntl.h> |
@@ -127,11 +128,14 @@ static int rtc_ioctl(struct inode *inode, struct file *file, unsigned int cmd, | |||
127 | 128 | ||
128 | static int rtc_open(struct inode *inode, struct file *file) | 129 | static int rtc_open(struct inode *inode, struct file *file) |
129 | { | 130 | { |
131 | lock_kernel(); | ||
130 | if( !atomic_dec_and_test(&rtc_ready) ) | 132 | if( !atomic_dec_and_test(&rtc_ready) ) |
131 | { | 133 | { |
132 | atomic_inc( &rtc_ready ); | 134 | atomic_inc( &rtc_ready ); |
135 | unlock_kernel(); | ||
133 | return -EBUSY; | 136 | return -EBUSY; |
134 | } | 137 | } |
138 | unlock_kernel(); | ||
135 | 139 | ||
136 | return 0; | 140 | return 0; |
137 | } | 141 | } |
diff --git a/arch/mips/basler/excite/excite_iodev.c b/arch/mips/basler/excite/excite_iodev.c index 476d20e08d0e..a1e3526b4a94 100644 --- a/arch/mips/basler/excite/excite_iodev.c +++ b/arch/mips/basler/excite/excite_iodev.c | |||
@@ -26,6 +26,7 @@ | |||
26 | #include <linux/interrupt.h> | 26 | #include <linux/interrupt.h> |
27 | #include <linux/platform_device.h> | 27 | #include <linux/platform_device.h> |
28 | #include <linux/miscdevice.h> | 28 | #include <linux/miscdevice.h> |
29 | #include <linux/smp_lock.h> | ||
29 | 30 | ||
30 | #include "excite_iodev.h" | 31 | #include "excite_iodev.h" |
31 | 32 | ||
@@ -110,8 +111,14 @@ static int __exit iodev_remove(struct device *dev) | |||
110 | 111 | ||
111 | static int iodev_open(struct inode *i, struct file *f) | 112 | static int iodev_open(struct inode *i, struct file *f) |
112 | { | 113 | { |
113 | return request_irq(iodev_irq, iodev_irqhdl, IRQF_DISABLED, | 114 | int ret; |
115 | |||
116 | lock_kernel(); | ||
117 | ret = request_irq(iodev_irq, iodev_irqhdl, IRQF_DISABLED, | ||
114 | iodev_name, &miscdev); | 118 | iodev_name, &miscdev); |
119 | unlock_kernel(); | ||
120 | |||
121 | return ret; | ||
115 | } | 122 | } |
116 | 123 | ||
117 | static int iodev_release(struct inode *i, struct file *f) | 124 | static int iodev_release(struct inode *i, struct file *f) |
diff --git a/arch/mips/kernel/rtlx.c b/arch/mips/kernel/rtlx.c index b88f1c18ff4d..b55641961232 100644 --- a/arch/mips/kernel/rtlx.c +++ b/arch/mips/kernel/rtlx.c | |||
@@ -28,6 +28,7 @@ | |||
28 | #include <linux/vmalloc.h> | 28 | #include <linux/vmalloc.h> |
29 | #include <linux/elf.h> | 29 | #include <linux/elf.h> |
30 | #include <linux/seq_file.h> | 30 | #include <linux/seq_file.h> |
31 | #include <linux/smp_lock.h> | ||
31 | #include <linux/syscalls.h> | 32 | #include <linux/syscalls.h> |
32 | #include <linux/moduleloader.h> | 33 | #include <linux/moduleloader.h> |
33 | #include <linux/interrupt.h> | 34 | #include <linux/interrupt.h> |
@@ -392,8 +393,12 @@ out: | |||
392 | static int file_open(struct inode *inode, struct file *filp) | 393 | static int file_open(struct inode *inode, struct file *filp) |
393 | { | 394 | { |
394 | int minor = iminor(inode); | 395 | int minor = iminor(inode); |
396 | int err; | ||
395 | 397 | ||
396 | return rtlx_open(minor, (filp->f_flags & O_NONBLOCK) ? 0 : 1); | 398 | lock_kernel(); |
399 | err = rtlx_open(minor, (filp->f_flags & O_NONBLOCK) ? 0 : 1); | ||
400 | unlock_kernel(); | ||
401 | return err; | ||
397 | } | 402 | } |
398 | 403 | ||
399 | static int file_release(struct inode *inode, struct file *filp) | 404 | static int file_release(struct inode *inode, struct file *filp) |
diff --git a/arch/mips/kernel/vpe.c b/arch/mips/kernel/vpe.c index 2794501ff302..972b2d2b8401 100644 --- a/arch/mips/kernel/vpe.c +++ b/arch/mips/kernel/vpe.c | |||
@@ -38,6 +38,7 @@ | |||
38 | #include <linux/vmalloc.h> | 38 | #include <linux/vmalloc.h> |
39 | #include <linux/elf.h> | 39 | #include <linux/elf.h> |
40 | #include <linux/seq_file.h> | 40 | #include <linux/seq_file.h> |
41 | #include <linux/smp_lock.h> | ||
41 | #include <linux/syscalls.h> | 42 | #include <linux/syscalls.h> |
42 | #include <linux/moduleloader.h> | 43 | #include <linux/moduleloader.h> |
43 | #include <linux/interrupt.h> | 44 | #include <linux/interrupt.h> |
@@ -1050,17 +1051,20 @@ static int vpe_open(struct inode *inode, struct file *filp) | |||
1050 | enum vpe_state state; | 1051 | enum vpe_state state; |
1051 | struct vpe_notifications *not; | 1052 | struct vpe_notifications *not; |
1052 | struct vpe *v; | 1053 | struct vpe *v; |
1053 | int ret; | 1054 | int ret, err = 0; |
1054 | 1055 | ||
1056 | lock_kernel(); | ||
1055 | if (minor != iminor(inode)) { | 1057 | if (minor != iminor(inode)) { |
1056 | /* assume only 1 device at the moment. */ | 1058 | /* assume only 1 device at the moment. */ |
1057 | printk(KERN_WARNING "VPE loader: only vpe1 is supported\n"); | 1059 | printk(KERN_WARNING "VPE loader: only vpe1 is supported\n"); |
1058 | return -ENODEV; | 1060 | err = -ENODEV; |
1061 | goto out; | ||
1059 | } | 1062 | } |
1060 | 1063 | ||
1061 | if ((v = get_vpe(tclimit)) == NULL) { | 1064 | if ((v = get_vpe(tclimit)) == NULL) { |
1062 | printk(KERN_WARNING "VPE loader: unable to get vpe\n"); | 1065 | printk(KERN_WARNING "VPE loader: unable to get vpe\n"); |
1063 | return -ENODEV; | 1066 | err = -ENODEV; |
1067 | goto out; | ||
1064 | } | 1068 | } |
1065 | 1069 | ||
1066 | state = xchg(&v->state, VPE_STATE_INUSE); | 1070 | state = xchg(&v->state, VPE_STATE_INUSE); |
@@ -1100,6 +1104,8 @@ static int vpe_open(struct inode *inode, struct file *filp) | |||
1100 | v->shared_ptr = NULL; | 1104 | v->shared_ptr = NULL; |
1101 | v->__start = 0; | 1105 | v->__start = 0; |
1102 | 1106 | ||
1107 | out: | ||
1108 | unlock_kernel(); | ||
1103 | return 0; | 1109 | return 0; |
1104 | } | 1110 | } |
1105 | 1111 | ||
diff --git a/arch/mips/sibyte/common/sb_tbprof.c b/arch/mips/sibyte/common/sb_tbprof.c index 63b444eaf01e..28b012ab8dcb 100644 --- a/arch/mips/sibyte/common/sb_tbprof.c +++ b/arch/mips/sibyte/common/sb_tbprof.c | |||
@@ -28,6 +28,7 @@ | |||
28 | #include <linux/init.h> | 28 | #include <linux/init.h> |
29 | #include <linux/interrupt.h> | 29 | #include <linux/interrupt.h> |
30 | #include <linux/slab.h> | 30 | #include <linux/slab.h> |
31 | #include <linux/smp_lock.h> | ||
31 | #include <linux/vmalloc.h> | 32 | #include <linux/vmalloc.h> |
32 | #include <linux/fs.h> | 33 | #include <linux/fs.h> |
33 | #include <linux/errno.h> | 34 | #include <linux/errno.h> |
@@ -402,18 +403,26 @@ static int sbprof_zbprof_stop(void) | |||
402 | static int sbprof_tb_open(struct inode *inode, struct file *filp) | 403 | static int sbprof_tb_open(struct inode *inode, struct file *filp) |
403 | { | 404 | { |
404 | int minor; | 405 | int minor; |
406 | int err = 0; | ||
405 | 407 | ||
408 | lock_kernel(); | ||
406 | minor = iminor(inode); | 409 | minor = iminor(inode); |
407 | if (minor != 0) | 410 | if (minor != 0) { |
408 | return -ENODEV; | 411 | err = -ENODEV; |
412 | goto out; | ||
413 | } | ||
409 | 414 | ||
410 | if (xchg(&sbp.open, SB_OPENING) != SB_CLOSED) | 415 | if (xchg(&sbp.open, SB_OPENING) != SB_CLOSED) { |
411 | return -EBUSY; | 416 | err = -EBUSY; |
417 | goto out; | ||
418 | } | ||
412 | 419 | ||
413 | memset(&sbp, 0, sizeof(struct sbprof_tb)); | 420 | memset(&sbp, 0, sizeof(struct sbprof_tb)); |
414 | sbp.sbprof_tbbuf = vmalloc(MAX_TBSAMPLE_BYTES); | 421 | sbp.sbprof_tbbuf = vmalloc(MAX_TBSAMPLE_BYTES); |
415 | if (!sbp.sbprof_tbbuf) | 422 | if (!sbp.sbprof_tbbuf) { |
416 | return -ENOMEM; | 423 | err = -ENOMEM; |
424 | goto out; | ||
425 | } | ||
417 | memset(sbp.sbprof_tbbuf, 0, MAX_TBSAMPLE_BYTES); | 426 | memset(sbp.sbprof_tbbuf, 0, MAX_TBSAMPLE_BYTES); |
418 | init_waitqueue_head(&sbp.tb_sync); | 427 | init_waitqueue_head(&sbp.tb_sync); |
419 | init_waitqueue_head(&sbp.tb_read); | 428 | init_waitqueue_head(&sbp.tb_read); |
@@ -421,7 +430,9 @@ static int sbprof_tb_open(struct inode *inode, struct file *filp) | |||
421 | 430 | ||
422 | sbp.open = SB_OPEN; | 431 | sbp.open = SB_OPEN; |
423 | 432 | ||
424 | return 0; | 433 | out: |
434 | unlock_kernel(); | ||
435 | return err; | ||
425 | } | 436 | } |
426 | 437 | ||
427 | static int sbprof_tb_release(struct inode *inode, struct file *filp) | 438 | static int sbprof_tb_release(struct inode *inode, struct file *filp) |
diff --git a/arch/parisc/kernel/perf.c b/arch/parisc/kernel/perf.c index 89d6d5ad44b5..f696f57faa15 100644 --- a/arch/parisc/kernel/perf.c +++ b/arch/parisc/kernel/perf.c | |||
@@ -46,6 +46,7 @@ | |||
46 | #include <linux/init.h> | 46 | #include <linux/init.h> |
47 | #include <linux/proc_fs.h> | 47 | #include <linux/proc_fs.h> |
48 | #include <linux/miscdevice.h> | 48 | #include <linux/miscdevice.h> |
49 | #include <linux/smp_lock.h> | ||
49 | #include <linux/spinlock.h> | 50 | #include <linux/spinlock.h> |
50 | 51 | ||
51 | #include <asm/uaccess.h> | 52 | #include <asm/uaccess.h> |
@@ -260,13 +261,16 @@ printk("Preparing to start counters\n"); | |||
260 | */ | 261 | */ |
261 | static int perf_open(struct inode *inode, struct file *file) | 262 | static int perf_open(struct inode *inode, struct file *file) |
262 | { | 263 | { |
264 | lock_kernel(); | ||
263 | spin_lock(&perf_lock); | 265 | spin_lock(&perf_lock); |
264 | if (perf_enabled) { | 266 | if (perf_enabled) { |
265 | spin_unlock(&perf_lock); | 267 | spin_unlock(&perf_lock); |
268 | unlock_kernel(); | ||
266 | return -EBUSY; | 269 | return -EBUSY; |
267 | } | 270 | } |
268 | perf_enabled = 1; | 271 | perf_enabled = 1; |
269 | spin_unlock(&perf_lock); | 272 | spin_unlock(&perf_lock); |
273 | unlock_kernel(); | ||
270 | 274 | ||
271 | return 0; | 275 | return 0; |
272 | } | 276 | } |
diff --git a/arch/s390/crypto/prng.c b/arch/s390/crypto/prng.c index 6a4300b3ff52..eca724d229ec 100644 --- a/arch/s390/crypto/prng.c +++ b/arch/s390/crypto/prng.c | |||
@@ -6,6 +6,7 @@ | |||
6 | #include <linux/fs.h> | 6 | #include <linux/fs.h> |
7 | #include <linux/init.h> | 7 | #include <linux/init.h> |
8 | #include <linux/kernel.h> | 8 | #include <linux/kernel.h> |
9 | #include <linux/smp_lock.h> | ||
9 | #include <linux/miscdevice.h> | 10 | #include <linux/miscdevice.h> |
10 | #include <linux/module.h> | 11 | #include <linux/module.h> |
11 | #include <linux/moduleparam.h> | 12 | #include <linux/moduleparam.h> |
@@ -48,6 +49,7 @@ static unsigned char parm_block[32] = { | |||
48 | 49 | ||
49 | static int prng_open(struct inode *inode, struct file *file) | 50 | static int prng_open(struct inode *inode, struct file *file) |
50 | { | 51 | { |
52 | cycle_kernel_lock(); | ||
51 | return nonseekable_open(inode, file); | 53 | return nonseekable_open(inode, file); |
52 | } | 54 | } |
53 | 55 | ||
diff --git a/arch/sh/boards/landisk/gio.c b/arch/sh/boards/landisk/gio.c index 17025080db35..0c15b0a50b99 100644 --- a/arch/sh/boards/landisk/gio.c +++ b/arch/sh/boards/landisk/gio.c | |||
@@ -14,6 +14,7 @@ | |||
14 | */ | 14 | */ |
15 | #include <linux/module.h> | 15 | #include <linux/module.h> |
16 | #include <linux/init.h> | 16 | #include <linux/init.h> |
17 | #include <linux/smp_lock.h> | ||
17 | #include <linux/kdev_t.h> | 18 | #include <linux/kdev_t.h> |
18 | #include <linux/cdev.h> | 19 | #include <linux/cdev.h> |
19 | #include <linux/fs.h> | 20 | #include <linux/fs.h> |
@@ -32,17 +33,20 @@ static int openCnt; | |||
32 | static int gio_open(struct inode *inode, struct file *filp) | 33 | static int gio_open(struct inode *inode, struct file *filp) |
33 | { | 34 | { |
34 | int minor; | 35 | int minor; |
36 | int ret = -ENOENT; | ||
35 | 37 | ||
38 | lock_kernel(); | ||
36 | minor = MINOR(inode->i_rdev); | 39 | minor = MINOR(inode->i_rdev); |
37 | if (minor < DEVCOUNT) { | 40 | if (minor < DEVCOUNT) { |
38 | if (openCnt > 0) { | 41 | if (openCnt > 0) { |
39 | return -EALREADY; | 42 | ret = -EALREADY; |
40 | } else { | 43 | } else { |
41 | openCnt++; | 44 | openCnt++; |
42 | return 0; | 45 | ret = 0; |
43 | } | 46 | } |
44 | } | 47 | } |
45 | return -ENOENT; | 48 | unlock_kernel(); |
49 | return ret; | ||
46 | } | 50 | } |
47 | 51 | ||
48 | static int gio_close(struct inode *inode, struct file *filp) | 52 | static int gio_close(struct inode *inode, struct file *filp) |
diff --git a/arch/sparc/kernel/apc.c b/arch/sparc/kernel/apc.c index d06a405ca718..6707422c9847 100644 --- a/arch/sparc/kernel/apc.c +++ b/arch/sparc/kernel/apc.c | |||
@@ -10,6 +10,7 @@ | |||
10 | #include <linux/errno.h> | 10 | #include <linux/errno.h> |
11 | #include <linux/init.h> | 11 | #include <linux/init.h> |
12 | #include <linux/miscdevice.h> | 12 | #include <linux/miscdevice.h> |
13 | #include <linux/smp_lock.h> | ||
13 | #include <linux/pm.h> | 14 | #include <linux/pm.h> |
14 | 15 | ||
15 | #include <asm/io.h> | 16 | #include <asm/io.h> |
@@ -75,6 +76,7 @@ static inline void apc_free(void) | |||
75 | 76 | ||
76 | static int apc_open(struct inode *inode, struct file *f) | 77 | static int apc_open(struct inode *inode, struct file *f) |
77 | { | 78 | { |
79 | cycle_kernel_lock(); | ||
78 | return 0; | 80 | return 0; |
79 | } | 81 | } |
80 | 82 | ||
diff --git a/arch/sparc64/kernel/time.c b/arch/sparc64/kernel/time.c index e5d238970c7e..bedc4c159b1c 100644 --- a/arch/sparc64/kernel/time.c +++ b/arch/sparc64/kernel/time.c | |||
@@ -11,6 +11,7 @@ | |||
11 | #include <linux/errno.h> | 11 | #include <linux/errno.h> |
12 | #include <linux/module.h> | 12 | #include <linux/module.h> |
13 | #include <linux/sched.h> | 13 | #include <linux/sched.h> |
14 | #include <linux/smp_lock.h> | ||
14 | #include <linux/kernel.h> | 15 | #include <linux/kernel.h> |
15 | #include <linux/param.h> | 16 | #include <linux/param.h> |
16 | #include <linux/string.h> | 17 | #include <linux/string.h> |
@@ -1659,10 +1660,14 @@ static int mini_rtc_ioctl(struct inode *inode, struct file *file, | |||
1659 | 1660 | ||
1660 | static int mini_rtc_open(struct inode *inode, struct file *file) | 1661 | static int mini_rtc_open(struct inode *inode, struct file *file) |
1661 | { | 1662 | { |
1662 | if (mini_rtc_status & RTC_IS_OPEN) | 1663 | lock_kernel(); |
1664 | if (mini_rtc_status & RTC_IS_OPEN) { | ||
1665 | unlock_kernel(); | ||
1663 | return -EBUSY; | 1666 | return -EBUSY; |
1667 | } | ||
1664 | 1668 | ||
1665 | mini_rtc_status |= RTC_IS_OPEN; | 1669 | mini_rtc_status |= RTC_IS_OPEN; |
1670 | unlock_kernel(); | ||
1666 | 1671 | ||
1667 | return 0; | 1672 | return 0; |
1668 | } | 1673 | } |
diff --git a/arch/um/drivers/harddog_kern.c b/arch/um/drivers/harddog_kern.c index a9ad4bd6d953..d332503fa1be 100644 --- a/arch/um/drivers/harddog_kern.c +++ b/arch/um/drivers/harddog_kern.c | |||
@@ -66,6 +66,7 @@ static int harddog_open(struct inode *inode, struct file *file) | |||
66 | int err = -EBUSY; | 66 | int err = -EBUSY; |
67 | char *sock = NULL; | 67 | char *sock = NULL; |
68 | 68 | ||
69 | lock_kernel(); | ||
69 | spin_lock(&lock); | 70 | spin_lock(&lock); |
70 | if(timer_alive) | 71 | if(timer_alive) |
71 | goto err; | 72 | goto err; |
@@ -82,9 +83,11 @@ static int harddog_open(struct inode *inode, struct file *file) | |||
82 | 83 | ||
83 | timer_alive = 1; | 84 | timer_alive = 1; |
84 | spin_unlock(&lock); | 85 | spin_unlock(&lock); |
86 | unlock_kernel(); | ||
85 | return nonseekable_open(inode, file); | 87 | return nonseekable_open(inode, file); |
86 | err: | 88 | err: |
87 | spin_unlock(&lock); | 89 | spin_unlock(&lock); |
90 | unlock_kernel(); | ||
88 | return err; | 91 | return err; |
89 | } | 92 | } |
90 | 93 | ||
diff --git a/arch/um/drivers/mmapper_kern.c b/arch/um/drivers/mmapper_kern.c index 67b2f55a602f..eb240323c40a 100644 --- a/arch/um/drivers/mmapper_kern.c +++ b/arch/um/drivers/mmapper_kern.c | |||
@@ -16,6 +16,7 @@ | |||
16 | #include <linux/miscdevice.h> | 16 | #include <linux/miscdevice.h> |
17 | #include <linux/module.h> | 17 | #include <linux/module.h> |
18 | #include <linux/mm.h> | 18 | #include <linux/mm.h> |
19 | #include <linux/smp_lock.h> | ||
19 | #include <asm/uaccess.h> | 20 | #include <asm/uaccess.h> |
20 | #include "mem_user.h" | 21 | #include "mem_user.h" |
21 | 22 | ||
@@ -77,6 +78,7 @@ out: | |||
77 | 78 | ||
78 | static int mmapper_open(struct inode *inode, struct file *file) | 79 | static int mmapper_open(struct inode *inode, struct file *file) |
79 | { | 80 | { |
81 | cycle_kernel_lock(); | ||
80 | return 0; | 82 | return 0; |
81 | } | 83 | } |
82 | 84 | ||
diff --git a/arch/um/drivers/random.c b/arch/um/drivers/random.c index 4949044773ba..6eabb7022a2d 100644 --- a/arch/um/drivers/random.c +++ b/arch/um/drivers/random.c | |||
@@ -7,6 +7,7 @@ | |||
7 | * of the GNU General Public License, incorporated herein by reference. | 7 | * of the GNU General Public License, incorporated herein by reference. |
8 | */ | 8 | */ |
9 | #include <linux/sched.h> | 9 | #include <linux/sched.h> |
10 | #include <linux/smp_lock.h> | ||
10 | #include <linux/module.h> | 11 | #include <linux/module.h> |
11 | #include <linux/fs.h> | 12 | #include <linux/fs.h> |
12 | #include <linux/interrupt.h> | 13 | #include <linux/interrupt.h> |
@@ -33,6 +34,8 @@ static DECLARE_WAIT_QUEUE_HEAD(host_read_wait); | |||
33 | 34 | ||
34 | static int rng_dev_open (struct inode *inode, struct file *filp) | 35 | static int rng_dev_open (struct inode *inode, struct file *filp) |
35 | { | 36 | { |
37 | cycle_kernel_lock(); | ||
38 | |||
36 | /* enforce read-only access to this chrdev */ | 39 | /* enforce read-only access to this chrdev */ |
37 | if ((filp->f_mode & FMODE_READ) == 0) | 40 | if ((filp->f_mode & FMODE_READ) == 0) |
38 | return -EINVAL; | 41 | return -EINVAL; |
diff --git a/arch/x86/kernel/apm_32.c b/arch/x86/kernel/apm_32.c index 00e6d1370954..75cb5da4ea0a 100644 --- a/arch/x86/kernel/apm_32.c +++ b/arch/x86/kernel/apm_32.c | |||
@@ -204,6 +204,7 @@ | |||
204 | #include <linux/module.h> | 204 | #include <linux/module.h> |
205 | 205 | ||
206 | #include <linux/poll.h> | 206 | #include <linux/poll.h> |
207 | #include <linux/smp_lock.h> | ||
207 | #include <linux/types.h> | 208 | #include <linux/types.h> |
208 | #include <linux/stddef.h> | 209 | #include <linux/stddef.h> |
209 | #include <linux/timer.h> | 210 | #include <linux/timer.h> |
@@ -1549,10 +1550,12 @@ static int do_open(struct inode *inode, struct file *filp) | |||
1549 | { | 1550 | { |
1550 | struct apm_user *as; | 1551 | struct apm_user *as; |
1551 | 1552 | ||
1553 | lock_kernel(); | ||
1552 | as = kmalloc(sizeof(*as), GFP_KERNEL); | 1554 | as = kmalloc(sizeof(*as), GFP_KERNEL); |
1553 | if (as == NULL) { | 1555 | if (as == NULL) { |
1554 | printk(KERN_ERR "apm: cannot allocate struct of size %d bytes\n", | 1556 | printk(KERN_ERR "apm: cannot allocate struct of size %d bytes\n", |
1555 | sizeof(*as)); | 1557 | sizeof(*as)); |
1558 | unlock_kernel(); | ||
1556 | return -ENOMEM; | 1559 | return -ENOMEM; |
1557 | } | 1560 | } |
1558 | as->magic = APM_BIOS_MAGIC; | 1561 | as->magic = APM_BIOS_MAGIC; |
@@ -1574,6 +1577,7 @@ static int do_open(struct inode *inode, struct file *filp) | |||
1574 | user_list = as; | 1577 | user_list = as; |
1575 | spin_unlock(&user_list_lock); | 1578 | spin_unlock(&user_list_lock); |
1576 | filp->private_data = as; | 1579 | filp->private_data = as; |
1580 | unlock_kernel(); | ||
1577 | return 0; | 1581 | return 0; |
1578 | } | 1582 | } |
1579 | 1583 | ||
diff --git a/arch/x86/kernel/cpu/mcheck/mce_64.c b/arch/x86/kernel/cpu/mcheck/mce_64.c index 501ca1cea27d..987410745182 100644 --- a/arch/x86/kernel/cpu/mcheck/mce_64.c +++ b/arch/x86/kernel/cpu/mcheck/mce_64.c | |||
@@ -9,6 +9,7 @@ | |||
9 | #include <linux/types.h> | 9 | #include <linux/types.h> |
10 | #include <linux/kernel.h> | 10 | #include <linux/kernel.h> |
11 | #include <linux/sched.h> | 11 | #include <linux/sched.h> |
12 | #include <linux/smp_lock.h> | ||
12 | #include <linux/string.h> | 13 | #include <linux/string.h> |
13 | #include <linux/rcupdate.h> | 14 | #include <linux/rcupdate.h> |
14 | #include <linux/kallsyms.h> | 15 | #include <linux/kallsyms.h> |
@@ -532,10 +533,12 @@ static int open_exclu; /* already open exclusive? */ | |||
532 | 533 | ||
533 | static int mce_open(struct inode *inode, struct file *file) | 534 | static int mce_open(struct inode *inode, struct file *file) |
534 | { | 535 | { |
536 | lock_kernel(); | ||
535 | spin_lock(&mce_state_lock); | 537 | spin_lock(&mce_state_lock); |
536 | 538 | ||
537 | if (open_exclu || (open_count && (file->f_flags & O_EXCL))) { | 539 | if (open_exclu || (open_count && (file->f_flags & O_EXCL))) { |
538 | spin_unlock(&mce_state_lock); | 540 | spin_unlock(&mce_state_lock); |
541 | unlock_kernel(); | ||
539 | return -EBUSY; | 542 | return -EBUSY; |
540 | } | 543 | } |
541 | 544 | ||
@@ -544,6 +547,7 @@ static int mce_open(struct inode *inode, struct file *file) | |||
544 | open_count++; | 547 | open_count++; |
545 | 548 | ||
546 | spin_unlock(&mce_state_lock); | 549 | spin_unlock(&mce_state_lock); |
550 | unlock_kernel(); | ||
547 | 551 | ||
548 | return nonseekable_open(inode, file); | 552 | return nonseekable_open(inode, file); |
549 | } | 553 | } |
diff --git a/arch/x86/kernel/cpuid.c b/arch/x86/kernel/cpuid.c index daff52a62248..71f1c2654bec 100644 --- a/arch/x86/kernel/cpuid.c +++ b/arch/x86/kernel/cpuid.c | |||
@@ -33,6 +33,7 @@ | |||
33 | #include <linux/init.h> | 33 | #include <linux/init.h> |
34 | #include <linux/poll.h> | 34 | #include <linux/poll.h> |
35 | #include <linux/smp.h> | 35 | #include <linux/smp.h> |
36 | #include <linux/smp_lock.h> | ||
36 | #include <linux/major.h> | 37 | #include <linux/major.h> |
37 | #include <linux/fs.h> | 38 | #include <linux/fs.h> |
38 | #include <linux/smp_lock.h> | 39 | #include <linux/smp_lock.h> |
@@ -107,15 +108,23 @@ static ssize_t cpuid_read(struct file *file, char __user *buf, | |||
107 | 108 | ||
108 | static int cpuid_open(struct inode *inode, struct file *file) | 109 | static int cpuid_open(struct inode *inode, struct file *file) |
109 | { | 110 | { |
110 | unsigned int cpu = iminor(file->f_path.dentry->d_inode); | 111 | unsigned int cpu; |
111 | struct cpuinfo_x86 *c = &cpu_data(cpu); | 112 | struct cpuinfo_x86 *c; |
112 | 113 | int ret = 0; | |
113 | if (cpu >= NR_CPUS || !cpu_online(cpu)) | 114 | |
114 | return -ENXIO; /* No such CPU */ | 115 | lock_kernel(); |
116 | |||
117 | cpu = iminor(file->f_path.dentry->d_inode); | ||
118 | if (cpu >= NR_CPUS || !cpu_online(cpu)) { | ||
119 | ret = -ENXIO; /* No such CPU */ | ||
120 | goto out; | ||
121 | } | ||
122 | c = &cpu_data(cpu); | ||
115 | if (c->cpuid_level < 0) | 123 | if (c->cpuid_level < 0) |
116 | return -EIO; /* CPUID not supported */ | 124 | ret = -EIO; /* CPUID not supported */ |
117 | 125 | out: | |
118 | return 0; | 126 | unlock_kernel(); |
127 | return ret; | ||
119 | } | 128 | } |
120 | 129 | ||
121 | /* | 130 | /* |
diff --git a/arch/x86/kernel/microcode.c b/arch/x86/kernel/microcode.c index 9758fea87c5b..f47ba8156f3e 100644 --- a/arch/x86/kernel/microcode.c +++ b/arch/x86/kernel/microcode.c | |||
@@ -76,6 +76,7 @@ | |||
76 | #include <linux/kernel.h> | 76 | #include <linux/kernel.h> |
77 | #include <linux/init.h> | 77 | #include <linux/init.h> |
78 | #include <linux/sched.h> | 78 | #include <linux/sched.h> |
79 | #include <linux/smp_lock.h> | ||
79 | #include <linux/cpumask.h> | 80 | #include <linux/cpumask.h> |
80 | #include <linux/module.h> | 81 | #include <linux/module.h> |
81 | #include <linux/slab.h> | 82 | #include <linux/slab.h> |
@@ -423,6 +424,7 @@ out: | |||
423 | 424 | ||
424 | static int microcode_open (struct inode *unused1, struct file *unused2) | 425 | static int microcode_open (struct inode *unused1, struct file *unused2) |
425 | { | 426 | { |
427 | cycle_kernel_lock(); | ||
426 | return capable(CAP_SYS_RAWIO) ? 0 : -EPERM; | 428 | return capable(CAP_SYS_RAWIO) ? 0 : -EPERM; |
427 | } | 429 | } |
428 | 430 | ||
diff --git a/arch/x86/kernel/msr.c b/arch/x86/kernel/msr.c index 1f3abe048e93..a153b3905f60 100644 --- a/arch/x86/kernel/msr.c +++ b/arch/x86/kernel/msr.c | |||
@@ -117,12 +117,20 @@ static int msr_open(struct inode *inode, struct file *file) | |||
117 | { | 117 | { |
118 | unsigned int cpu = iminor(file->f_path.dentry->d_inode); | 118 | unsigned int cpu = iminor(file->f_path.dentry->d_inode); |
119 | struct cpuinfo_x86 *c = &cpu_data(cpu); | 119 | struct cpuinfo_x86 *c = &cpu_data(cpu); |
120 | int ret = 0; | ||
120 | 121 | ||
121 | if (cpu >= NR_CPUS || !cpu_online(cpu)) | 122 | lock_kernel(); |
122 | return -ENXIO; /* No such CPU */ | 123 | cpu = iminor(file->f_path.dentry->d_inode); |
123 | if (!cpu_has(c, X86_FEATURE_MSR)) | ||
124 | return -EIO; /* MSR not supported */ | ||
125 | 124 | ||
125 | if (cpu >= NR_CPUS || !cpu_online(cpu)) { | ||
126 | ret = -ENXIO; /* No such CPU */ | ||
127 | goto out; | ||
128 | } | ||
129 | c = &cpu_data(cpu); | ||
130 | if (!cpu_has(c, X86_FEATURE_MSR)) | ||
131 | ret = -EIO; /* MSR not supported */ | ||
132 | out: | ||
133 | unlock_kernel(); | ||
126 | return 0; | 134 | return 0; |
127 | } | 135 | } |
128 | 136 | ||