diff options
Diffstat (limited to 'drivers/block/swim3.c')
-rw-r--r-- | drivers/block/swim3.c | 32 |
1 files changed, 29 insertions, 3 deletions
diff --git a/drivers/block/swim3.c b/drivers/block/swim3.c index ed6fb91123ab..cc6a3864822c 100644 --- a/drivers/block/swim3.c +++ b/drivers/block/swim3.c | |||
@@ -25,6 +25,7 @@ | |||
25 | #include <linux/ioctl.h> | 25 | #include <linux/ioctl.h> |
26 | #include <linux/blkdev.h> | 26 | #include <linux/blkdev.h> |
27 | #include <linux/interrupt.h> | 27 | #include <linux/interrupt.h> |
28 | #include <linux/smp_lock.h> | ||
28 | #include <linux/module.h> | 29 | #include <linux/module.h> |
29 | #include <linux/spinlock.h> | 30 | #include <linux/spinlock.h> |
30 | #include <asm/io.h> | 31 | #include <asm/io.h> |
@@ -839,7 +840,7 @@ static int fd_eject(struct floppy_state *fs) | |||
839 | static struct floppy_struct floppy_type = | 840 | static struct floppy_struct floppy_type = |
840 | { 2880,18,2,80,0,0x1B,0x00,0xCF,0x6C,NULL }; /* 7 1.44MB 3.5" */ | 841 | { 2880,18,2,80,0,0x1B,0x00,0xCF,0x6C,NULL }; /* 7 1.44MB 3.5" */ |
841 | 842 | ||
842 | static int floppy_ioctl(struct block_device *bdev, fmode_t mode, | 843 | static int floppy_locked_ioctl(struct block_device *bdev, fmode_t mode, |
843 | unsigned int cmd, unsigned long param) | 844 | unsigned int cmd, unsigned long param) |
844 | { | 845 | { |
845 | struct floppy_state *fs = bdev->bd_disk->private_data; | 846 | struct floppy_state *fs = bdev->bd_disk->private_data; |
@@ -867,6 +868,18 @@ static int floppy_ioctl(struct block_device *bdev, fmode_t mode, | |||
867 | return -ENOTTY; | 868 | return -ENOTTY; |
868 | } | 869 | } |
869 | 870 | ||
871 | static int floppy_ioctl(struct block_device *bdev, fmode_t mode, | ||
872 | unsigned int cmd, unsigned long param) | ||
873 | { | ||
874 | int ret; | ||
875 | |||
876 | lock_kernel(); | ||
877 | ret = floppy_locked_ioctl(bdev, mode, cmd, param); | ||
878 | unlock_kernel(); | ||
879 | |||
880 | return ret; | ||
881 | } | ||
882 | |||
870 | static int floppy_open(struct block_device *bdev, fmode_t mode) | 883 | static int floppy_open(struct block_device *bdev, fmode_t mode) |
871 | { | 884 | { |
872 | struct floppy_state *fs = bdev->bd_disk->private_data; | 885 | struct floppy_state *fs = bdev->bd_disk->private_data; |
@@ -936,15 +949,28 @@ static int floppy_open(struct block_device *bdev, fmode_t mode) | |||
936 | return 0; | 949 | return 0; |
937 | } | 950 | } |
938 | 951 | ||
952 | static int floppy_unlocked_open(struct block_device *bdev, fmode_t mode) | ||
953 | { | ||
954 | int ret; | ||
955 | |||
956 | lock_kernel(); | ||
957 | ret = floppy_open(bdev, mode); | ||
958 | unlock_kernel(); | ||
959 | |||
960 | return ret; | ||
961 | } | ||
962 | |||
939 | static int floppy_release(struct gendisk *disk, fmode_t mode) | 963 | static int floppy_release(struct gendisk *disk, fmode_t mode) |
940 | { | 964 | { |
941 | struct floppy_state *fs = disk->private_data; | 965 | struct floppy_state *fs = disk->private_data; |
942 | struct swim3 __iomem *sw = fs->swim3; | 966 | struct swim3 __iomem *sw = fs->swim3; |
967 | lock_kernel(); | ||
943 | if (fs->ref_count > 0 && --fs->ref_count == 0) { | 968 | if (fs->ref_count > 0 && --fs->ref_count == 0) { |
944 | swim3_action(fs, MOTOR_OFF); | 969 | swim3_action(fs, MOTOR_OFF); |
945 | out_8(&sw->control_bic, 0xff); | 970 | out_8(&sw->control_bic, 0xff); |
946 | swim3_select(fs, RELAX); | 971 | swim3_select(fs, RELAX); |
947 | } | 972 | } |
973 | unlock_kernel(); | ||
948 | return 0; | 974 | return 0; |
949 | } | 975 | } |
950 | 976 | ||
@@ -995,9 +1021,9 @@ static int floppy_revalidate(struct gendisk *disk) | |||
995 | } | 1021 | } |
996 | 1022 | ||
997 | static const struct block_device_operations floppy_fops = { | 1023 | static const struct block_device_operations floppy_fops = { |
998 | .open = floppy_open, | 1024 | .open = floppy_unlocked_open, |
999 | .release = floppy_release, | 1025 | .release = floppy_release, |
1000 | .locked_ioctl = floppy_ioctl, | 1026 | .ioctl = floppy_ioctl, |
1001 | .media_changed = floppy_check_change, | 1027 | .media_changed = floppy_check_change, |
1002 | .revalidate_disk= floppy_revalidate, | 1028 | .revalidate_disk= floppy_revalidate, |
1003 | }; | 1029 | }; |