diff options
30 files changed, 253 insertions, 85 deletions
diff --git a/block/ioctl.c b/block/ioctl.c index e8eb679f2f9b..1cfa8d449d90 100644 --- a/block/ioctl.c +++ b/block/ioctl.c | |||
@@ -163,18 +163,10 @@ int __blkdev_driver_ioctl(struct block_device *bdev, fmode_t mode, | |||
163 | unsigned cmd, unsigned long arg) | 163 | unsigned cmd, unsigned long arg) |
164 | { | 164 | { |
165 | struct gendisk *disk = bdev->bd_disk; | 165 | struct gendisk *disk = bdev->bd_disk; |
166 | int ret; | ||
167 | 166 | ||
168 | if (disk->fops->ioctl) | 167 | if (disk->fops->ioctl) |
169 | return disk->fops->ioctl(bdev, mode, cmd, arg); | 168 | return disk->fops->ioctl(bdev, mode, cmd, arg); |
170 | 169 | ||
171 | if (disk->fops->locked_ioctl) { | ||
172 | lock_kernel(); | ||
173 | ret = disk->fops->locked_ioctl(bdev, mode, cmd, arg); | ||
174 | unlock_kernel(); | ||
175 | return ret; | ||
176 | } | ||
177 | |||
178 | return -ENOTTY; | 170 | return -ENOTTY; |
179 | } | 171 | } |
180 | /* | 172 | /* |
@@ -185,8 +177,7 @@ int __blkdev_driver_ioctl(struct block_device *bdev, fmode_t mode, | |||
185 | EXPORT_SYMBOL_GPL(__blkdev_driver_ioctl); | 177 | EXPORT_SYMBOL_GPL(__blkdev_driver_ioctl); |
186 | 178 | ||
187 | /* | 179 | /* |
188 | * always keep this in sync with compat_blkdev_ioctl() and | 180 | * always keep this in sync with compat_blkdev_ioctl() |
189 | * compat_blkdev_locked_ioctl() | ||
190 | */ | 181 | */ |
191 | int blkdev_ioctl(struct block_device *bdev, fmode_t mode, unsigned cmd, | 182 | int blkdev_ioctl(struct block_device *bdev, fmode_t mode, unsigned cmd, |
192 | unsigned long arg) | 183 | unsigned long arg) |
diff --git a/drivers/block/amiflop.c b/drivers/block/amiflop.c index 832798aa14f6..0fa26359304c 100644 --- a/drivers/block/amiflop.c +++ b/drivers/block/amiflop.c | |||
@@ -60,6 +60,7 @@ | |||
60 | #include <linux/hdreg.h> | 60 | #include <linux/hdreg.h> |
61 | #include <linux/delay.h> | 61 | #include <linux/delay.h> |
62 | #include <linux/init.h> | 62 | #include <linux/init.h> |
63 | #include <linux/smp_lock.h> | ||
63 | #include <linux/amifdreg.h> | 64 | #include <linux/amifdreg.h> |
64 | #include <linux/amifd.h> | 65 | #include <linux/amifd.h> |
65 | #include <linux/buffer_head.h> | 66 | #include <linux/buffer_head.h> |
@@ -1423,7 +1424,7 @@ static int fd_getgeo(struct block_device *bdev, struct hd_geometry *geo) | |||
1423 | return 0; | 1424 | return 0; |
1424 | } | 1425 | } |
1425 | 1426 | ||
1426 | static int fd_ioctl(struct block_device *bdev, fmode_t mode, | 1427 | static int fd_locked_ioctl(struct block_device *bdev, fmode_t mode, |
1427 | unsigned int cmd, unsigned long param) | 1428 | unsigned int cmd, unsigned long param) |
1428 | { | 1429 | { |
1429 | struct amiga_floppy_struct *p = bdev->bd_disk->private_data; | 1430 | struct amiga_floppy_struct *p = bdev->bd_disk->private_data; |
@@ -1500,6 +1501,18 @@ static int fd_ioctl(struct block_device *bdev, fmode_t mode, | |||
1500 | return 0; | 1501 | return 0; |
1501 | } | 1502 | } |
1502 | 1503 | ||
1504 | static int fd_ioctl(struct block_device *bdev, fmode_t mode, | ||
1505 | unsigned int cmd, unsigned long param) | ||
1506 | { | ||
1507 | int ret; | ||
1508 | |||
1509 | lock_kernel(); | ||
1510 | ret = fd_locked_ioctl(bdev, mode, cmd, param); | ||
1511 | unlock_kernel(); | ||
1512 | |||
1513 | return ret; | ||
1514 | } | ||
1515 | |||
1503 | static void fd_probe(int dev) | 1516 | static void fd_probe(int dev) |
1504 | { | 1517 | { |
1505 | unsigned long code; | 1518 | unsigned long code; |
@@ -1638,7 +1651,7 @@ static const struct block_device_operations floppy_fops = { | |||
1638 | .owner = THIS_MODULE, | 1651 | .owner = THIS_MODULE, |
1639 | .open = floppy_open, | 1652 | .open = floppy_open, |
1640 | .release = floppy_release, | 1653 | .release = floppy_release, |
1641 | .locked_ioctl = fd_ioctl, | 1654 | .ioctl = fd_ioctl, |
1642 | .getgeo = fd_getgeo, | 1655 | .getgeo = fd_getgeo, |
1643 | .media_changed = amiga_floppy_change, | 1656 | .media_changed = amiga_floppy_change, |
1644 | }; | 1657 | }; |
diff --git a/drivers/block/ataflop.c b/drivers/block/ataflop.c index e35cf59cbfde..1bb8bfcfdbd9 100644 --- a/drivers/block/ataflop.c +++ b/drivers/block/ataflop.c | |||
@@ -67,6 +67,7 @@ | |||
67 | #include <linux/delay.h> | 67 | #include <linux/delay.h> |
68 | #include <linux/init.h> | 68 | #include <linux/init.h> |
69 | #include <linux/blkdev.h> | 69 | #include <linux/blkdev.h> |
70 | #include <linux/smp_lock.h> | ||
70 | 71 | ||
71 | #include <asm/atafd.h> | 72 | #include <asm/atafd.h> |
72 | #include <asm/atafdreg.h> | 73 | #include <asm/atafdreg.h> |
@@ -359,7 +360,7 @@ static void finish_fdc( void ); | |||
359 | static void finish_fdc_done( int dummy ); | 360 | static void finish_fdc_done( int dummy ); |
360 | static void setup_req_params( int drive ); | 361 | static void setup_req_params( int drive ); |
361 | static void redo_fd_request( void); | 362 | static void redo_fd_request( void); |
362 | static int fd_ioctl(struct block_device *bdev, fmode_t mode, unsigned int | 363 | static int fd_locked_ioctl(struct block_device *bdev, fmode_t mode, unsigned int |
363 | cmd, unsigned long param); | 364 | cmd, unsigned long param); |
364 | static void fd_probe( int drive ); | 365 | static void fd_probe( int drive ); |
365 | static int fd_test_drive_present( int drive ); | 366 | static int fd_test_drive_present( int drive ); |
@@ -1480,7 +1481,7 @@ void do_fd_request(struct request_queue * q) | |||
1480 | atari_enable_irq( IRQ_MFP_FDC ); | 1481 | atari_enable_irq( IRQ_MFP_FDC ); |
1481 | } | 1482 | } |
1482 | 1483 | ||
1483 | static int fd_ioctl(struct block_device *bdev, fmode_t mode, | 1484 | static int fd_locked_ioctl(struct block_device *bdev, fmode_t mode, |
1484 | unsigned int cmd, unsigned long param) | 1485 | unsigned int cmd, unsigned long param) |
1485 | { | 1486 | { |
1486 | struct gendisk *disk = bdev->bd_disk; | 1487 | struct gendisk *disk = bdev->bd_disk; |
@@ -1665,6 +1666,17 @@ static int fd_ioctl(struct block_device *bdev, fmode_t mode, | |||
1665 | } | 1666 | } |
1666 | } | 1667 | } |
1667 | 1668 | ||
1669 | static int fd_ioctl(struct block_device *bdev, fmode_t mode, | ||
1670 | unsigned int cmd, unsigned long arg) | ||
1671 | { | ||
1672 | int ret; | ||
1673 | |||
1674 | lock_kernel(); | ||
1675 | ret = fd_locked_ioctl(bdev, mode, cmd, arg); | ||
1676 | unlock_kernel(); | ||
1677 | |||
1678 | return ret; | ||
1679 | } | ||
1668 | 1680 | ||
1669 | /* Initialize the 'unit' variable for drive 'drive' */ | 1681 | /* Initialize the 'unit' variable for drive 'drive' */ |
1670 | 1682 | ||
@@ -1855,7 +1867,7 @@ static const struct block_device_operations floppy_fops = { | |||
1855 | .owner = THIS_MODULE, | 1867 | .owner = THIS_MODULE, |
1856 | .open = floppy_open, | 1868 | .open = floppy_open, |
1857 | .release = floppy_release, | 1869 | .release = floppy_release, |
1858 | .locked_ioctl = fd_ioctl, | 1870 | .ioctl = fd_ioctl, |
1859 | .media_changed = check_floppy_change, | 1871 | .media_changed = check_floppy_change, |
1860 | .revalidate_disk= floppy_revalidate, | 1872 | .revalidate_disk= floppy_revalidate, |
1861 | }; | 1873 | }; |
diff --git a/drivers/block/brd.c b/drivers/block/brd.c index 1d2c18620f9a..1c7f63792ff8 100644 --- a/drivers/block/brd.c +++ b/drivers/block/brd.c | |||
@@ -15,6 +15,7 @@ | |||
15 | #include <linux/blkdev.h> | 15 | #include <linux/blkdev.h> |
16 | #include <linux/bio.h> | 16 | #include <linux/bio.h> |
17 | #include <linux/highmem.h> | 17 | #include <linux/highmem.h> |
18 | #include <linux/smp_lock.h> | ||
18 | #include <linux/radix-tree.h> | 19 | #include <linux/radix-tree.h> |
19 | #include <linux/buffer_head.h> /* invalidate_bh_lrus() */ | 20 | #include <linux/buffer_head.h> /* invalidate_bh_lrus() */ |
20 | #include <linux/slab.h> | 21 | #include <linux/slab.h> |
@@ -401,6 +402,7 @@ static int brd_ioctl(struct block_device *bdev, fmode_t mode, | |||
401 | * ram device BLKFLSBUF has special semantics, we want to actually | 402 | * ram device BLKFLSBUF has special semantics, we want to actually |
402 | * release and destroy the ramdisk data. | 403 | * release and destroy the ramdisk data. |
403 | */ | 404 | */ |
405 | lock_kernel(); | ||
404 | mutex_lock(&bdev->bd_mutex); | 406 | mutex_lock(&bdev->bd_mutex); |
405 | error = -EBUSY; | 407 | error = -EBUSY; |
406 | if (bdev->bd_openers <= 1) { | 408 | if (bdev->bd_openers <= 1) { |
@@ -417,13 +419,14 @@ static int brd_ioctl(struct block_device *bdev, fmode_t mode, | |||
417 | error = 0; | 419 | error = 0; |
418 | } | 420 | } |
419 | mutex_unlock(&bdev->bd_mutex); | 421 | mutex_unlock(&bdev->bd_mutex); |
422 | unlock_kernel(); | ||
420 | 423 | ||
421 | return error; | 424 | return error; |
422 | } | 425 | } |
423 | 426 | ||
424 | static const struct block_device_operations brd_fops = { | 427 | static const struct block_device_operations brd_fops = { |
425 | .owner = THIS_MODULE, | 428 | .owner = THIS_MODULE, |
426 | .locked_ioctl = brd_ioctl, | 429 | .ioctl = brd_ioctl, |
427 | #ifdef CONFIG_BLK_DEV_XIP | 430 | #ifdef CONFIG_BLK_DEV_XIP |
428 | .direct_access = brd_direct_access, | 431 | .direct_access = brd_direct_access, |
429 | #endif | 432 | #endif |
diff --git a/drivers/block/cciss.c b/drivers/block/cciss.c index 11b377762b8e..a6c0494dd054 100644 --- a/drivers/block/cciss.c +++ b/drivers/block/cciss.c | |||
@@ -179,6 +179,8 @@ static irqreturn_t do_cciss_intx(int irq, void *dev_id); | |||
179 | static irqreturn_t do_cciss_msix_intr(int irq, void *dev_id); | 179 | static irqreturn_t do_cciss_msix_intr(int irq, void *dev_id); |
180 | static int cciss_open(struct block_device *bdev, fmode_t mode); | 180 | static int cciss_open(struct block_device *bdev, fmode_t mode); |
181 | static int cciss_release(struct gendisk *disk, fmode_t mode); | 181 | static int cciss_release(struct gendisk *disk, fmode_t mode); |
182 | static int do_ioctl(struct block_device *bdev, fmode_t mode, | ||
183 | unsigned int cmd, unsigned long arg); | ||
182 | static int cciss_ioctl(struct block_device *bdev, fmode_t mode, | 184 | static int cciss_ioctl(struct block_device *bdev, fmode_t mode, |
183 | unsigned int cmd, unsigned long arg); | 185 | unsigned int cmd, unsigned long arg); |
184 | static int cciss_getgeo(struct block_device *bdev, struct hd_geometry *geo); | 186 | static int cciss_getgeo(struct block_device *bdev, struct hd_geometry *geo); |
@@ -237,7 +239,7 @@ static const struct block_device_operations cciss_fops = { | |||
237 | .owner = THIS_MODULE, | 239 | .owner = THIS_MODULE, |
238 | .open = cciss_open, | 240 | .open = cciss_open, |
239 | .release = cciss_release, | 241 | .release = cciss_release, |
240 | .locked_ioctl = cciss_ioctl, | 242 | .ioctl = do_ioctl, |
241 | .getgeo = cciss_getgeo, | 243 | .getgeo = cciss_getgeo, |
242 | #ifdef CONFIG_COMPAT | 244 | #ifdef CONFIG_COMPAT |
243 | .compat_ioctl = cciss_compat_ioctl, | 245 | .compat_ioctl = cciss_compat_ioctl, |
@@ -1057,8 +1059,6 @@ static int cciss_release(struct gendisk *disk, fmode_t mode) | |||
1057 | return 0; | 1059 | return 0; |
1058 | } | 1060 | } |
1059 | 1061 | ||
1060 | #ifdef CONFIG_COMPAT | ||
1061 | |||
1062 | static int do_ioctl(struct block_device *bdev, fmode_t mode, | 1062 | static int do_ioctl(struct block_device *bdev, fmode_t mode, |
1063 | unsigned cmd, unsigned long arg) | 1063 | unsigned cmd, unsigned long arg) |
1064 | { | 1064 | { |
@@ -1069,6 +1069,8 @@ static int do_ioctl(struct block_device *bdev, fmode_t mode, | |||
1069 | return ret; | 1069 | return ret; |
1070 | } | 1070 | } |
1071 | 1071 | ||
1072 | #ifdef CONFIG_COMPAT | ||
1073 | |||
1072 | static int cciss_ioctl32_passthru(struct block_device *bdev, fmode_t mode, | 1074 | static int cciss_ioctl32_passthru(struct block_device *bdev, fmode_t mode, |
1073 | unsigned cmd, unsigned long arg); | 1075 | unsigned cmd, unsigned long arg); |
1074 | static int cciss_ioctl32_big_passthru(struct block_device *bdev, fmode_t mode, | 1076 | static int cciss_ioctl32_big_passthru(struct block_device *bdev, fmode_t mode, |
diff --git a/drivers/block/cpqarray.c b/drivers/block/cpqarray.c index abb4ec6690fc..c459aeea3c0c 100644 --- a/drivers/block/cpqarray.c +++ b/drivers/block/cpqarray.c | |||
@@ -35,6 +35,7 @@ | |||
35 | #include <linux/seq_file.h> | 35 | #include <linux/seq_file.h> |
36 | #include <linux/init.h> | 36 | #include <linux/init.h> |
37 | #include <linux/hdreg.h> | 37 | #include <linux/hdreg.h> |
38 | #include <linux/smp_lock.h> | ||
38 | #include <linux/spinlock.h> | 39 | #include <linux/spinlock.h> |
39 | #include <linux/blkdev.h> | 40 | #include <linux/blkdev.h> |
40 | #include <linux/genhd.h> | 41 | #include <linux/genhd.h> |
@@ -197,7 +198,7 @@ static const struct block_device_operations ida_fops = { | |||
197 | .owner = THIS_MODULE, | 198 | .owner = THIS_MODULE, |
198 | .open = ida_open, | 199 | .open = ida_open, |
199 | .release = ida_release, | 200 | .release = ida_release, |
200 | .locked_ioctl = ida_ioctl, | 201 | .ioctl = ida_ioctl, |
201 | .getgeo = ida_getgeo, | 202 | .getgeo = ida_getgeo, |
202 | .revalidate_disk= ida_revalidate, | 203 | .revalidate_disk= ida_revalidate, |
203 | }; | 204 | }; |
@@ -1128,7 +1129,7 @@ static int ida_getgeo(struct block_device *bdev, struct hd_geometry *geo) | |||
1128 | * ida_ioctl does some miscellaneous stuff like reporting drive geometry, | 1129 | * ida_ioctl does some miscellaneous stuff like reporting drive geometry, |
1129 | * setting readahead and submitting commands from userspace to the controller. | 1130 | * setting readahead and submitting commands from userspace to the controller. |
1130 | */ | 1131 | */ |
1131 | static int ida_ioctl(struct block_device *bdev, fmode_t mode, unsigned int cmd, unsigned long arg) | 1132 | static int ida_locked_ioctl(struct block_device *bdev, fmode_t mode, unsigned int cmd, unsigned long arg) |
1132 | { | 1133 | { |
1133 | drv_info_t *drv = get_drv(bdev->bd_disk); | 1134 | drv_info_t *drv = get_drv(bdev->bd_disk); |
1134 | ctlr_info_t *host = get_host(bdev->bd_disk); | 1135 | ctlr_info_t *host = get_host(bdev->bd_disk); |
@@ -1192,6 +1193,19 @@ out_passthru: | |||
1192 | } | 1193 | } |
1193 | 1194 | ||
1194 | } | 1195 | } |
1196 | |||
1197 | static int ida_ioctl(struct block_device *bdev, fmode_t mode, | ||
1198 | unsigned int cmd, unsigned long param) | ||
1199 | { | ||
1200 | int ret; | ||
1201 | |||
1202 | lock_kernel(); | ||
1203 | ret = ida_locked_ioctl(bdev, mode, cmd, param); | ||
1204 | unlock_kernel(); | ||
1205 | |||
1206 | return ret; | ||
1207 | } | ||
1208 | |||
1195 | /* | 1209 | /* |
1196 | * ida_ctlr_ioctl is for passing commands to the controller from userspace. | 1210 | * ida_ctlr_ioctl is for passing commands to the controller from userspace. |
1197 | * The command block (io) has already been copied to kernel space for us, | 1211 | * The command block (io) has already been copied to kernel space for us, |
diff --git a/drivers/block/floppy.c b/drivers/block/floppy.c index 82c30f9f81ca..40419b066aa9 100644 --- a/drivers/block/floppy.c +++ b/drivers/block/floppy.c | |||
@@ -178,6 +178,7 @@ static int print_unex = 1; | |||
178 | #include <linux/slab.h> | 178 | #include <linux/slab.h> |
179 | #include <linux/mm.h> | 179 | #include <linux/mm.h> |
180 | #include <linux/bio.h> | 180 | #include <linux/bio.h> |
181 | #include <linux/smp_lock.h> | ||
181 | #include <linux/string.h> | 182 | #include <linux/string.h> |
182 | #include <linux/jiffies.h> | 183 | #include <linux/jiffies.h> |
183 | #include <linux/fcntl.h> | 184 | #include <linux/fcntl.h> |
@@ -3371,7 +3372,7 @@ static int fd_getgeo(struct block_device *bdev, struct hd_geometry *geo) | |||
3371 | return 0; | 3372 | return 0; |
3372 | } | 3373 | } |
3373 | 3374 | ||
3374 | static int fd_ioctl(struct block_device *bdev, fmode_t mode, unsigned int cmd, | 3375 | static int fd_locked_ioctl(struct block_device *bdev, fmode_t mode, unsigned int cmd, |
3375 | unsigned long param) | 3376 | unsigned long param) |
3376 | { | 3377 | { |
3377 | int drive = (long)bdev->bd_disk->private_data; | 3378 | int drive = (long)bdev->bd_disk->private_data; |
@@ -3547,6 +3548,18 @@ static int fd_ioctl(struct block_device *bdev, fmode_t mode, unsigned int cmd, | |||
3547 | return 0; | 3548 | return 0; |
3548 | } | 3549 | } |
3549 | 3550 | ||
3551 | static int fd_ioctl(struct block_device *bdev, fmode_t mode, | ||
3552 | unsigned int cmd, unsigned long param) | ||
3553 | { | ||
3554 | int ret; | ||
3555 | |||
3556 | lock_kernel(); | ||
3557 | ret = fd_locked_ioctl(bdev, mode, cmd, param); | ||
3558 | unlock_kernel(); | ||
3559 | |||
3560 | return ret; | ||
3561 | } | ||
3562 | |||
3550 | static void __init config_types(void) | 3563 | static void __init config_types(void) |
3551 | { | 3564 | { |
3552 | bool has_drive = false; | 3565 | bool has_drive = false; |
@@ -3848,7 +3861,7 @@ static const struct block_device_operations floppy_fops = { | |||
3848 | .owner = THIS_MODULE, | 3861 | .owner = THIS_MODULE, |
3849 | .open = floppy_open, | 3862 | .open = floppy_open, |
3850 | .release = floppy_release, | 3863 | .release = floppy_release, |
3851 | .locked_ioctl = fd_ioctl, | 3864 | .ioctl = fd_ioctl, |
3852 | .getgeo = fd_getgeo, | 3865 | .getgeo = fd_getgeo, |
3853 | .media_changed = check_floppy_change, | 3866 | .media_changed = check_floppy_change, |
3854 | .revalidate_disk = floppy_revalidate, | 3867 | .revalidate_disk = floppy_revalidate, |
diff --git a/drivers/block/nbd.c b/drivers/block/nbd.c index 2e74e7d475ca..6751789fb379 100644 --- a/drivers/block/nbd.c +++ b/drivers/block/nbd.c | |||
@@ -24,6 +24,7 @@ | |||
24 | #include <linux/errno.h> | 24 | #include <linux/errno.h> |
25 | #include <linux/file.h> | 25 | #include <linux/file.h> |
26 | #include <linux/ioctl.h> | 26 | #include <linux/ioctl.h> |
27 | #include <linux/smp_lock.h> | ||
27 | #include <linux/compiler.h> | 28 | #include <linux/compiler.h> |
28 | #include <linux/err.h> | 29 | #include <linux/err.h> |
29 | #include <linux/kernel.h> | 30 | #include <linux/kernel.h> |
@@ -716,9 +717,11 @@ static int nbd_ioctl(struct block_device *bdev, fmode_t mode, | |||
716 | dprintk(DBG_IOCTL, "%s: nbd_ioctl cmd=%s(0x%x) arg=%lu\n", | 717 | dprintk(DBG_IOCTL, "%s: nbd_ioctl cmd=%s(0x%x) arg=%lu\n", |
717 | lo->disk->disk_name, ioctl_cmd_to_ascii(cmd), cmd, arg); | 718 | lo->disk->disk_name, ioctl_cmd_to_ascii(cmd), cmd, arg); |
718 | 719 | ||
720 | lock_kernel(); | ||
719 | mutex_lock(&lo->tx_lock); | 721 | mutex_lock(&lo->tx_lock); |
720 | error = __nbd_ioctl(bdev, lo, cmd, arg); | 722 | error = __nbd_ioctl(bdev, lo, cmd, arg); |
721 | mutex_unlock(&lo->tx_lock); | 723 | mutex_unlock(&lo->tx_lock); |
724 | unlock_kernel(); | ||
722 | 725 | ||
723 | return error; | 726 | return error; |
724 | } | 727 | } |
@@ -726,7 +729,7 @@ static int nbd_ioctl(struct block_device *bdev, fmode_t mode, | |||
726 | static const struct block_device_operations nbd_fops = | 729 | static const struct block_device_operations nbd_fops = |
727 | { | 730 | { |
728 | .owner = THIS_MODULE, | 731 | .owner = THIS_MODULE, |
729 | .locked_ioctl = nbd_ioctl, | 732 | .ioctl = nbd_ioctl, |
730 | }; | 733 | }; |
731 | 734 | ||
732 | /* | 735 | /* |
diff --git a/drivers/block/paride/pcd.c b/drivers/block/paride/pcd.c index 71acf4e53356..daba7a62a663 100644 --- a/drivers/block/paride/pcd.c +++ b/drivers/block/paride/pcd.c | |||
@@ -138,6 +138,7 @@ enum {D_PRT, D_PRO, D_UNI, D_MOD, D_SLV, D_DLY}; | |||
138 | #include <linux/cdrom.h> | 138 | #include <linux/cdrom.h> |
139 | #include <linux/spinlock.h> | 139 | #include <linux/spinlock.h> |
140 | #include <linux/blkdev.h> | 140 | #include <linux/blkdev.h> |
141 | #include <linux/smp_lock.h> | ||
141 | #include <asm/uaccess.h> | 142 | #include <asm/uaccess.h> |
142 | 143 | ||
143 | static DEFINE_SPINLOCK(pcd_lock); | 144 | static DEFINE_SPINLOCK(pcd_lock); |
@@ -238,7 +239,13 @@ static int pcd_block_ioctl(struct block_device *bdev, fmode_t mode, | |||
238 | unsigned cmd, unsigned long arg) | 239 | unsigned cmd, unsigned long arg) |
239 | { | 240 | { |
240 | struct pcd_unit *cd = bdev->bd_disk->private_data; | 241 | struct pcd_unit *cd = bdev->bd_disk->private_data; |
241 | return cdrom_ioctl(&cd->info, bdev, mode, cmd, arg); | 242 | int ret; |
243 | |||
244 | lock_kernel(); | ||
245 | ret = cdrom_ioctl(&cd->info, bdev, mode, cmd, arg); | ||
246 | unlock_kernel(); | ||
247 | |||
248 | return ret; | ||
242 | } | 249 | } |
243 | 250 | ||
244 | static int pcd_block_media_changed(struct gendisk *disk) | 251 | static int pcd_block_media_changed(struct gendisk *disk) |
@@ -251,7 +258,7 @@ static const struct block_device_operations pcd_bdops = { | |||
251 | .owner = THIS_MODULE, | 258 | .owner = THIS_MODULE, |
252 | .open = pcd_block_open, | 259 | .open = pcd_block_open, |
253 | .release = pcd_block_release, | 260 | .release = pcd_block_release, |
254 | .locked_ioctl = pcd_block_ioctl, | 261 | .ioctl = pcd_block_ioctl, |
255 | .media_changed = pcd_block_media_changed, | 262 | .media_changed = pcd_block_media_changed, |
256 | }; | 263 | }; |
257 | 264 | ||
diff --git a/drivers/block/paride/pd.c b/drivers/block/paride/pd.c index 4e8b9bff3abe..c4d6ed9846ca 100644 --- a/drivers/block/paride/pd.c +++ b/drivers/block/paride/pd.c | |||
@@ -153,6 +153,7 @@ enum {D_PRT, D_PRO, D_UNI, D_MOD, D_GEO, D_SBY, D_DLY, D_SLV}; | |||
153 | #include <linux/blkdev.h> | 153 | #include <linux/blkdev.h> |
154 | #include <linux/blkpg.h> | 154 | #include <linux/blkpg.h> |
155 | #include <linux/kernel.h> | 155 | #include <linux/kernel.h> |
156 | #include <linux/smp_lock.h> | ||
156 | #include <asm/uaccess.h> | 157 | #include <asm/uaccess.h> |
157 | #include <linux/workqueue.h> | 158 | #include <linux/workqueue.h> |
158 | 159 | ||
@@ -768,8 +769,10 @@ static int pd_ioctl(struct block_device *bdev, fmode_t mode, | |||
768 | 769 | ||
769 | switch (cmd) { | 770 | switch (cmd) { |
770 | case CDROMEJECT: | 771 | case CDROMEJECT: |
772 | lock_kernel(); | ||
771 | if (disk->access == 1) | 773 | if (disk->access == 1) |
772 | pd_special_command(disk, pd_eject); | 774 | pd_special_command(disk, pd_eject); |
775 | unlock_kernel(); | ||
773 | return 0; | 776 | return 0; |
774 | default: | 777 | default: |
775 | return -EINVAL; | 778 | return -EINVAL; |
@@ -812,7 +815,7 @@ static const struct block_device_operations pd_fops = { | |||
812 | .owner = THIS_MODULE, | 815 | .owner = THIS_MODULE, |
813 | .open = pd_open, | 816 | .open = pd_open, |
814 | .release = pd_release, | 817 | .release = pd_release, |
815 | .locked_ioctl = pd_ioctl, | 818 | .ioctl = pd_ioctl, |
816 | .getgeo = pd_getgeo, | 819 | .getgeo = pd_getgeo, |
817 | .media_changed = pd_check_media, | 820 | .media_changed = pd_check_media, |
818 | .revalidate_disk= pd_revalidate | 821 | .revalidate_disk= pd_revalidate |
diff --git a/drivers/block/paride/pf.c b/drivers/block/paride/pf.c index c059aab3006b..38b4d566b816 100644 --- a/drivers/block/paride/pf.c +++ b/drivers/block/paride/pf.c | |||
@@ -152,6 +152,7 @@ enum {D_PRT, D_PRO, D_UNI, D_MOD, D_SLV, D_LUN, D_DLY}; | |||
152 | #include <linux/spinlock.h> | 152 | #include <linux/spinlock.h> |
153 | #include <linux/blkdev.h> | 153 | #include <linux/blkdev.h> |
154 | #include <linux/blkpg.h> | 154 | #include <linux/blkpg.h> |
155 | #include <linux/smp_lock.h> | ||
155 | #include <asm/uaccess.h> | 156 | #include <asm/uaccess.h> |
156 | 157 | ||
157 | static DEFINE_SPINLOCK(pf_spin_lock); | 158 | static DEFINE_SPINLOCK(pf_spin_lock); |
@@ -266,7 +267,7 @@ static const struct block_device_operations pf_fops = { | |||
266 | .owner = THIS_MODULE, | 267 | .owner = THIS_MODULE, |
267 | .open = pf_open, | 268 | .open = pf_open, |
268 | .release = pf_release, | 269 | .release = pf_release, |
269 | .locked_ioctl = pf_ioctl, | 270 | .ioctl = pf_ioctl, |
270 | .getgeo = pf_getgeo, | 271 | .getgeo = pf_getgeo, |
271 | .media_changed = pf_check_media, | 272 | .media_changed = pf_check_media, |
272 | }; | 273 | }; |
@@ -342,7 +343,10 @@ static int pf_ioctl(struct block_device *bdev, fmode_t mode, unsigned int cmd, u | |||
342 | 343 | ||
343 | if (pf->access != 1) | 344 | if (pf->access != 1) |
344 | return -EBUSY; | 345 | return -EBUSY; |
346 | lock_kernel(); | ||
345 | pf_eject(pf); | 347 | pf_eject(pf); |
348 | unlock_kernel(); | ||
349 | |||
346 | return 0; | 350 | return 0; |
347 | } | 351 | } |
348 | 352 | ||
diff --git a/drivers/block/pktcdvd.c b/drivers/block/pktcdvd.c index 9f3e4454274b..40f1e31f42c4 100644 --- a/drivers/block/pktcdvd.c +++ b/drivers/block/pktcdvd.c | |||
@@ -57,6 +57,7 @@ | |||
57 | #include <linux/seq_file.h> | 57 | #include <linux/seq_file.h> |
58 | #include <linux/miscdevice.h> | 58 | #include <linux/miscdevice.h> |
59 | #include <linux/freezer.h> | 59 | #include <linux/freezer.h> |
60 | #include <linux/smp_lock.h> | ||
60 | #include <linux/mutex.h> | 61 | #include <linux/mutex.h> |
61 | #include <linux/slab.h> | 62 | #include <linux/slab.h> |
62 | #include <scsi/scsi_cmnd.h> | 63 | #include <scsi/scsi_cmnd.h> |
@@ -2762,10 +2763,12 @@ out_mem: | |||
2762 | static int pkt_ioctl(struct block_device *bdev, fmode_t mode, unsigned int cmd, unsigned long arg) | 2763 | static int pkt_ioctl(struct block_device *bdev, fmode_t mode, unsigned int cmd, unsigned long arg) |
2763 | { | 2764 | { |
2764 | struct pktcdvd_device *pd = bdev->bd_disk->private_data; | 2765 | struct pktcdvd_device *pd = bdev->bd_disk->private_data; |
2766 | int ret; | ||
2765 | 2767 | ||
2766 | VPRINTK("pkt_ioctl: cmd %x, dev %d:%d\n", cmd, | 2768 | VPRINTK("pkt_ioctl: cmd %x, dev %d:%d\n", cmd, |
2767 | MAJOR(bdev->bd_dev), MINOR(bdev->bd_dev)); | 2769 | MAJOR(bdev->bd_dev), MINOR(bdev->bd_dev)); |
2768 | 2770 | ||
2771 | lock_kernel(); | ||
2769 | switch (cmd) { | 2772 | switch (cmd) { |
2770 | case CDROMEJECT: | 2773 | case CDROMEJECT: |
2771 | /* | 2774 | /* |
@@ -2783,14 +2786,16 @@ static int pkt_ioctl(struct block_device *bdev, fmode_t mode, unsigned int cmd, | |||
2783 | case CDROM_LAST_WRITTEN: | 2786 | case CDROM_LAST_WRITTEN: |
2784 | case CDROM_SEND_PACKET: | 2787 | case CDROM_SEND_PACKET: |
2785 | case SCSI_IOCTL_SEND_COMMAND: | 2788 | case SCSI_IOCTL_SEND_COMMAND: |
2786 | return __blkdev_driver_ioctl(pd->bdev, mode, cmd, arg); | 2789 | ret = __blkdev_driver_ioctl(pd->bdev, mode, cmd, arg); |
2790 | break; | ||
2787 | 2791 | ||
2788 | default: | 2792 | default: |
2789 | VPRINTK(DRIVER_NAME": Unknown ioctl for %s (%x)\n", pd->name, cmd); | 2793 | VPRINTK(DRIVER_NAME": Unknown ioctl for %s (%x)\n", pd->name, cmd); |
2790 | return -ENOTTY; | 2794 | ret = -ENOTTY; |
2791 | } | 2795 | } |
2796 | unlock_kernel(); | ||
2792 | 2797 | ||
2793 | return 0; | 2798 | return ret; |
2794 | } | 2799 | } |
2795 | 2800 | ||
2796 | static int pkt_media_changed(struct gendisk *disk) | 2801 | static int pkt_media_changed(struct gendisk *disk) |
@@ -2812,7 +2817,7 @@ static const struct block_device_operations pktcdvd_ops = { | |||
2812 | .owner = THIS_MODULE, | 2817 | .owner = THIS_MODULE, |
2813 | .open = pkt_open, | 2818 | .open = pkt_open, |
2814 | .release = pkt_close, | 2819 | .release = pkt_close, |
2815 | .locked_ioctl = pkt_ioctl, | 2820 | .ioctl = pkt_ioctl, |
2816 | .media_changed = pkt_media_changed, | 2821 | .media_changed = pkt_media_changed, |
2817 | }; | 2822 | }; |
2818 | 2823 | ||
diff --git a/drivers/block/swim.c b/drivers/block/swim.c index e463657569ff..f04f74e3758f 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> |
@@ -690,7 +691,9 @@ static int floppy_ioctl(struct block_device *bdev, fmode_t mode, | |||
690 | case FDEJECT: | 691 | case FDEJECT: |
691 | if (fs->ref_count != 1) | 692 | if (fs->ref_count != 1) |
692 | return -EBUSY; | 693 | return -EBUSY; |
694 | lock_kernel(); | ||
693 | err = floppy_eject(fs); | 695 | err = floppy_eject(fs); |
696 | unlock_kernel(); | ||
694 | return err; | 697 | return err; |
695 | 698 | ||
696 | case FDGETPRM: | 699 | case FDGETPRM: |
@@ -753,7 +756,7 @@ static const struct block_device_operations floppy_fops = { | |||
753 | .owner = THIS_MODULE, | 756 | .owner = THIS_MODULE, |
754 | .open = floppy_open, | 757 | .open = floppy_open, |
755 | .release = floppy_release, | 758 | .release = floppy_release, |
756 | .locked_ioctl = floppy_ioctl, | 759 | .ioctl = floppy_ioctl, |
757 | .getgeo = floppy_getgeo, | 760 | .getgeo = floppy_getgeo, |
758 | .media_changed = floppy_check_change, | 761 | .media_changed = floppy_check_change, |
759 | .revalidate_disk = floppy_revalidate, | 762 | .revalidate_disk = floppy_revalidate, |
diff --git a/drivers/block/swim3.c b/drivers/block/swim3.c index ed6fb91123ab..f3657b2a5386 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; |
@@ -997,7 +1010,7 @@ static int floppy_revalidate(struct gendisk *disk) | |||
997 | static const struct block_device_operations floppy_fops = { | 1010 | static const struct block_device_operations floppy_fops = { |
998 | .open = floppy_open, | 1011 | .open = floppy_open, |
999 | .release = floppy_release, | 1012 | .release = floppy_release, |
1000 | .locked_ioctl = floppy_ioctl, | 1013 | .ioctl = floppy_ioctl, |
1001 | .media_changed = floppy_check_change, | 1014 | .media_changed = floppy_check_change, |
1002 | .revalidate_disk= floppy_revalidate, | 1015 | .revalidate_disk= floppy_revalidate, |
1003 | }; | 1016 | }; |
diff --git a/drivers/block/ub.c b/drivers/block/ub.c index aaf27fb4efd6..102ed52d0e0f 100644 --- a/drivers/block/ub.c +++ b/drivers/block/ub.c | |||
@@ -28,6 +28,7 @@ | |||
28 | #include <linux/timer.h> | 28 | #include <linux/timer.h> |
29 | #include <linux/scatterlist.h> | 29 | #include <linux/scatterlist.h> |
30 | #include <linux/slab.h> | 30 | #include <linux/slab.h> |
31 | #include <linux/smp_lock.h> | ||
31 | #include <scsi/scsi.h> | 32 | #include <scsi/scsi.h> |
32 | 33 | ||
33 | #define DRV_NAME "ub" | 34 | #define DRV_NAME "ub" |
@@ -1729,8 +1730,13 @@ static int ub_bd_ioctl(struct block_device *bdev, fmode_t mode, | |||
1729 | { | 1730 | { |
1730 | struct gendisk *disk = bdev->bd_disk; | 1731 | struct gendisk *disk = bdev->bd_disk; |
1731 | void __user *usermem = (void __user *) arg; | 1732 | void __user *usermem = (void __user *) arg; |
1733 | int ret; | ||
1734 | |||
1735 | lock_kernel(); | ||
1736 | ret = scsi_cmd_ioctl(disk->queue, disk, mode, cmd, usermem); | ||
1737 | unlock_kernel(); | ||
1732 | 1738 | ||
1733 | return scsi_cmd_ioctl(disk->queue, disk, mode, cmd, usermem); | 1739 | return ret; |
1734 | } | 1740 | } |
1735 | 1741 | ||
1736 | /* | 1742 | /* |
@@ -1794,7 +1800,7 @@ static const struct block_device_operations ub_bd_fops = { | |||
1794 | .owner = THIS_MODULE, | 1800 | .owner = THIS_MODULE, |
1795 | .open = ub_bd_open, | 1801 | .open = ub_bd_open, |
1796 | .release = ub_bd_release, | 1802 | .release = ub_bd_release, |
1797 | .locked_ioctl = ub_bd_ioctl, | 1803 | .ioctl = ub_bd_ioctl, |
1798 | .media_changed = ub_bd_media_changed, | 1804 | .media_changed = ub_bd_media_changed, |
1799 | .revalidate_disk = ub_bd_revalidate, | 1805 | .revalidate_disk = ub_bd_revalidate, |
1800 | }; | 1806 | }; |
diff --git a/drivers/block/virtio_blk.c b/drivers/block/virtio_blk.c index 0a3222fd4442..7b0f7b624adf 100644 --- a/drivers/block/virtio_blk.c +++ b/drivers/block/virtio_blk.c | |||
@@ -2,6 +2,7 @@ | |||
2 | #include <linux/spinlock.h> | 2 | #include <linux/spinlock.h> |
3 | #include <linux/slab.h> | 3 | #include <linux/slab.h> |
4 | #include <linux/blkdev.h> | 4 | #include <linux/blkdev.h> |
5 | #include <linux/smp_lock.h> | ||
5 | #include <linux/hdreg.h> | 6 | #include <linux/hdreg.h> |
6 | #include <linux/virtio.h> | 7 | #include <linux/virtio.h> |
7 | #include <linux/virtio_blk.h> | 8 | #include <linux/virtio_blk.h> |
@@ -217,7 +218,7 @@ static int virtblk_get_id(struct gendisk *disk, char *id_str) | |||
217 | return blk_execute_rq(vblk->disk->queue, vblk->disk, req, false); | 218 | return blk_execute_rq(vblk->disk->queue, vblk->disk, req, false); |
218 | } | 219 | } |
219 | 220 | ||
220 | static int virtblk_ioctl(struct block_device *bdev, fmode_t mode, | 221 | static int virtblk_locked_ioctl(struct block_device *bdev, fmode_t mode, |
221 | unsigned cmd, unsigned long data) | 222 | unsigned cmd, unsigned long data) |
222 | { | 223 | { |
223 | struct gendisk *disk = bdev->bd_disk; | 224 | struct gendisk *disk = bdev->bd_disk; |
@@ -243,6 +244,18 @@ static int virtblk_ioctl(struct block_device *bdev, fmode_t mode, | |||
243 | (void __user *)data); | 244 | (void __user *)data); |
244 | } | 245 | } |
245 | 246 | ||
247 | static int virtblk_ioctl(struct block_device *bdev, fmode_t mode, | ||
248 | unsigned int cmd, unsigned long param) | ||
249 | { | ||
250 | int ret; | ||
251 | |||
252 | lock_kernel(); | ||
253 | ret = virtblk_locked_ioctl(bdev, mode, cmd, param); | ||
254 | unlock_kernel(); | ||
255 | |||
256 | return ret; | ||
257 | } | ||
258 | |||
246 | /* We provide getgeo only to please some old bootloader/partitioning tools */ | 259 | /* We provide getgeo only to please some old bootloader/partitioning tools */ |
247 | static int virtblk_getgeo(struct block_device *bd, struct hd_geometry *geo) | 260 | static int virtblk_getgeo(struct block_device *bd, struct hd_geometry *geo) |
248 | { | 261 | { |
@@ -269,7 +282,7 @@ static int virtblk_getgeo(struct block_device *bd, struct hd_geometry *geo) | |||
269 | } | 282 | } |
270 | 283 | ||
271 | static const struct block_device_operations virtblk_fops = { | 284 | static const struct block_device_operations virtblk_fops = { |
272 | .locked_ioctl = virtblk_ioctl, | 285 | .ioctl = virtblk_ioctl, |
273 | .owner = THIS_MODULE, | 286 | .owner = THIS_MODULE, |
274 | .getgeo = virtblk_getgeo, | 287 | .getgeo = virtblk_getgeo, |
275 | }; | 288 | }; |
diff --git a/drivers/block/xd.c b/drivers/block/xd.c index b16a3a926cf2..d5a3cd750561 100644 --- a/drivers/block/xd.c +++ b/drivers/block/xd.c | |||
@@ -46,6 +46,7 @@ | |||
46 | #include <linux/init.h> | 46 | #include <linux/init.h> |
47 | #include <linux/wait.h> | 47 | #include <linux/wait.h> |
48 | #include <linux/blkdev.h> | 48 | #include <linux/blkdev.h> |
49 | #include <linux/smp_lock.h> | ||
49 | #include <linux/blkpg.h> | 50 | #include <linux/blkpg.h> |
50 | #include <linux/delay.h> | 51 | #include <linux/delay.h> |
51 | #include <linux/io.h> | 52 | #include <linux/io.h> |
@@ -133,7 +134,7 @@ static int xd_getgeo(struct block_device *bdev, struct hd_geometry *geo); | |||
133 | 134 | ||
134 | static const struct block_device_operations xd_fops = { | 135 | static const struct block_device_operations xd_fops = { |
135 | .owner = THIS_MODULE, | 136 | .owner = THIS_MODULE, |
136 | .locked_ioctl = xd_ioctl, | 137 | .ioctl = xd_ioctl, |
137 | .getgeo = xd_getgeo, | 138 | .getgeo = xd_getgeo, |
138 | }; | 139 | }; |
139 | static DECLARE_WAIT_QUEUE_HEAD(xd_wait_int); | 140 | static DECLARE_WAIT_QUEUE_HEAD(xd_wait_int); |
@@ -347,7 +348,7 @@ static int xd_getgeo(struct block_device *bdev, struct hd_geometry *geo) | |||
347 | } | 348 | } |
348 | 349 | ||
349 | /* xd_ioctl: handle device ioctl's */ | 350 | /* xd_ioctl: handle device ioctl's */ |
350 | static int xd_ioctl(struct block_device *bdev, fmode_t mode, u_int cmd, u_long arg) | 351 | static int xd_locked_ioctl(struct block_device *bdev, fmode_t mode, u_int cmd, u_long arg) |
351 | { | 352 | { |
352 | switch (cmd) { | 353 | switch (cmd) { |
353 | case HDIO_SET_DMA: | 354 | case HDIO_SET_DMA: |
@@ -375,6 +376,18 @@ static int xd_ioctl(struct block_device *bdev, fmode_t mode, u_int cmd, u_long a | |||
375 | } | 376 | } |
376 | } | 377 | } |
377 | 378 | ||
379 | static int xd_ioctl(struct block_device *bdev, fmode_t mode, | ||
380 | unsigned int cmd, unsigned long param) | ||
381 | { | ||
382 | int ret; | ||
383 | |||
384 | lock_kernel(); | ||
385 | ret = xd_locked_ioctl(bdev, mode, cmd, param); | ||
386 | unlock_kernel(); | ||
387 | |||
388 | return ret; | ||
389 | } | ||
390 | |||
378 | /* xd_readwrite: handle a read/write request */ | 391 | /* xd_readwrite: handle a read/write request */ |
379 | static int xd_readwrite (u_char operation,XD_INFO *p,char *buffer,u_int block,u_int count) | 392 | static int xd_readwrite (u_char operation,XD_INFO *p,char *buffer,u_int block,u_int count) |
380 | { | 393 | { |
diff --git a/drivers/block/xen-blkfront.c b/drivers/block/xen-blkfront.c index 76af65b654e3..9119cd3d56a4 100644 --- a/drivers/block/xen-blkfront.c +++ b/drivers/block/xen-blkfront.c | |||
@@ -1045,7 +1045,7 @@ static const struct block_device_operations xlvbd_block_fops = | |||
1045 | .open = blkif_open, | 1045 | .open = blkif_open, |
1046 | .release = blkif_release, | 1046 | .release = blkif_release, |
1047 | .getgeo = blkif_getgeo, | 1047 | .getgeo = blkif_getgeo, |
1048 | .locked_ioctl = blkif_ioctl, | 1048 | .ioctl = blkif_ioctl, |
1049 | }; | 1049 | }; |
1050 | 1050 | ||
1051 | 1051 | ||
diff --git a/drivers/cdrom/gdrom.c b/drivers/cdrom/gdrom.c index 5219b57deb36..1772fd914fb9 100644 --- a/drivers/cdrom/gdrom.c +++ b/drivers/cdrom/gdrom.c | |||
@@ -34,6 +34,7 @@ | |||
34 | #include <linux/blkdev.h> | 34 | #include <linux/blkdev.h> |
35 | #include <linux/interrupt.h> | 35 | #include <linux/interrupt.h> |
36 | #include <linux/device.h> | 36 | #include <linux/device.h> |
37 | #include <linux/smp_lock.h> | ||
37 | #include <linux/wait.h> | 38 | #include <linux/wait.h> |
38 | #include <linux/workqueue.h> | 39 | #include <linux/workqueue.h> |
39 | #include <linux/platform_device.h> | 40 | #include <linux/platform_device.h> |
@@ -509,7 +510,13 @@ static int gdrom_bdops_mediachanged(struct gendisk *disk) | |||
509 | static int gdrom_bdops_ioctl(struct block_device *bdev, fmode_t mode, | 510 | static int gdrom_bdops_ioctl(struct block_device *bdev, fmode_t mode, |
510 | unsigned cmd, unsigned long arg) | 511 | unsigned cmd, unsigned long arg) |
511 | { | 512 | { |
512 | return cdrom_ioctl(gd.cd_info, bdev, mode, cmd, arg); | 513 | int ret; |
514 | |||
515 | lock_kernel(); | ||
516 | ret = cdrom_ioctl(gd.cd_info, bdev, mode, cmd, arg); | ||
517 | unlock_kernel(); | ||
518 | |||
519 | return ret; | ||
513 | } | 520 | } |
514 | 521 | ||
515 | static const struct block_device_operations gdrom_bdops = { | 522 | static const struct block_device_operations gdrom_bdops = { |
@@ -517,7 +524,7 @@ static const struct block_device_operations gdrom_bdops = { | |||
517 | .open = gdrom_bdops_open, | 524 | .open = gdrom_bdops_open, |
518 | .release = gdrom_bdops_release, | 525 | .release = gdrom_bdops_release, |
519 | .media_changed = gdrom_bdops_mediachanged, | 526 | .media_changed = gdrom_bdops_mediachanged, |
520 | .locked_ioctl = gdrom_bdops_ioctl, | 527 | .ioctl = gdrom_bdops_ioctl, |
521 | }; | 528 | }; |
522 | 529 | ||
523 | static irqreturn_t gdrom_command_interrupt(int irq, void *dev_id) | 530 | static irqreturn_t gdrom_command_interrupt(int irq, void *dev_id) |
diff --git a/drivers/cdrom/viocd.c b/drivers/cdrom/viocd.c index 1fa6628d150b..16dada0627ee 100644 --- a/drivers/cdrom/viocd.c +++ b/drivers/cdrom/viocd.c | |||
@@ -42,6 +42,7 @@ | |||
42 | #include <linux/module.h> | 42 | #include <linux/module.h> |
43 | #include <linux/completion.h> | 43 | #include <linux/completion.h> |
44 | #include <linux/proc_fs.h> | 44 | #include <linux/proc_fs.h> |
45 | #include <linux/smp_lock.h> | ||
45 | #include <linux/seq_file.h> | 46 | #include <linux/seq_file.h> |
46 | #include <linux/scatterlist.h> | 47 | #include <linux/scatterlist.h> |
47 | 48 | ||
@@ -167,7 +168,13 @@ static int viocd_blk_ioctl(struct block_device *bdev, fmode_t mode, | |||
167 | unsigned cmd, unsigned long arg) | 168 | unsigned cmd, unsigned long arg) |
168 | { | 169 | { |
169 | struct disk_info *di = bdev->bd_disk->private_data; | 170 | struct disk_info *di = bdev->bd_disk->private_data; |
170 | return cdrom_ioctl(&di->viocd_info, bdev, mode, cmd, arg); | 171 | int ret; |
172 | |||
173 | lock_kernel(); | ||
174 | ret = cdrom_ioctl(&di->viocd_info, bdev, mode, cmd, arg); | ||
175 | unlock_kernel(); | ||
176 | |||
177 | return ret; | ||
171 | } | 178 | } |
172 | 179 | ||
173 | static int viocd_blk_media_changed(struct gendisk *disk) | 180 | static int viocd_blk_media_changed(struct gendisk *disk) |
@@ -180,7 +187,7 @@ static const struct block_device_operations viocd_fops = { | |||
180 | .owner = THIS_MODULE, | 187 | .owner = THIS_MODULE, |
181 | .open = viocd_blk_open, | 188 | .open = viocd_blk_open, |
182 | .release = viocd_blk_release, | 189 | .release = viocd_blk_release, |
183 | .locked_ioctl = viocd_blk_ioctl, | 190 | .ioctl = viocd_blk_ioctl, |
184 | .media_changed = viocd_blk_media_changed, | 191 | .media_changed = viocd_blk_media_changed, |
185 | }; | 192 | }; |
186 | 193 | ||
diff --git a/drivers/ide/ide-cd.c b/drivers/ide/ide-cd.c index ef7e3a9bee51..bf9f61a5c2f8 100644 --- a/drivers/ide/ide-cd.c +++ b/drivers/ide/ide-cd.c | |||
@@ -31,6 +31,7 @@ | |||
31 | #include <linux/delay.h> | 31 | #include <linux/delay.h> |
32 | #include <linux/timer.h> | 32 | #include <linux/timer.h> |
33 | #include <linux/seq_file.h> | 33 | #include <linux/seq_file.h> |
34 | #include <linux/smp_lock.h> | ||
34 | #include <linux/slab.h> | 35 | #include <linux/slab.h> |
35 | #include <linux/interrupt.h> | 36 | #include <linux/interrupt.h> |
36 | #include <linux/errno.h> | 37 | #include <linux/errno.h> |
@@ -1654,7 +1655,7 @@ static int idecd_get_spindown(struct cdrom_device_info *cdi, unsigned long arg) | |||
1654 | return 0; | 1655 | return 0; |
1655 | } | 1656 | } |
1656 | 1657 | ||
1657 | static int idecd_ioctl(struct block_device *bdev, fmode_t mode, | 1658 | static int idecd_locked_ioctl(struct block_device *bdev, fmode_t mode, |
1658 | unsigned int cmd, unsigned long arg) | 1659 | unsigned int cmd, unsigned long arg) |
1659 | { | 1660 | { |
1660 | struct cdrom_info *info = ide_drv_g(bdev->bd_disk, cdrom_info); | 1661 | struct cdrom_info *info = ide_drv_g(bdev->bd_disk, cdrom_info); |
@@ -1676,6 +1677,19 @@ static int idecd_ioctl(struct block_device *bdev, fmode_t mode, | |||
1676 | return err; | 1677 | return err; |
1677 | } | 1678 | } |
1678 | 1679 | ||
1680 | static int idecd_ioctl(struct block_device *bdev, fmode_t mode, | ||
1681 | unsigned int cmd, unsigned long arg) | ||
1682 | { | ||
1683 | int ret; | ||
1684 | |||
1685 | lock_kernel(); | ||
1686 | ret = idecd_locked_ioctl(bdev, mode, cmd, arg); | ||
1687 | unlock_kernel(); | ||
1688 | |||
1689 | return ret; | ||
1690 | } | ||
1691 | |||
1692 | |||
1679 | static int idecd_media_changed(struct gendisk *disk) | 1693 | static int idecd_media_changed(struct gendisk *disk) |
1680 | { | 1694 | { |
1681 | struct cdrom_info *info = ide_drv_g(disk, cdrom_info); | 1695 | struct cdrom_info *info = ide_drv_g(disk, cdrom_info); |
@@ -1696,7 +1710,7 @@ static const struct block_device_operations idecd_ops = { | |||
1696 | .owner = THIS_MODULE, | 1710 | .owner = THIS_MODULE, |
1697 | .open = idecd_open, | 1711 | .open = idecd_open, |
1698 | .release = idecd_release, | 1712 | .release = idecd_release, |
1699 | .locked_ioctl = idecd_ioctl, | 1713 | .ioctl = idecd_ioctl, |
1700 | .media_changed = idecd_media_changed, | 1714 | .media_changed = idecd_media_changed, |
1701 | .revalidate_disk = idecd_revalidate_disk | 1715 | .revalidate_disk = idecd_revalidate_disk |
1702 | }; | 1716 | }; |
diff --git a/drivers/ide/ide-disk_ioctl.c b/drivers/ide/ide-disk_ioctl.c index 7b783dd7c0be..ec94c66918f6 100644 --- a/drivers/ide/ide-disk_ioctl.c +++ b/drivers/ide/ide-disk_ioctl.c | |||
@@ -1,6 +1,7 @@ | |||
1 | #include <linux/kernel.h> | 1 | #include <linux/kernel.h> |
2 | #include <linux/ide.h> | 2 | #include <linux/ide.h> |
3 | #include <linux/hdreg.h> | 3 | #include <linux/hdreg.h> |
4 | #include <linux/smp_lock.h> | ||
4 | 5 | ||
5 | #include "ide-disk.h" | 6 | #include "ide-disk.h" |
6 | 7 | ||
@@ -18,9 +19,13 @@ int ide_disk_ioctl(ide_drive_t *drive, struct block_device *bdev, fmode_t mode, | |||
18 | { | 19 | { |
19 | int err; | 20 | int err; |
20 | 21 | ||
22 | lock_kernel(); | ||
21 | err = ide_setting_ioctl(drive, bdev, cmd, arg, ide_disk_ioctl_settings); | 23 | err = ide_setting_ioctl(drive, bdev, cmd, arg, ide_disk_ioctl_settings); |
22 | if (err != -EOPNOTSUPP) | 24 | if (err != -EOPNOTSUPP) |
23 | return err; | 25 | goto out; |
24 | 26 | ||
25 | return generic_ide_ioctl(drive, bdev, cmd, arg); | 27 | err = generic_ide_ioctl(drive, bdev, cmd, arg); |
28 | out: | ||
29 | unlock_kernel(); | ||
30 | return err; | ||
26 | } | 31 | } |
diff --git a/drivers/ide/ide-floppy_ioctl.c b/drivers/ide/ide-floppy_ioctl.c index 9c2288234dea..fd3d05ab3417 100644 --- a/drivers/ide/ide-floppy_ioctl.c +++ b/drivers/ide/ide-floppy_ioctl.c | |||
@@ -5,6 +5,7 @@ | |||
5 | #include <linux/kernel.h> | 5 | #include <linux/kernel.h> |
6 | #include <linux/ide.h> | 6 | #include <linux/ide.h> |
7 | #include <linux/cdrom.h> | 7 | #include <linux/cdrom.h> |
8 | #include <linux/smp_lock.h> | ||
8 | 9 | ||
9 | #include <asm/unaligned.h> | 10 | #include <asm/unaligned.h> |
10 | 11 | ||
@@ -275,12 +276,15 @@ int ide_floppy_ioctl(ide_drive_t *drive, struct block_device *bdev, | |||
275 | void __user *argp = (void __user *)arg; | 276 | void __user *argp = (void __user *)arg; |
276 | int err; | 277 | int err; |
277 | 278 | ||
278 | if (cmd == CDROMEJECT || cmd == CDROM_LOCKDOOR) | 279 | lock_kernel(); |
279 | return ide_floppy_lockdoor(drive, &pc, arg, cmd); | 280 | if (cmd == CDROMEJECT || cmd == CDROM_LOCKDOOR) { |
281 | err = ide_floppy_lockdoor(drive, &pc, arg, cmd); | ||
282 | goto out; | ||
283 | } | ||
280 | 284 | ||
281 | err = ide_floppy_format_ioctl(drive, &pc, mode, cmd, argp); | 285 | err = ide_floppy_format_ioctl(drive, &pc, mode, cmd, argp); |
282 | if (err != -ENOTTY) | 286 | if (err != -ENOTTY) |
283 | return err; | 287 | goto out; |
284 | 288 | ||
285 | /* | 289 | /* |
286 | * skip SCSI_IOCTL_SEND_COMMAND (deprecated) | 290 | * skip SCSI_IOCTL_SEND_COMMAND (deprecated) |
@@ -293,5 +297,7 @@ int ide_floppy_ioctl(ide_drive_t *drive, struct block_device *bdev, | |||
293 | if (err == -ENOTTY) | 297 | if (err == -ENOTTY) |
294 | err = generic_ide_ioctl(drive, bdev, cmd, arg); | 298 | err = generic_ide_ioctl(drive, bdev, cmd, arg); |
295 | 299 | ||
300 | out: | ||
301 | unlock_kernel(); | ||
296 | return err; | 302 | return err; |
297 | } | 303 | } |
diff --git a/drivers/ide/ide-gd.c b/drivers/ide/ide-gd.c index c102d23d9b38..883f0c979c9f 100644 --- a/drivers/ide/ide-gd.c +++ b/drivers/ide/ide-gd.c | |||
@@ -323,7 +323,7 @@ static const struct block_device_operations ide_gd_ops = { | |||
323 | .owner = THIS_MODULE, | 323 | .owner = THIS_MODULE, |
324 | .open = ide_gd_open, | 324 | .open = ide_gd_open, |
325 | .release = ide_gd_release, | 325 | .release = ide_gd_release, |
326 | .locked_ioctl = ide_gd_ioctl, | 326 | .ioctl = ide_gd_ioctl, |
327 | .getgeo = ide_gd_getgeo, | 327 | .getgeo = ide_gd_getgeo, |
328 | .media_changed = ide_gd_media_changed, | 328 | .media_changed = ide_gd_media_changed, |
329 | .unlock_native_capacity = ide_gd_unlock_native_capacity, | 329 | .unlock_native_capacity = ide_gd_unlock_native_capacity, |
diff --git a/drivers/ide/ide-tape.c b/drivers/ide/ide-tape.c index 635fd72d4728..39b0a5c45f07 100644 --- a/drivers/ide/ide-tape.c +++ b/drivers/ide/ide-tape.c | |||
@@ -32,6 +32,7 @@ | |||
32 | #include <linux/errno.h> | 32 | #include <linux/errno.h> |
33 | #include <linux/genhd.h> | 33 | #include <linux/genhd.h> |
34 | #include <linux/seq_file.h> | 34 | #include <linux/seq_file.h> |
35 | #include <linux/smp_lock.h> | ||
35 | #include <linux/slab.h> | 36 | #include <linux/slab.h> |
36 | #include <linux/pci.h> | 37 | #include <linux/pci.h> |
37 | #include <linux/ide.h> | 38 | #include <linux/ide.h> |
@@ -1927,9 +1928,14 @@ static int idetape_ioctl(struct block_device *bdev, fmode_t mode, | |||
1927 | { | 1928 | { |
1928 | struct ide_tape_obj *tape = ide_drv_g(bdev->bd_disk, ide_tape_obj); | 1929 | struct ide_tape_obj *tape = ide_drv_g(bdev->bd_disk, ide_tape_obj); |
1929 | ide_drive_t *drive = tape->drive; | 1930 | ide_drive_t *drive = tape->drive; |
1930 | int err = generic_ide_ioctl(drive, bdev, cmd, arg); | 1931 | int err; |
1932 | |||
1933 | lock_kernel(); | ||
1934 | err = generic_ide_ioctl(drive, bdev, cmd, arg); | ||
1931 | if (err == -EINVAL) | 1935 | if (err == -EINVAL) |
1932 | err = idetape_blkdev_ioctl(drive, cmd, arg); | 1936 | err = idetape_blkdev_ioctl(drive, cmd, arg); |
1937 | unlock_kernel(); | ||
1938 | |||
1933 | return err; | 1939 | return err; |
1934 | } | 1940 | } |
1935 | 1941 | ||
@@ -1937,7 +1943,7 @@ static const struct block_device_operations idetape_block_ops = { | |||
1937 | .owner = THIS_MODULE, | 1943 | .owner = THIS_MODULE, |
1938 | .open = idetape_open, | 1944 | .open = idetape_open, |
1939 | .release = idetape_release, | 1945 | .release = idetape_release, |
1940 | .locked_ioctl = idetape_ioctl, | 1946 | .ioctl = idetape_ioctl, |
1941 | }; | 1947 | }; |
1942 | 1948 | ||
1943 | static int ide_tape_probe(ide_drive_t *drive) | 1949 | static int ide_tape_probe(ide_drive_t *drive) |
diff --git a/drivers/message/i2o/i2o_block.c b/drivers/message/i2o/i2o_block.c index b8233ff863e3..d1bdf8abe5db 100644 --- a/drivers/message/i2o/i2o_block.c +++ b/drivers/message/i2o/i2o_block.c | |||
@@ -53,7 +53,6 @@ | |||
53 | #include <linux/module.h> | 53 | #include <linux/module.h> |
54 | #include <linux/slab.h> | 54 | #include <linux/slab.h> |
55 | #include <linux/i2o.h> | 55 | #include <linux/i2o.h> |
56 | #include <linux/smp_lock.h> | ||
57 | 56 | ||
58 | #include <linux/mempool.h> | 57 | #include <linux/mempool.h> |
59 | 58 | ||
@@ -653,40 +652,30 @@ static int i2o_block_ioctl(struct block_device *bdev, fmode_t mode, | |||
653 | { | 652 | { |
654 | struct gendisk *disk = bdev->bd_disk; | 653 | struct gendisk *disk = bdev->bd_disk; |
655 | struct i2o_block_device *dev = disk->private_data; | 654 | struct i2o_block_device *dev = disk->private_data; |
656 | int ret = -ENOTTY; | ||
657 | 655 | ||
658 | /* Anyone capable of this syscall can do *real bad* things */ | 656 | /* Anyone capable of this syscall can do *real bad* things */ |
659 | 657 | ||
660 | if (!capable(CAP_SYS_ADMIN)) | 658 | if (!capable(CAP_SYS_ADMIN)) |
661 | return -EPERM; | 659 | return -EPERM; |
662 | 660 | ||
663 | lock_kernel(); | ||
664 | switch (cmd) { | 661 | switch (cmd) { |
665 | case BLKI2OGRSTRAT: | 662 | case BLKI2OGRSTRAT: |
666 | ret = put_user(dev->rcache, (int __user *)arg); | 663 | return put_user(dev->rcache, (int __user *)arg); |
667 | break; | ||
668 | case BLKI2OGWSTRAT: | 664 | case BLKI2OGWSTRAT: |
669 | ret = put_user(dev->wcache, (int __user *)arg); | 665 | return put_user(dev->wcache, (int __user *)arg); |
670 | break; | ||
671 | case BLKI2OSRSTRAT: | 666 | case BLKI2OSRSTRAT: |
672 | ret = -EINVAL; | ||
673 | if (arg < 0 || arg > CACHE_SMARTFETCH) | 667 | if (arg < 0 || arg > CACHE_SMARTFETCH) |
674 | break; | 668 | return -EINVAL; |
675 | dev->rcache = arg; | 669 | dev->rcache = arg; |
676 | ret = 0; | ||
677 | break; | 670 | break; |
678 | case BLKI2OSWSTRAT: | 671 | case BLKI2OSWSTRAT: |
679 | ret = -EINVAL; | ||
680 | if (arg != 0 | 672 | if (arg != 0 |
681 | && (arg < CACHE_WRITETHROUGH || arg > CACHE_SMARTBACK)) | 673 | && (arg < CACHE_WRITETHROUGH || arg > CACHE_SMARTBACK)) |
682 | break; | 674 | return -EINVAL; |
683 | dev->wcache = arg; | 675 | dev->wcache = arg; |
684 | ret = 0; | ||
685 | break; | 676 | break; |
686 | } | 677 | } |
687 | unlock_kernel(); | 678 | return -ENOTTY; |
688 | |||
689 | return ret; | ||
690 | }; | 679 | }; |
691 | 680 | ||
692 | /** | 681 | /** |
@@ -942,7 +931,6 @@ static const struct block_device_operations i2o_block_fops = { | |||
942 | .open = i2o_block_open, | 931 | .open = i2o_block_open, |
943 | .release = i2o_block_release, | 932 | .release = i2o_block_release, |
944 | .ioctl = i2o_block_ioctl, | 933 | .ioctl = i2o_block_ioctl, |
945 | .compat_ioctl = i2o_block_ioctl, | ||
946 | .getgeo = i2o_block_getgeo, | 934 | .getgeo = i2o_block_getgeo, |
947 | .media_changed = i2o_block_media_changed | 935 | .media_changed = i2o_block_media_changed |
948 | }; | 936 | }; |
diff --git a/drivers/mtd/mtd_blkdevs.c b/drivers/mtd/mtd_blkdevs.c index 475af42745cb..8c83b11a77d5 100644 --- a/drivers/mtd/mtd_blkdevs.c +++ b/drivers/mtd/mtd_blkdevs.c | |||
@@ -15,6 +15,7 @@ | |||
15 | #include <linux/blkdev.h> | 15 | #include <linux/blkdev.h> |
16 | #include <linux/blkpg.h> | 16 | #include <linux/blkpg.h> |
17 | #include <linux/spinlock.h> | 17 | #include <linux/spinlock.h> |
18 | #include <linux/smp_lock.h> | ||
18 | #include <linux/hdreg.h> | 19 | #include <linux/hdreg.h> |
19 | #include <linux/init.h> | 20 | #include <linux/init.h> |
20 | #include <linux/mutex.h> | 21 | #include <linux/mutex.h> |
@@ -237,6 +238,7 @@ static int blktrans_ioctl(struct block_device *bdev, fmode_t mode, | |||
237 | if (!dev) | 238 | if (!dev) |
238 | return ret; | 239 | return ret; |
239 | 240 | ||
241 | lock_kernel(); | ||
240 | mutex_lock(&dev->lock); | 242 | mutex_lock(&dev->lock); |
241 | 243 | ||
242 | if (!dev->mtd) | 244 | if (!dev->mtd) |
@@ -250,6 +252,7 @@ static int blktrans_ioctl(struct block_device *bdev, fmode_t mode, | |||
250 | } | 252 | } |
251 | unlock: | 253 | unlock: |
252 | mutex_unlock(&dev->lock); | 254 | mutex_unlock(&dev->lock); |
255 | unlock_kernel(); | ||
253 | blktrans_dev_put(dev); | 256 | blktrans_dev_put(dev); |
254 | return ret; | 257 | return ret; |
255 | } | 258 | } |
@@ -258,7 +261,7 @@ static const struct block_device_operations mtd_blktrans_ops = { | |||
258 | .owner = THIS_MODULE, | 261 | .owner = THIS_MODULE, |
259 | .open = blktrans_open, | 262 | .open = blktrans_open, |
260 | .release = blktrans_release, | 263 | .release = blktrans_release, |
261 | .locked_ioctl = blktrans_ioctl, | 264 | .ioctl = blktrans_ioctl, |
262 | .getgeo = blktrans_getgeo, | 265 | .getgeo = blktrans_getgeo, |
263 | }; | 266 | }; |
264 | 267 | ||
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 |
diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h index baf5258f5985..a8b05fc80c6d 100644 --- a/include/linux/blkdev.h +++ b/include/linux/blkdev.h | |||
@@ -1246,7 +1246,6 @@ static inline int blk_integrity_rq(struct request *rq) | |||
1246 | struct block_device_operations { | 1246 | struct block_device_operations { |
1247 | int (*open) (struct block_device *, fmode_t); | 1247 | int (*open) (struct block_device *, fmode_t); |
1248 | int (*release) (struct gendisk *, fmode_t); | 1248 | int (*release) (struct gendisk *, fmode_t); |
1249 | int (*locked_ioctl) (struct block_device *, fmode_t, unsigned, unsigned long); | ||
1250 | int (*ioctl) (struct block_device *, fmode_t, unsigned, unsigned long); | 1249 | int (*ioctl) (struct block_device *, fmode_t, unsigned, unsigned long); |
1251 | int (*compat_ioctl) (struct block_device *, fmode_t, unsigned, unsigned long); | 1250 | int (*compat_ioctl) (struct block_device *, fmode_t, unsigned, unsigned long); |
1252 | int (*direct_access) (struct block_device *, sector_t, | 1251 | int (*direct_access) (struct block_device *, sector_t, |