Commit 633a08b81206122469365b4c72eaeb71f04f2cb4

Authored by Al Viro
1 parent a0eb62a0a4

[PATCH] introduce __blkdev_driver_ioctl()

Analog of blkdev_driver_ioctl() with sane arguments.  For
now uses fake struct file, by the end of the series it won't
and blkdev_driver_ioctl() will become a wrapper around it.

Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>

Showing 5 changed files with 39 additions and 19 deletions Side-by-side Diff

... ... @@ -283,6 +283,37 @@
283 283 }
284 284 EXPORT_SYMBOL_GPL(blkdev_driver_ioctl);
285 285  
  286 +int __blkdev_driver_ioctl(struct block_device *bdev, fmode_t mode,
  287 + unsigned cmd, unsigned long arg)
  288 +{
  289 + struct gendisk *disk = bdev->bd_disk;
  290 + int ret;
  291 + /* you bet it'll go away by the end of patch series */
  292 + struct file fake_file = {};
  293 + struct dentry fake_dentry = {};
  294 + fake_file.f_mode = mode;
  295 + fake_file.f_path.dentry = &fake_dentry;
  296 + fake_dentry.d_inode = bdev->bd_inode;
  297 +
  298 + if (disk->fops->unlocked_ioctl)
  299 + return disk->fops->unlocked_ioctl(&fake_file, cmd, arg);
  300 +
  301 + if (disk->fops->ioctl) {
  302 + lock_kernel();
  303 + ret = disk->fops->ioctl(bdev->bd_inode, &fake_file, cmd, arg);
  304 + unlock_kernel();
  305 + return ret;
  306 + }
  307 +
  308 + return -ENOTTY;
  309 +}
  310 +/*
  311 + * For the record: _GPL here is only because somebody decided to slap it
  312 + * on the previous export. Sheer idiocy, since it wasn't copyrightable
  313 + * at all and could be open-coded without any exports by anybody who cares.
  314 + */
  315 +EXPORT_SYMBOL_GPL(__blkdev_driver_ioctl);
  316 +
286 317 /*
287 318 * always keep this in sync with compat_blkdev_ioctl() and
288 319 * compat_blkdev_locked_ioctl()
drivers/block/pktcdvd.c
... ... @@ -2819,8 +2819,8 @@
2819 2819 case CDROM_LAST_WRITTEN:
2820 2820 case CDROM_SEND_PACKET:
2821 2821 case SCSI_IOCTL_SEND_COMMAND:
2822   - return blkdev_driver_ioctl(pd->bdev->bd_inode, pd->bdev->bd_disk,
2823   - file, cmd, arg);
  2822 + return __blkdev_driver_ioctl(pd->bdev, file ? file->f_mode : 0,
  2823 + cmd, arg);
2824 2824  
2825 2825 default:
2826 2826 VPRINTK(DRIVER_NAME": Unknown ioctl for %s (%x)\n", pd->name, cmd);
drivers/md/dm-linear.c
... ... @@ -114,15 +114,7 @@
114 114 unsigned long arg)
115 115 {
116 116 struct linear_c *lc = (struct linear_c *) ti->private;
117   - struct block_device *bdev = lc->dev->bdev;
118   - struct file fake_file = {};
119   - struct dentry fake_dentry = {};
120   -
121   - fake_file.f_mode = lc->dev->mode;
122   - fake_file.f_path.dentry = &fake_dentry;
123   - fake_dentry.d_inode = bdev->bd_inode;
124   -
125   - return blkdev_driver_ioctl(bdev->bd_inode, &fake_file, bdev->bd_disk, cmd, arg);
  117 + return __blkdev_driver_ioctl(lc->dev->bdev, lc->dev->mode, cmd, arg);
126 118 }
127 119  
128 120 static int linear_merge(struct dm_target *ti, struct bvec_merge_data *bvm,
drivers/md/dm-mpath.c
... ... @@ -1400,13 +1400,10 @@
1400 1400 {
1401 1401 struct multipath *m = (struct multipath *) ti->private;
1402 1402 struct block_device *bdev = NULL;
  1403 + fmode_t mode = 0;
1403 1404 unsigned long flags;
1404   - struct file fake_file = {};
1405   - struct dentry fake_dentry = {};
1406 1405 int r = 0;
1407 1406  
1408   - fake_file.f_path.dentry = &fake_dentry;
1409   -
1410 1407 spin_lock_irqsave(&m->lock, flags);
1411 1408  
1412 1409 if (!m->current_pgpath)
... ... @@ -1414,8 +1411,7 @@
1414 1411  
1415 1412 if (m->current_pgpath) {
1416 1413 bdev = m->current_pgpath->path.dev->bdev;
1417   - fake_dentry.d_inode = bdev->bd_inode;
1418   - fake_file.f_mode = m->current_pgpath->path.dev->mode;
  1414 + mode = m->current_pgpath->path.dev->mode;
1419 1415 }
1420 1416  
1421 1417 if (m->queue_io)
... ... @@ -1425,8 +1421,7 @@
1425 1421  
1426 1422 spin_unlock_irqrestore(&m->lock, flags);
1427 1423  
1428   - return r ? : blkdev_driver_ioctl(bdev->bd_inode, &fake_file,
1429   - bdev->bd_disk, cmd, arg);
  1424 + return r ? : __blkdev_driver_ioctl(bdev, mode, cmd, arg);
1430 1425 }
1431 1426  
1432 1427 /*-----------------------------------------------------------------
include/linux/blkdev.h
... ... @@ -1074,6 +1074,8 @@
1074 1074 struct module *owner;
1075 1075 };
1076 1076  
  1077 +extern int __blkdev_driver_ioctl(struct block_device *, fmode_t, unsigned int,
  1078 + unsigned long);
1077 1079 #else /* CONFIG_BLOCK */
1078 1080 /*
1079 1081 * stubs for when the block layer is configured out