From: Andi Kleen Support passing down of compat_ioctl on block devices. This is needed for the compat_ioctl conversion of block drivers. Signed-off-by: Andi Kleen Signed-off-by: Andrew Morton --- 25-akpm/drivers/block/ioctl.c | 17 +++++++++++++++++ 25-akpm/fs/block_dev.c | 3 +++ 25-akpm/include/linux/fs.h | 2 ++ 3 files changed, 22 insertions(+) diff -puN drivers/block/ioctl.c~support-compat_ioctl-for-block-devices drivers/block/ioctl.c --- 25/drivers/block/ioctl.c~support-compat_ioctl-for-block-devices Tue Jan 18 15:40:21 2005 +++ 25-akpm/drivers/block/ioctl.c Tue Jan 18 15:40:21 2005 @@ -3,6 +3,7 @@ #include #include #include +#include #include static int blkpg_ioctl(struct block_device *bdev, struct blkpg_ioctl_arg __user *arg) @@ -220,3 +221,19 @@ int blkdev_ioctl(struct inode *inode, st } return -ENOTTY; } + +/* Most of the generic ioctls are handled in the normal fallback path. + This assumes the blkdev's low level compat_ioctl always returns + ENOIOCTLCMD for unknown ioctls. */ +long compat_blkdev_ioctl(struct file *file, unsigned cmd, unsigned long arg) +{ + struct block_device *bdev = file->f_dentry->d_inode->i_bdev; + struct gendisk *disk = bdev->bd_disk; + int ret = -ENOIOCTLCMD; + if (disk->fops->compat_ioctl) { + lock_kernel(); + ret = disk->fops->compat_ioctl(file, cmd, arg); + unlock_kernel(); + } + return ret; +} diff -puN fs/block_dev.c~support-compat_ioctl-for-block-devices fs/block_dev.c --- 25/fs/block_dev.c~support-compat_ioctl-for-block-devices Tue Jan 18 15:40:21 2005 +++ 25-akpm/fs/block_dev.c Tue Jan 18 15:40:21 2005 @@ -804,6 +804,9 @@ struct file_operations def_blk_fops = { .mmap = generic_file_mmap, .fsync = block_fsync, .ioctl = block_ioctl, +#ifdef CONFIG_COMPAT + .compat_ioctl = compat_blkdev_ioctl, +#endif .readv = generic_file_readv, .writev = generic_file_write_nolock, .sendfile = generic_file_sendfile, diff -puN include/linux/fs.h~support-compat_ioctl-for-block-devices include/linux/fs.h --- 25/include/linux/fs.h~support-compat_ioctl-for-block-devices Tue Jan 18 15:40:21 2005 +++ 25-akpm/include/linux/fs.h Tue Jan 18 15:40:21 2005 @@ -879,6 +879,7 @@ struct block_device_operations { int (*open) (struct inode *, struct file *); int (*release) (struct inode *, struct file *); int (*ioctl) (struct inode *, struct file *, unsigned, unsigned long); + long (*compat_ioctl) (struct file *, unsigned, unsigned long); int (*media_changed) (struct gendisk *); int (*revalidate_disk) (struct gendisk *); struct module *owner; @@ -1295,6 +1296,7 @@ extern struct file_operations bad_sock_f extern struct file_operations def_fifo_fops; extern int ioctl_by_bdev(struct block_device *, unsigned, unsigned long); extern int blkdev_ioctl(struct inode *, struct file *, unsigned, unsigned long); +extern long compat_blkdev_ioctl(struct file *, unsigned, unsigned long); extern int blkdev_get(struct block_device *, mode_t, unsigned); extern int blkdev_put(struct block_device *); extern int bd_claim(struct block_device *, void *); _