aboutsummaryrefslogtreecommitdiffstats
path: root/block/ioctl.c
diff options
context:
space:
mode:
Diffstat (limited to 'block/ioctl.c')
-rw-r--r--block/ioctl.c35
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}
284EXPORT_SYMBOL_GPL(blkdev_driver_ioctl); 291EXPORT_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 }