Commit 62dce069 authored by Andi Kleen's avatar Andi Kleen Committed by Linus Torvalds

[PATCH] Support compat_ioctl for block devices

Support passing down of compat_ioctl on block devices.  This is needed for
the compat_ioctl conversion of block drivers.
Signed-off-by: default avatarAndi Kleen <ak@muc.de>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent 981d2489
...@@ -3,6 +3,7 @@ ...@@ -3,6 +3,7 @@
#include <linux/blkpg.h> #include <linux/blkpg.h>
#include <linux/backing-dev.h> #include <linux/backing-dev.h>
#include <linux/buffer_head.h> #include <linux/buffer_head.h>
#include <linux/smp_lock.h>
#include <asm/uaccess.h> #include <asm/uaccess.h>
static int blkpg_ioctl(struct block_device *bdev, struct blkpg_ioctl_arg __user *arg) static int blkpg_ioctl(struct block_device *bdev, struct blkpg_ioctl_arg __user *arg)
...@@ -220,3 +221,19 @@ int blkdev_ioctl(struct inode *inode, struct file *file, unsigned cmd, ...@@ -220,3 +221,19 @@ int blkdev_ioctl(struct inode *inode, struct file *file, unsigned cmd,
} }
return -ENOTTY; 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;
}
...@@ -804,6 +804,9 @@ struct file_operations def_blk_fops = { ...@@ -804,6 +804,9 @@ struct file_operations def_blk_fops = {
.mmap = generic_file_mmap, .mmap = generic_file_mmap,
.fsync = block_fsync, .fsync = block_fsync,
.ioctl = block_ioctl, .ioctl = block_ioctl,
#ifdef CONFIG_COMPAT
.compat_ioctl = compat_blkdev_ioctl,
#endif
.readv = generic_file_readv, .readv = generic_file_readv,
.writev = generic_file_write_nolock, .writev = generic_file_write_nolock,
.sendfile = generic_file_sendfile, .sendfile = generic_file_sendfile,
......
...@@ -879,6 +879,7 @@ struct block_device_operations { ...@@ -879,6 +879,7 @@ struct block_device_operations {
int (*open) (struct inode *, struct file *); int (*open) (struct inode *, struct file *);
int (*release) (struct inode *, struct file *); int (*release) (struct inode *, struct file *);
int (*ioctl) (struct inode *, struct file *, unsigned, unsigned long); int (*ioctl) (struct inode *, struct file *, unsigned, unsigned long);
long (*compat_ioctl) (struct file *, unsigned, unsigned long);
int (*media_changed) (struct gendisk *); int (*media_changed) (struct gendisk *);
int (*revalidate_disk) (struct gendisk *); int (*revalidate_disk) (struct gendisk *);
struct module *owner; struct module *owner;
...@@ -1291,6 +1292,7 @@ extern struct file_operations bad_sock_fops; ...@@ -1291,6 +1292,7 @@ extern struct file_operations bad_sock_fops;
extern struct file_operations def_fifo_fops; extern struct file_operations def_fifo_fops;
extern int ioctl_by_bdev(struct block_device *, unsigned, unsigned long); extern int ioctl_by_bdev(struct block_device *, unsigned, unsigned long);
extern int blkdev_ioctl(struct inode *, struct file *, 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_get(struct block_device *, mode_t, unsigned);
extern int blkdev_put(struct block_device *); extern int blkdev_put(struct block_device *);
extern int bd_claim(struct block_device *, void *); extern int bd_claim(struct block_device *, void *);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment