Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 117502
b: refs/heads/master
c: 633a08b
h: refs/heads/master
v: v3
  • Loading branch information
Al Viro committed Oct 21, 2008
1 parent 91d7729 commit ac473b8
Show file tree
Hide file tree
Showing 6 changed files with 40 additions and 20 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: a0eb62a0a4470fef5a5f41e7f1442fdd667220ef
refs/heads/master: 633a08b81206122469365b4c72eaeb71f04f2cb4
31 changes: 31 additions & 0 deletions trunk/block/ioctl.c
Original file line number Diff line number Diff line change
Expand Up @@ -283,6 +283,37 @@ int blkdev_driver_ioctl(struct inode *inode, struct file *file,
}
EXPORT_SYMBOL_GPL(blkdev_driver_ioctl);

int __blkdev_driver_ioctl(struct block_device *bdev, fmode_t mode,
unsigned cmd, unsigned long arg)
{
struct gendisk *disk = bdev->bd_disk;
int ret;
/* you bet it'll go away by the end of patch series */
struct file fake_file = {};
struct dentry fake_dentry = {};
fake_file.f_mode = mode;
fake_file.f_path.dentry = &fake_dentry;
fake_dentry.d_inode = bdev->bd_inode;

if (disk->fops->unlocked_ioctl)
return disk->fops->unlocked_ioctl(&fake_file, cmd, arg);

if (disk->fops->ioctl) {
lock_kernel();
ret = disk->fops->ioctl(bdev->bd_inode, &fake_file, cmd, arg);
unlock_kernel();
return ret;
}

return -ENOTTY;
}
/*
* For the record: _GPL here is only because somebody decided to slap it
* on the previous export. Sheer idiocy, since it wasn't copyrightable
* at all and could be open-coded without any exports by anybody who cares.
*/
EXPORT_SYMBOL_GPL(__blkdev_driver_ioctl);

/*
* always keep this in sync with compat_blkdev_ioctl() and
* compat_blkdev_locked_ioctl()
Expand Down
4 changes: 2 additions & 2 deletions trunk/drivers/block/pktcdvd.c
Original file line number Diff line number Diff line change
Expand Up @@ -2819,8 +2819,8 @@ static int pkt_ioctl(struct inode *inode, struct file *file, unsigned int cmd, u
case CDROM_LAST_WRITTEN:
case CDROM_SEND_PACKET:
case SCSI_IOCTL_SEND_COMMAND:
return blkdev_driver_ioctl(pd->bdev->bd_inode, pd->bdev->bd_disk,
file, cmd, arg);
return __blkdev_driver_ioctl(pd->bdev, file ? file->f_mode : 0,
cmd, arg);

default:
VPRINTK(DRIVER_NAME": Unknown ioctl for %s (%x)\n", pd->name, cmd);
Expand Down
10 changes: 1 addition & 9 deletions trunk/drivers/md/dm-linear.c
Original file line number Diff line number Diff line change
Expand Up @@ -114,15 +114,7 @@ static int linear_ioctl(struct dm_target *ti, unsigned int cmd,
unsigned long arg)
{
struct linear_c *lc = (struct linear_c *) ti->private;
struct block_device *bdev = lc->dev->bdev;
struct file fake_file = {};
struct dentry fake_dentry = {};

fake_file.f_mode = lc->dev->mode;
fake_file.f_path.dentry = &fake_dentry;
fake_dentry.d_inode = bdev->bd_inode;

return blkdev_driver_ioctl(bdev->bd_inode, &fake_file, bdev->bd_disk, cmd, arg);
return __blkdev_driver_ioctl(lc->dev->bdev, lc->dev->mode, cmd, arg);
}

static int linear_merge(struct dm_target *ti, struct bvec_merge_data *bvm,
Expand Down
11 changes: 3 additions & 8 deletions trunk/drivers/md/dm-mpath.c
Original file line number Diff line number Diff line change
Expand Up @@ -1400,22 +1400,18 @@ static int multipath_ioctl(struct dm_target *ti, unsigned int cmd,
{
struct multipath *m = (struct multipath *) ti->private;
struct block_device *bdev = NULL;
fmode_t mode = 0;
unsigned long flags;
struct file fake_file = {};
struct dentry fake_dentry = {};
int r = 0;

fake_file.f_path.dentry = &fake_dentry;

spin_lock_irqsave(&m->lock, flags);

if (!m->current_pgpath)
__choose_pgpath(m);

if (m->current_pgpath) {
bdev = m->current_pgpath->path.dev->bdev;
fake_dentry.d_inode = bdev->bd_inode;
fake_file.f_mode = m->current_pgpath->path.dev->mode;
mode = m->current_pgpath->path.dev->mode;
}

if (m->queue_io)
Expand All @@ -1425,8 +1421,7 @@ static int multipath_ioctl(struct dm_target *ti, unsigned int cmd,

spin_unlock_irqrestore(&m->lock, flags);

return r ? : blkdev_driver_ioctl(bdev->bd_inode, &fake_file,
bdev->bd_disk, cmd, arg);
return r ? : __blkdev_driver_ioctl(bdev, mode, cmd, arg);
}

/*-----------------------------------------------------------------
Expand Down
2 changes: 2 additions & 0 deletions trunk/include/linux/blkdev.h
Original file line number Diff line number Diff line change
Expand Up @@ -1074,6 +1074,8 @@ struct block_device_operations {
struct module *owner;
};

extern int __blkdev_driver_ioctl(struct block_device *, fmode_t, unsigned int,
unsigned long);
#else /* CONFIG_BLOCK */
/*
* stubs for when the block layer is configured out
Expand Down

0 comments on commit ac473b8

Please sign in to comment.