diff options
| -rw-r--r-- | drivers/block/paride/pg.c | 22 | ||||
| -rw-r--r-- | drivers/block/paride/pt.c | 8 |
2 files changed, 23 insertions, 7 deletions
diff --git a/drivers/block/paride/pg.c b/drivers/block/paride/pg.c index ab86e23ddc69..9d92636350e5 100644 --- a/drivers/block/paride/pg.c +++ b/drivers/block/paride/pg.c | |||
| @@ -162,6 +162,7 @@ enum {D_PRT, D_PRO, D_UNI, D_MOD, D_SLV, D_DLY}; | |||
| 162 | #include <linux/pg.h> | 162 | #include <linux/pg.h> |
| 163 | #include <linux/device.h> | 163 | #include <linux/device.h> |
| 164 | #include <linux/sched.h> /* current, TASK_* */ | 164 | #include <linux/sched.h> /* current, TASK_* */ |
| 165 | #include <linux/smp_lock.h> | ||
| 165 | #include <linux/jiffies.h> | 166 | #include <linux/jiffies.h> |
| 166 | 167 | ||
| 167 | #include <asm/uaccess.h> | 168 | #include <asm/uaccess.h> |
| @@ -515,12 +516,18 @@ static int pg_open(struct inode *inode, struct file *file) | |||
| 515 | { | 516 | { |
| 516 | int unit = iminor(inode) & 0x7f; | 517 | int unit = iminor(inode) & 0x7f; |
| 517 | struct pg *dev = &devices[unit]; | 518 | struct pg *dev = &devices[unit]; |
| 519 | int ret = 0; | ||
| 518 | 520 | ||
| 519 | if ((unit >= PG_UNITS) || (!dev->present)) | 521 | lock_kernel(); |
| 520 | return -ENODEV; | 522 | if ((unit >= PG_UNITS) || (!dev->present)) { |
| 523 | ret = -ENODEV; | ||
| 524 | goto out; | ||
| 525 | } | ||
| 521 | 526 | ||
| 522 | if (test_and_set_bit(0, &dev->access)) | 527 | if (test_and_set_bit(0, &dev->access)) { |
| 523 | return -EBUSY; | 528 | ret = -EBUSY; |
| 529 | goto out; | ||
| 530 | } | ||
| 524 | 531 | ||
| 525 | if (dev->busy) { | 532 | if (dev->busy) { |
| 526 | pg_reset(dev); | 533 | pg_reset(dev); |
| @@ -533,12 +540,15 @@ static int pg_open(struct inode *inode, struct file *file) | |||
| 533 | if (dev->bufptr == NULL) { | 540 | if (dev->bufptr == NULL) { |
| 534 | clear_bit(0, &dev->access); | 541 | clear_bit(0, &dev->access); |
| 535 | printk("%s: buffer allocation failed\n", dev->name); | 542 | printk("%s: buffer allocation failed\n", dev->name); |
| 536 | return -ENOMEM; | 543 | ret = -ENOMEM; |
| 544 | goto out; | ||
| 537 | } | 545 | } |
| 538 | 546 | ||
| 539 | file->private_data = dev; | 547 | file->private_data = dev; |
| 540 | 548 | ||
| 541 | return 0; | 549 | out: |
| 550 | unlock_kernel(); | ||
| 551 | return ret; | ||
| 542 | } | 552 | } |
| 543 | 553 | ||
| 544 | static int pg_release(struct inode *inode, struct file *file) | 554 | static int pg_release(struct inode *inode, struct file *file) |
diff --git a/drivers/block/paride/pt.c b/drivers/block/paride/pt.c index 8b9549ab4a4e..314333db16ee 100644 --- a/drivers/block/paride/pt.c +++ b/drivers/block/paride/pt.c | |||
| @@ -146,6 +146,7 @@ static int (*drives[4])[6] = {&drive0, &drive1, &drive2, &drive3}; | |||
| 146 | #include <linux/mtio.h> | 146 | #include <linux/mtio.h> |
| 147 | #include <linux/device.h> | 147 | #include <linux/device.h> |
| 148 | #include <linux/sched.h> /* current, TASK_*, schedule_timeout() */ | 148 | #include <linux/sched.h> /* current, TASK_*, schedule_timeout() */ |
| 149 | #include <linux/smp_lock.h> | ||
| 149 | 150 | ||
| 150 | #include <asm/uaccess.h> | 151 | #include <asm/uaccess.h> |
| 151 | 152 | ||
| @@ -650,8 +651,11 @@ static int pt_open(struct inode *inode, struct file *file) | |||
| 650 | struct pt_unit *tape = pt + unit; | 651 | struct pt_unit *tape = pt + unit; |
| 651 | int err; | 652 | int err; |
| 652 | 653 | ||
| 653 | if (unit >= PT_UNITS || (!tape->present)) | 654 | lock_kernel(); |
| 655 | if (unit >= PT_UNITS || (!tape->present)) { | ||
| 656 | unlock_kernel(); | ||
| 654 | return -ENODEV; | 657 | return -ENODEV; |
| 658 | } | ||
| 655 | 659 | ||
| 656 | err = -EBUSY; | 660 | err = -EBUSY; |
| 657 | if (!atomic_dec_and_test(&tape->available)) | 661 | if (!atomic_dec_and_test(&tape->available)) |
| @@ -678,10 +682,12 @@ static int pt_open(struct inode *inode, struct file *file) | |||
| 678 | } | 682 | } |
| 679 | 683 | ||
| 680 | file->private_data = tape; | 684 | file->private_data = tape; |
| 685 | unlock_kernel(); | ||
| 681 | return 0; | 686 | return 0; |
| 682 | 687 | ||
| 683 | out: | 688 | out: |
| 684 | atomic_inc(&tape->available); | 689 | atomic_inc(&tape->available); |
| 690 | unlock_kernel(); | ||
| 685 | return err; | 691 | return err; |
| 686 | } | 692 | } |
| 687 | 693 | ||
