lkml.org 
[lkml]   [2011]   [Dec]   [22]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 3/3] dm: do not forward ioctls from logical volumes to the underlying device
    Date
    A logical volume can map to just part of underlying physical volume.
    In this case, it must be treated like a partition.

    Based on a patch from Alasdair G Kergon.

    Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
    ---
    drivers/md/dm-flakey.c | 11 ++++++++++-
    drivers/md/dm-linear.c | 12 +++++++++++-
    drivers/md/dm-mpath.c | 6 ++++++
    3 files changed, 27 insertions(+), 2 deletions(-)

    diff --git a/drivers/md/dm-flakey.c b/drivers/md/dm-flakey.c
    index f84c080..9fb18c1 100644
    --- a/drivers/md/dm-flakey.c
    +++ b/drivers/md/dm-flakey.c
    @@ -368,8 +368,17 @@ static int flakey_status(struct dm_target *ti, status_type_t type,
    static int flakey_ioctl(struct dm_target *ti, unsigned int cmd, unsigned long arg)
    {
    struct flakey_c *fc = ti->private;
    + struct dm_dev *dev = fc->dev;
    + int r = 0;

    - return __blkdev_driver_ioctl(fc->dev->bdev, fc->dev->mode, cmd, arg);
    + /*
    + * Only pass ioctls through if the device sizes match exactly.
    + */
    + if (fc->start ||
    + ti->len != i_size_read(dev->bdev->bd_inode) >> SECTOR_SHIFT)
    + r = scsi_verify_blk_ioctl(NULL, cmd);
    +
    + return r ? : __blkdev_driver_ioctl(dev->bdev, dev->mode, cmd, arg);
    }

    static int flakey_merge(struct dm_target *ti, struct bvec_merge_data *bvm,
    diff --git a/drivers/md/dm-linear.c b/drivers/md/dm-linear.c
    index 3921e3b..9728839 100644
    --- a/drivers/md/dm-linear.c
    +++ b/drivers/md/dm-linear.c
    @@ -116,7 +116,17 @@ static int linear_ioctl(struct dm_target *ti, unsigned int cmd,
    unsigned long arg)
    {
    struct linear_c *lc = (struct linear_c *) ti->private;
    - return __blkdev_driver_ioctl(lc->dev->bdev, lc->dev->mode, cmd, arg);
    + struct dm_dev *dev = lc->dev;
    + int r = 0;
    +
    + /*
    + * Only pass ioctls through if the device sizes match exactly.
    + */
    + if (lc->start ||
    + ti->len != i_size_read(dev->bdev->bd_inode) >> SECTOR_SHIFT)
    + r = scsi_verify_blk_ioctl(NULL, cmd);
    +
    + return r ? : __blkdev_driver_ioctl(dev->bdev, dev->mode, cmd, arg);
    }

    static int linear_merge(struct dm_target *ti, struct bvec_merge_data *bvm,
    diff --git a/drivers/md/dm-mpath.c b/drivers/md/dm-mpath.c
    index 8ab377f..2bfbdb9 100644
    --- a/drivers/md/dm-mpath.c
    +++ b/drivers/md/dm-mpath.c
    @@ -1521,6 +1521,12 @@ static int multipath_ioctl(struct dm_target *ti, unsigned int cmd,

    spin_unlock_irqrestore(&m->lock, flags);

    + /*
    + * Only pass ioctls through if the device sizes match exactly.
    + */
    + if (!r && ti->len != i_size_read(bdev->bd_inode) >> SECTOR_SHIFT)
    + r = scsi_verify_blk_ioctl(NULL, cmd);
    +
    return r ? : __blkdev_driver_ioctl(bdev, mode, cmd, arg);
    }

    --
    1.7.7.1

    \
     
     \ /
      Last update: 2011-12-22 19:05    [W:0.021 / U:150.324 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site