diff options
Diffstat (limited to 'drivers/scsi')
-rw-r--r-- | drivers/scsi/sd.c | 17 | ||||
-rw-r--r-- | drivers/scsi/sr.c | 18 |
2 files changed, 25 insertions, 10 deletions
diff --git a/drivers/scsi/sd.c b/drivers/scsi/sd.c index 1d0c4b7c3b69..633ac32b25c1 100644 --- a/drivers/scsi/sd.c +++ b/drivers/scsi/sd.c | |||
@@ -46,6 +46,7 @@ | |||
46 | #include <linux/blkdev.h> | 46 | #include <linux/blkdev.h> |
47 | #include <linux/blkpg.h> | 47 | #include <linux/blkpg.h> |
48 | #include <linux/delay.h> | 48 | #include <linux/delay.h> |
49 | #include <linux/smp_lock.h> | ||
49 | #include <linux/mutex.h> | 50 | #include <linux/mutex.h> |
50 | #include <linux/string_helpers.h> | 51 | #include <linux/string_helpers.h> |
51 | #include <linux/async.h> | 52 | #include <linux/async.h> |
@@ -924,6 +925,7 @@ static int sd_ioctl(struct block_device *bdev, fmode_t mode, | |||
924 | SCSI_LOG_IOCTL(1, printk("sd_ioctl: disk=%s, cmd=0x%x\n", | 925 | SCSI_LOG_IOCTL(1, printk("sd_ioctl: disk=%s, cmd=0x%x\n", |
925 | disk->disk_name, cmd)); | 926 | disk->disk_name, cmd)); |
926 | 927 | ||
928 | lock_kernel(); | ||
927 | /* | 929 | /* |
928 | * If we are in the middle of error recovery, don't let anyone | 930 | * If we are in the middle of error recovery, don't let anyone |
929 | * else try and use this device. Also, if error recovery fails, it | 931 | * else try and use this device. Also, if error recovery fails, it |
@@ -933,7 +935,7 @@ static int sd_ioctl(struct block_device *bdev, fmode_t mode, | |||
933 | error = scsi_nonblockable_ioctl(sdp, cmd, p, | 935 | error = scsi_nonblockable_ioctl(sdp, cmd, p, |
934 | (mode & FMODE_NDELAY) != 0); | 936 | (mode & FMODE_NDELAY) != 0); |
935 | if (!scsi_block_when_processing_errors(sdp) || !error) | 937 | if (!scsi_block_when_processing_errors(sdp) || !error) |
936 | return error; | 938 | goto out; |
937 | 939 | ||
938 | /* | 940 | /* |
939 | * Send SCSI addressing ioctls directly to mid level, send other | 941 | * Send SCSI addressing ioctls directly to mid level, send other |
@@ -943,13 +945,18 @@ static int sd_ioctl(struct block_device *bdev, fmode_t mode, | |||
943 | switch (cmd) { | 945 | switch (cmd) { |
944 | case SCSI_IOCTL_GET_IDLUN: | 946 | case SCSI_IOCTL_GET_IDLUN: |
945 | case SCSI_IOCTL_GET_BUS_NUMBER: | 947 | case SCSI_IOCTL_GET_BUS_NUMBER: |
946 | return scsi_ioctl(sdp, cmd, p); | 948 | error = scsi_ioctl(sdp, cmd, p); |
949 | break; | ||
947 | default: | 950 | default: |
948 | error = scsi_cmd_ioctl(disk->queue, disk, mode, cmd, p); | 951 | error = scsi_cmd_ioctl(disk->queue, disk, mode, cmd, p); |
949 | if (error != -ENOTTY) | 952 | if (error != -ENOTTY) |
950 | return error; | 953 | break; |
954 | error = scsi_ioctl(sdp, cmd, p); | ||
955 | break; | ||
951 | } | 956 | } |
952 | return scsi_ioctl(sdp, cmd, p); | 957 | out: |
958 | unlock_kernel(); | ||
959 | return error; | ||
953 | } | 960 | } |
954 | 961 | ||
955 | static void set_media_not_present(struct scsi_disk *sdkp) | 962 | static void set_media_not_present(struct scsi_disk *sdkp) |
@@ -1123,7 +1130,7 @@ static const struct block_device_operations sd_fops = { | |||
1123 | .owner = THIS_MODULE, | 1130 | .owner = THIS_MODULE, |
1124 | .open = sd_open, | 1131 | .open = sd_open, |
1125 | .release = sd_release, | 1132 | .release = sd_release, |
1126 | .locked_ioctl = sd_ioctl, | 1133 | .ioctl = sd_ioctl, |
1127 | .getgeo = sd_getgeo, | 1134 | .getgeo = sd_getgeo, |
1128 | #ifdef CONFIG_COMPAT | 1135 | #ifdef CONFIG_COMPAT |
1129 | .compat_ioctl = sd_compat_ioctl, | 1136 | .compat_ioctl = sd_compat_ioctl, |
diff --git a/drivers/scsi/sr.c b/drivers/scsi/sr.c index 0a90abc7f140..d42fa6468f41 100644 --- a/drivers/scsi/sr.c +++ b/drivers/scsi/sr.c | |||
@@ -44,6 +44,7 @@ | |||
44 | #include <linux/init.h> | 44 | #include <linux/init.h> |
45 | #include <linux/blkdev.h> | 45 | #include <linux/blkdev.h> |
46 | #include <linux/mutex.h> | 46 | #include <linux/mutex.h> |
47 | #include <linux/smp_lock.h> | ||
47 | #include <linux/slab.h> | 48 | #include <linux/slab.h> |
48 | #include <asm/uaccess.h> | 49 | #include <asm/uaccess.h> |
49 | 50 | ||
@@ -493,6 +494,8 @@ static int sr_block_ioctl(struct block_device *bdev, fmode_t mode, unsigned cmd, | |||
493 | void __user *argp = (void __user *)arg; | 494 | void __user *argp = (void __user *)arg; |
494 | int ret; | 495 | int ret; |
495 | 496 | ||
497 | lock_kernel(); | ||
498 | |||
496 | /* | 499 | /* |
497 | * Send SCSI addressing ioctls directly to mid level, send other | 500 | * Send SCSI addressing ioctls directly to mid level, send other |
498 | * ioctls to cdrom/block level. | 501 | * ioctls to cdrom/block level. |
@@ -500,12 +503,13 @@ static int sr_block_ioctl(struct block_device *bdev, fmode_t mode, unsigned cmd, | |||
500 | switch (cmd) { | 503 | switch (cmd) { |
501 | case SCSI_IOCTL_GET_IDLUN: | 504 | case SCSI_IOCTL_GET_IDLUN: |
502 | case SCSI_IOCTL_GET_BUS_NUMBER: | 505 | case SCSI_IOCTL_GET_BUS_NUMBER: |
503 | return scsi_ioctl(sdev, cmd, argp); | 506 | ret = scsi_ioctl(sdev, cmd, argp); |
507 | goto out; | ||
504 | } | 508 | } |
505 | 509 | ||
506 | ret = cdrom_ioctl(&cd->cdi, bdev, mode, cmd, arg); | 510 | ret = cdrom_ioctl(&cd->cdi, bdev, mode, cmd, arg); |
507 | if (ret != -ENOSYS) | 511 | if (ret != -ENOSYS) |
508 | return ret; | 512 | goto out; |
509 | 513 | ||
510 | /* | 514 | /* |
511 | * ENODEV means that we didn't recognise the ioctl, or that we | 515 | * ENODEV means that we didn't recognise the ioctl, or that we |
@@ -516,8 +520,12 @@ static int sr_block_ioctl(struct block_device *bdev, fmode_t mode, unsigned cmd, | |||
516 | ret = scsi_nonblockable_ioctl(sdev, cmd, argp, | 520 | ret = scsi_nonblockable_ioctl(sdev, cmd, argp, |
517 | (mode & FMODE_NDELAY) != 0); | 521 | (mode & FMODE_NDELAY) != 0); |
518 | if (ret != -ENODEV) | 522 | if (ret != -ENODEV) |
519 | return ret; | 523 | goto out; |
520 | return scsi_ioctl(sdev, cmd, argp); | 524 | ret = scsi_ioctl(sdev, cmd, argp); |
525 | |||
526 | out: | ||
527 | unlock_kernel(); | ||
528 | return ret; | ||
521 | } | 529 | } |
522 | 530 | ||
523 | static int sr_block_media_changed(struct gendisk *disk) | 531 | static int sr_block_media_changed(struct gendisk *disk) |
@@ -531,7 +539,7 @@ static const struct block_device_operations sr_bdops = | |||
531 | .owner = THIS_MODULE, | 539 | .owner = THIS_MODULE, |
532 | .open = sr_block_open, | 540 | .open = sr_block_open, |
533 | .release = sr_block_release, | 541 | .release = sr_block_release, |
534 | .locked_ioctl = sr_block_ioctl, | 542 | .ioctl = sr_block_ioctl, |
535 | .media_changed = sr_block_media_changed, | 543 | .media_changed = sr_block_media_changed, |
536 | /* | 544 | /* |
537 | * No compat_ioctl for now because sr_block_ioctl never | 545 | * No compat_ioctl for now because sr_block_ioctl never |