diff options
Diffstat (limited to 'block/ioctl.c')
-rw-r--r-- | block/ioctl.c | 35 |
1 files changed, 26 insertions, 9 deletions
diff --git a/block/ioctl.c b/block/ioctl.c index 9a26ace6d042..01ff463bc801 100644 --- a/block/ioctl.c +++ b/block/ioctl.c | |||
@@ -269,17 +269,24 @@ int blkdev_driver_ioctl(struct inode *inode, struct file *file, | |||
269 | struct gendisk *disk, unsigned cmd, unsigned long arg) | 269 | struct gendisk *disk, unsigned cmd, unsigned long arg) |
270 | { | 270 | { |
271 | int ret; | 271 | int ret; |
272 | if (disk->fops->unlocked_ioctl) | 272 | fmode_t mode = 0; |
273 | return disk->fops->unlocked_ioctl(file, cmd, arg); | 273 | if (file) { |
274 | mode = file->f_mode; | ||
275 | if (file->f_flags & O_NDELAY) | ||
276 | mode |= FMODE_NDELAY_NOW; | ||
277 | } | ||
278 | |||
279 | if (disk->fops->__unlocked_ioctl) | ||
280 | return disk->fops->__unlocked_ioctl(file, cmd, arg); | ||
274 | 281 | ||
275 | if (disk->fops->ioctl) { | 282 | if (disk->fops->__ioctl) { |
276 | lock_kernel(); | 283 | lock_kernel(); |
277 | ret = disk->fops->ioctl(inode, file, cmd, arg); | 284 | ret = disk->fops->__ioctl(inode, file, cmd, arg); |
278 | unlock_kernel(); | 285 | unlock_kernel(); |
279 | return ret; | 286 | return ret; |
280 | } | 287 | } |
281 | 288 | ||
282 | return -ENOTTY; | 289 | return __blkdev_driver_ioctl(inode->i_bdev, mode, cmd, arg); |
283 | } | 290 | } |
284 | EXPORT_SYMBOL_GPL(blkdev_driver_ioctl); | 291 | EXPORT_SYMBOL_GPL(blkdev_driver_ioctl); |
285 | 292 | ||
@@ -295,12 +302,22 @@ int __blkdev_driver_ioctl(struct block_device *bdev, fmode_t mode, | |||
295 | fake_file.f_path.dentry = &fake_dentry; | 302 | fake_file.f_path.dentry = &fake_dentry; |
296 | fake_dentry.d_inode = bdev->bd_inode; | 303 | fake_dentry.d_inode = bdev->bd_inode; |
297 | 304 | ||
298 | if (disk->fops->unlocked_ioctl) | 305 | if (disk->fops->__unlocked_ioctl) |
299 | return disk->fops->unlocked_ioctl(&fake_file, cmd, arg); | 306 | return disk->fops->__unlocked_ioctl(&fake_file, cmd, arg); |
307 | |||
308 | if (disk->fops->__ioctl) { | ||
309 | lock_kernel(); | ||
310 | ret = disk->fops->__ioctl(bdev->bd_inode, &fake_file, cmd, arg); | ||
311 | unlock_kernel(); | ||
312 | return ret; | ||
313 | } | ||
314 | |||
315 | if (disk->fops->ioctl) | ||
316 | return disk->fops->ioctl(bdev, mode, cmd, arg); | ||
300 | 317 | ||
301 | if (disk->fops->ioctl) { | 318 | if (disk->fops->locked_ioctl) { |
302 | lock_kernel(); | 319 | lock_kernel(); |
303 | ret = disk->fops->ioctl(bdev->bd_inode, &fake_file, cmd, arg); | 320 | ret = disk->fops->locked_ioctl(bdev, mode, cmd, arg); |
304 | unlock_kernel(); | 321 | unlock_kernel(); |
305 | return ret; | 322 | return ret; |
306 | } | 323 | } |