Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

[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>

Al Viro 633a08b8 a0eb62a0

+39 -19
+31
block/ioctl.c
··· 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()
+2 -2
drivers/block/pktcdvd.c
··· 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);
+1 -9
drivers/md/dm-linear.c
··· 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,
+3 -8
drivers/md/dm-mpath.c
··· 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 - 1408 - fake_file.f_path.dentry = &fake_dentry; 1409 1406 1410 1407 spin_lock_irqsave(&m->lock, flags); 1411 1408 ··· 1411 1414 1412 1415 if (m->current_pgpath) { 1413 1416 bdev = m->current_pgpath->path.dev->bdev; 1414 - fake_dentry.d_inode = bdev->bd_inode; 1415 - fake_file.f_mode = m->current_pgpath->path.dev->mode; 1417 + mode = m->current_pgpath->path.dev->mode; 1416 1418 } 1417 1419 1418 1420 if (m->queue_io) ··· 1421 1425 1422 1426 spin_unlock_irqrestore(&m->lock, flags); 1423 1427 1424 - return r ? : blkdev_driver_ioctl(bdev->bd_inode, &fake_file, 1425 - bdev->bd_disk, cmd, arg); 1428 + return r ? : __blkdev_driver_ioctl(bdev, mode, cmd, arg); 1426 1429 } 1427 1430 1428 1431 /*-----------------------------------------------------------------
+2
include/linux/blkdev.h
··· 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