diff options
Diffstat (limited to 'drivers/block/swim.c')
| -rw-r--r-- | drivers/block/swim.c | 20 |
1 files changed, 18 insertions, 2 deletions
diff --git a/drivers/block/swim.c b/drivers/block/swim.c index e463657569ff..2e46815876df 100644 --- a/drivers/block/swim.c +++ b/drivers/block/swim.c | |||
| @@ -20,6 +20,7 @@ | |||
| 20 | #include <linux/fd.h> | 20 | #include <linux/fd.h> |
| 21 | #include <linux/slab.h> | 21 | #include <linux/slab.h> |
| 22 | #include <linux/blkdev.h> | 22 | #include <linux/blkdev.h> |
| 23 | #include <linux/smp_lock.h> | ||
| 23 | #include <linux/hdreg.h> | 24 | #include <linux/hdreg.h> |
| 24 | #include <linux/kernel.h> | 25 | #include <linux/kernel.h> |
| 25 | #include <linux/delay.h> | 26 | #include <linux/delay.h> |
| @@ -661,11 +662,23 @@ out: | |||
| 661 | return err; | 662 | return err; |
| 662 | } | 663 | } |
| 663 | 664 | ||
| 665 | static int floppy_unlocked_open(struct block_device *bdev, fmode_t mode) | ||
| 666 | { | ||
| 667 | int ret; | ||
| 668 | |||
| 669 | lock_kernel(); | ||
| 670 | ret = floppy_open(bdev, mode); | ||
| 671 | unlock_kernel(); | ||
| 672 | |||
| 673 | return ret; | ||
| 674 | } | ||
| 675 | |||
| 664 | static int floppy_release(struct gendisk *disk, fmode_t mode) | 676 | static int floppy_release(struct gendisk *disk, fmode_t mode) |
| 665 | { | 677 | { |
| 666 | struct floppy_state *fs = disk->private_data; | 678 | struct floppy_state *fs = disk->private_data; |
| 667 | struct swim __iomem *base = fs->swd->base; | 679 | struct swim __iomem *base = fs->swd->base; |
| 668 | 680 | ||
| 681 | lock_kernel(); | ||
| 669 | if (fs->ref_count < 0) | 682 | if (fs->ref_count < 0) |
| 670 | fs->ref_count = 0; | 683 | fs->ref_count = 0; |
| 671 | else if (fs->ref_count > 0) | 684 | else if (fs->ref_count > 0) |
| @@ -673,6 +686,7 @@ static int floppy_release(struct gendisk *disk, fmode_t mode) | |||
| 673 | 686 | ||
| 674 | if (fs->ref_count == 0) | 687 | if (fs->ref_count == 0) |
| 675 | swim_motor(base, OFF); | 688 | swim_motor(base, OFF); |
| 689 | unlock_kernel(); | ||
| 676 | 690 | ||
| 677 | return 0; | 691 | return 0; |
| 678 | } | 692 | } |
| @@ -690,7 +704,9 @@ static int floppy_ioctl(struct block_device *bdev, fmode_t mode, | |||
| 690 | case FDEJECT: | 704 | case FDEJECT: |
| 691 | if (fs->ref_count != 1) | 705 | if (fs->ref_count != 1) |
| 692 | return -EBUSY; | 706 | return -EBUSY; |
| 707 | lock_kernel(); | ||
| 693 | err = floppy_eject(fs); | 708 | err = floppy_eject(fs); |
| 709 | unlock_kernel(); | ||
| 694 | return err; | 710 | return err; |
| 695 | 711 | ||
| 696 | case FDGETPRM: | 712 | case FDGETPRM: |
| @@ -751,9 +767,9 @@ static int floppy_revalidate(struct gendisk *disk) | |||
| 751 | 767 | ||
| 752 | static const struct block_device_operations floppy_fops = { | 768 | static const struct block_device_operations floppy_fops = { |
| 753 | .owner = THIS_MODULE, | 769 | .owner = THIS_MODULE, |
| 754 | .open = floppy_open, | 770 | .open = floppy_unlocked_open, |
| 755 | .release = floppy_release, | 771 | .release = floppy_release, |
| 756 | .locked_ioctl = floppy_ioctl, | 772 | .ioctl = floppy_ioctl, |
| 757 | .getgeo = floppy_getgeo, | 773 | .getgeo = floppy_getgeo, |
| 758 | .media_changed = floppy_check_change, | 774 | .media_changed = floppy_check_change, |
| 759 | .revalidate_disk = floppy_revalidate, | 775 | .revalidate_disk = floppy_revalidate, |
