]> git.hungrycats.org Git - linux/commitdiff
[PATCH] forward ioctls on raw devices to underlying devices
authorDave Jones <davej@suse.de>
Fri, 31 May 2002 03:46:15 +0000 (20:46 -0700)
committerLinus Torvalds <torvalds@penguin.transmeta.com>
Fri, 31 May 2002 03:46:15 +0000 (20:46 -0700)
Should allow for things like adjusting readahead on raw devices.

drivers/char/raw.c

index a901f7b1bdbe48547d6127598190c7c01b32fc4e..b1033d13b258615fdffd91ecd538c25821d7d050 100644 (file)
@@ -34,6 +34,7 @@ ssize_t       raw_write(struct file *, const char *, size_t, loff_t *);
 int    raw_open(struct inode *, struct file *);
 int    raw_release(struct inode *, struct file *);
 int    raw_ctl_ioctl(struct inode *, struct file *, unsigned int, unsigned long);
+int    raw_ioctl(struct inode *, struct file *, unsigned int, unsigned long);
 
 
 static struct file_operations raw_fops = {
@@ -41,6 +42,7 @@ static struct file_operations raw_fops = {
        write:          raw_write,
        open:           raw_open,
        release:        raw_release,
+       ioctl:          raw_ioctl,
 };
 
 static struct file_operations raw_ctl_fops = {
@@ -143,6 +145,25 @@ int raw_release(struct inode *inode, struct file *filp)
 
 
 
+/* Forward ioctls to the underlying block device. */ 
+int raw_ioctl(struct inode *inode, 
+                 struct file *flip,
+                 unsigned int command, 
+                 unsigned long arg)
+{
+       int minor = minor(inode->i_rdev), err; 
+       struct block_device *b; 
+       if (minor < 1 && minor > 255)
+               return -ENODEV;
+
+       b = raw_devices[minor].binding;
+       err = -EINVAL; 
+       if (b && b->bd_inode && b->bd_op && b->bd_op->ioctl) { 
+               err = b->bd_op->ioctl(b->bd_inode, NULL, command, arg); 
+       } 
+       return err;
+} 
+
 /*
  * Deal with ioctls against the raw-device control interface, to bind
  * and unbind other raw devices.