You've already forked linux-apfs
mirror of
https://github.com/linux-apfs/linux-apfs.git
synced 2026-05-01 15:00:59 -07:00
dm: refactor ioctl handling
This moves the call to blkdev_ioctl and the argument checking to DM core code, and only leaves a callout to find the block device to operate on in the targets. This simplifies the code and allows us to pass through ioctl-like command using other methods in the next patch. Also split out a helper around calling the prepare_ioctl method that will be reused for persistent reservation handling. Signed-off-by: Christoph Hellwig <hch@lst.de> Signed-off-by: Mike Snitzer <snitzer@redhat.com>
This commit is contained in:
committed by
Mike Snitzer
parent
47796938c4
commit
e56f81e0b0
+9
-12
@@ -511,27 +511,24 @@ static void switch_status(struct dm_target *ti, status_type_t type,
|
||||
*
|
||||
* Passthrough all ioctls to the path for sector 0
|
||||
*/
|
||||
static int switch_ioctl(struct dm_target *ti, unsigned cmd,
|
||||
unsigned long arg)
|
||||
static int switch_prepare_ioctl(struct dm_target *ti,
|
||||
struct block_device **bdev, fmode_t *mode)
|
||||
{
|
||||
struct switch_ctx *sctx = ti->private;
|
||||
struct block_device *bdev;
|
||||
fmode_t mode;
|
||||
unsigned path_nr;
|
||||
int r = 0;
|
||||
|
||||
path_nr = switch_get_path_nr(sctx, 0);
|
||||
|
||||
bdev = sctx->path_list[path_nr].dmdev->bdev;
|
||||
mode = sctx->path_list[path_nr].dmdev->mode;
|
||||
*bdev = sctx->path_list[path_nr].dmdev->bdev;
|
||||
*mode = sctx->path_list[path_nr].dmdev->mode;
|
||||
|
||||
/*
|
||||
* Only pass ioctls through if the device sizes match exactly.
|
||||
*/
|
||||
if (ti->len + sctx->path_list[path_nr].start != i_size_read(bdev->bd_inode) >> SECTOR_SHIFT)
|
||||
r = scsi_verify_blk_ioctl(NULL, cmd);
|
||||
|
||||
return r ? : __blkdev_driver_ioctl(bdev, mode, cmd, arg);
|
||||
if (ti->len + sctx->path_list[path_nr].start !=
|
||||
i_size_read((*bdev)->bd_inode) >> SECTOR_SHIFT)
|
||||
return 1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int switch_iterate_devices(struct dm_target *ti,
|
||||
@@ -560,7 +557,7 @@ static struct target_type switch_target = {
|
||||
.map = switch_map,
|
||||
.message = switch_message,
|
||||
.status = switch_status,
|
||||
.ioctl = switch_ioctl,
|
||||
.prepare_ioctl = switch_prepare_ioctl,
|
||||
.iterate_devices = switch_iterate_devices,
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user